Tutoriel : Créer vos premiers graphiques dans le langage de requête Kusto

Changer de service à l’aide de la liste déroulante Version . En savoir plus sur la navigation.
S’applique à : ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

La sémantique de graphe dans Kusto vous permet de modéliser et d’interroger des données en tant que réseaux interconnectés, ce qui vous permet d’analyser des relations complexes telles que des hiérarchies organisationnelles, des réseaux sociaux et des chemins d’attaque. Contrairement aux requêtes relationnelles traditionnelles qui s’appuient sur des jointures, les graphiques utilisent des relations directes entre les entités pour parcourir les connexions efficacement.

Dans ce tutoriel, vous allez apprendre à :

Si vous n’avez pas de cluster Azure Data Explorer, créez un cluster gratuit avant de commencer le didacticiel.

Conditions préalables

  • Un compte Microsoft ou une identité d’utilisateur Microsoft Entra pour vous connecter au cluster d’aide

Accéder à votre environnement de requête

Ouvrez l’interface utilisateur web Azure Data Explorer pour accéder au cluster d’aide pour ce didacticiel.

Accédez à votre espace de travail Microsoft Fabric et ouvrez une base de données KQL pour exécuter les requêtes.

Accédez à la page de repérage avancée pour commencer à interroger les données Microsoft Sentinel.

Accédez aux journaux ou à un espace de travail Logs Analytics dans le portail Azure pour commencer à interroger les données Azure Monitor.

Créer un graphique temporaire avec des données organisationnelles

Dans cette section, vous allez créer votre premier graphique à l’aide d’exemples de données organisationnelles. Les graphiques temporaires sont créés dynamiquement pendant l’exécution de la requête à l’aide de l’opérateur make-graph , ce qui les rend parfaits pour l’analyse et l’exploration ad hoc.

Vous allez travailler avec une structure d’entreprise simple où les employés communiquent aux responsables. Cette hiérarchie organisationnelle fournit un exemple intuitif pour comprendre les relations de graphique :

Diagramme montrant la hiérarchie de l’organisation.

Créez la structure de l'organigramme à l’aide des données des employés et des relations hiérarchiques.

// Create sample employee data
let employees = datatable(name:string, role:string, age:long) 
[ 
  "Alice", "CEO", 45,  
  "Bob", "Engineering Manager", 35,  
  "Carol", "Marketing Manager", 38,  
  "Dave", "Developer", 28,  
  "Eve", "Developer", 26,
  "Frank", "Marketing Specialist", 30
]; 
// Create reporting relationships
let reports = datatable(employee:string, manager:string) 
[ 
  "Bob", "Alice",  
  "Carol", "Alice",  
  "Dave", "Bob",
  "Eve", "Bob",
  "Frank", "Carol"
]; 
// Build the graph and explore it
reports 
| make-graph employee --> manager with employees on name 
| graph-to-table nodes 

Sortie

nom rôle âge
Alice PDG 45
Pendiller Responsable de l’ingénierie 35
Carole Directeur du marketing 38
Dave Développeur 28
Veille Développeur 26
Franc Spécialiste du marketing 30

Interroger des relations avec des modèles de correspondance de graphe

Vous allez maintenant apprendre à utiliser l’opérateur graph-match pour rechercher des modèles spécifiques dans votre graphe organisationnel. L’opérateur graph-match recherche des relations et des connexions dans la structure de graphe.

Tout d’abord, recherchez tous les employés qui rapportent directement à Alice en correspondant au schéma de relation de subordination immédiate :

let employees = datatable(name:string, role:string, age:long) 
[ 
  "Alice", "CEO", 45,  
  "Bob", "Engineering Manager", 35,  
  "Carol", "Marketing Manager", 38,  
  "Dave", "Developer", 28,  
  "Eve", "Developer", 26,
  "Frank", "Marketing Specialist", 30
]; 
let reports = datatable(employee:string, manager:string) 
[ 
  "Bob", "Alice",  
  "Carol", "Alice",  
  "Dave", "Bob",
  "Eve", "Bob",
  "Frank", "Carol"
]; 
reports 
| make-graph employee --> manager with employees on name 
| graph-match (alice)<-[reports]-(employee)
  where alice.name == "Alice"  
  project employee = employee.name, role = employee.role, age = employee.age

Résultats des rapports directs

employé rôle âge
Pendiller Responsable de l’ingénierie 35
Carole Directeur du marketing 38

Ensuite, recherchez tous les employés dans l’ensemble de l’organisation d’Alice, y compris les rapports indirects, en utilisant des arêtes de longueur variable avec *1..3 pour parcourir plusieurs niveaux de la hiérarchie :

let employees = datatable(name:string, role:string, age:long) 
[ 
  "Alice", "CEO", 45,  
  "Bob", "Engineering Manager", 35,  
  "Carol", "Marketing Manager", 38,  
  "Dave", "Developer", 28,  
  "Eve", "Developer", 26,
  "Frank", "Marketing Specialist", 30
]; 
let reports = datatable(employee:string, manager:string) 
[ 
  "Bob", "Alice",  
  "Carol", "Alice",  
  "Dave", "Bob",
  "Eve", "Bob",
  "Frank", "Carol"
]; 
reports 
| make-graph employee --> manager with employees on name 
| graph-match (alice)<-[reports*1..3]-(employee)
  where alice.name == "Alice"
  project employee = employee.name, role = employee.role, reportingLevels = array_length(reports)

Sortie de tous les membres de l'organisation

employé rôle niveaux de rapport
Pendiller Responsable de l’ingénierie 1
Carole Directeur du marketing 1
Dave Développeur 2
Veille Développeur 2
Franc Spécialiste du marketing 2

Créer un modèle de graphe persistant

Remarque

Cette fonctionnalité est actuellement disponible en préversion publique. Les fonctionnalités et la syntaxe sont susceptibles de changer avant la disponibilité générale.

Les graphiques persistants sont stockés dans la base de données et peuvent être interrogés à plusieurs reprises sans regénérer la structure du graphique. Vous allez maintenant créer la même structure organisationnelle qu’un graphique persistant pour améliorer les performances et la réutilisation.

Créez des fonctions qui retournent vos exemples de données, puis définissez une structure de modèle de graphe :

// Create a function that returns employee data
.create function Employees() {
    datatable(name: string, role: string, age: long)
    [
        "Alice", "CEO", 45,
        "Bob", "Engineering Manager", 35,
        "Carol", "Marketing Manager", 38,
        "Dave", "Developer", 28,
        "Eve", "Developer", 26,
        "Frank", "Marketing Specialist", 30
    ]
}

// Create a function that returns reporting relationships
.create function Reports() {
    datatable(employee: string, manager: string)
    [
        "Bob", "Alice",
        "Carol", "Alice",
        "Dave", "Bob",
        "Eve", "Bob",
        "Frank", "Carol"
    ]
}

Définissez le modèle de graphique avec des schémas de nœud et de périphérie :

.create-or-alter graph_model OrganizationGraph ```
{
    "Schema": {
        "Nodes": {
            "Employee": {
                "name": "string",
                "role": "string",
                "age": "long"
            }
        },
        "Edges": {
            "ReportsTo": {
            }
        }
    },
    "Definition": {
        "Steps": [
            {
                "Kind": "AddNodes",
                "Query": "Employees()",
                "NodeIdColumn": "name",
                "Labels": ["Employee"]
            },
            {
                "Kind": "AddEdges",
                "Query": "Reports()",
                "SourceColumn": "employee",
                "TargetColumn": "manager",
                "Labels": ["ReportsTo"]
            }
        ]
    }
}
```

Créez un instantané de graphe pour matérialiser le modèle dans une structure interrogeable :

.make graph_snapshot OrganizationGraph_v1 from OrganizationGraph

Interroger votre graphe persistant

Interrogez le graphique persistant à l’aide des mêmes modèles que les graphiques temporaires. Recherchez tous les employés qui signalent à Alice :

graph("OrganizationGraph")
| graph-match (alice)<-[reports]-(employee)
  where alice.name == "Alice"
  project employee = employee.name, role = employee.role, age = employee.age

Recherchez tous les employés dans l’organisation d’Alice, y compris les rapports indirects :

graph("OrganizationGraph")
| graph-match (alice)<-[reports*1..3]-(employee)
  where alice.name == "Alice"
  project employee = employee.name, role = employee.role, reportingLevels = array_length(reports)

Interrogez une version spécifique de snapshot si besoin.

graph("OrganizationGraph", "OrganizationGraph_v1")
| graph-match (alice)<-[reports*1..3]-(employee)
  where alice.name == "Alice"
  project employee = employee.name, role = employee.role

Comparer les graphiques temporaires et persistants

Comprendre quand utiliser chaque approche vous aide à choisir la méthode appropriée pour vos besoins d’analyse :

Aspect Graphiques temporaires Graphiques persistants
Création make-graph opérateur lors de l'exécution de la requête .create-or-alter graph_model + .make graph_snapshot
Stockage En mémoire pendant l’exécution de la requête Stocké dans la base de données
Réutilisabilité Doit reconstruire pour chaque requête Interroger à plusieurs reprises sans reconstruire
Niveau de performance Bon pour les jeux de données plus petits Optimisé pour les graphiques volumineux et complexes
Cas d’utilisation Analyse ad hoc, exploration Analyse de production, requêtes répétées
Limites de mémoire Limité par mémoire de nœud Peut gérer des jeux de données plus volumineux

Nettoyer les ressources

Si vous ne souhaitez pas continuer à utiliser les modèles de graphe persistants, supprimez-les avec les commandes suivantes :

  1. Supprimez le modèle de graphique :

    .drop graph_model OrganizationGraph
    
  2. Supprimez les fonctions d’assistance :

    .drop function Employees
    .drop function Reports
    

Les graphiques temporaires sont automatiquement nettoyés une fois la requête terminée. Par conséquent, aucun nettoyage supplémentaire n’est nécessaire pour ces exemples.

Étapes suivantes

Maintenant que vous comprenez les bases de la sémantique de graphe dans Kusto, passez aux scénarios et optimisations plus complexes :

Vous pouvez également explorer ces articles connexes :