Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
L’opérateur graph-match recherche toutes les occurrences d’un modèle de graphe dans une source de graphe d’entrée.
Syntaxe
G|graph-match [cycles=CyclesOption] Pattern [whereConstraints] project [ColumnName=] Expression [, ...]
Paramètres
| Nom | Catégorie | Obligatoire | Descriptif |
|---|---|---|---|
| G | string |
✔️ | Source du graphique d’entrée. |
| modèle | string |
✔️ | Une ou plusieurs séquences délimitées par des virgules d’éléments de nœud de graphe connectées par des éléments de bord de graphe utilisant des notations de graphe. Consultez notation de modèle Graph. |
| contraintes | string |
Expression booléenne composée de propriétés de variables nommées dans l'Pattern. Chaque élément de graphe (nœud/bord) a un ensemble de propriétés qui lui ont été attachées pendant la construction du graphique. Les contraintes définissent quels éléments (nœuds et arêtes) sont mis en correspondance par le modèle. Une propriété est référencée par le nom de la variable suivi d’un point (.) et du nom de la propriété. |
|
| expression | string |
✔️ | La clause project convertit chaque modèle en ligne dans un résultat tabulaire. Les expressions de projet doivent être scalaires et des propriétés de référence de variables nommées définies dans l'Pattern. Une propriété est référencée par le nom de la variable suivi d’un point (.) et du nom de l’attribut. |
| CyclesOption | string |
Contrôle si les cycles sont mis en correspondance dans le modèle de , valeurs autorisées : all, none, unique_edges. Si all est spécifié, tous les cycles sont mis en correspondance, si none est spécifié ne sont pas mis en correspondance, si unique_edges (valeur par défaut) est spécifiée, les cycles sont mis en correspondance, mais uniquement si les cycles n’incluent pas le même bord plusieurs fois. |
Notation de modèle de graphe
Le tableau suivant montre la notation de graphique prise en charge :
| Élément | Variable nommée | Anonyme |
|---|---|---|
| Noeud |
(
n) |
() |
| Bord dirigé : gauche à droite |
-[
e]-> |
--> |
| Bord dirigé : droite à gauche |
<-[
e]- |
<-- |
| N’importe quel bord de direction |
-[
e]- |
-- |
| Arête de longueur variable |
-[
e*3..5]- |
-[*3..5]- |
Arête de longueur variable
Un bord de longueur variable permet de répéter plusieurs fois un modèle spécifique dans les limites définies. Ce type de bord est indiqué par un astérisque (*), suivi des valeurs d’occurrence minimale et maximale au format min..max. Les valeurs minimales et maximales doivent être entier scalaires. Toute séquence d’arêtes comprises dans cette plage d’occurrences peut correspondre au bord variable du modèle, si tous les bords de la séquence répondent aux contraintes décrites dans la clause where.
Séquences multiples
Plusieurs séquences délimitées par des virgules sont utilisées pour exprimer des modèles non linéaires. Pour décrire la connexion entre différentes séquences, elles doivent partager un ou plusieurs noms de variable d’un nœud. Par exemple, pour représenter un modèle en étoile avec le nœud n au centre connecté aux nœuds un,b,cet d, le modèle suivant peut être utilisé :
(
un)--(n)--(b),(c)--(n)--(d)
Seuls les modèles de composants connectés uniques sont pris en charge.
Retourne
L’opérateur graph-match retourne un résultat tabulaire, où chaque enregistrement correspond à une correspondance du modèle dans le graphique.
Les colonnes retournées sont définies dans la clause project de l’opérateur à l’aide des propriétés des arêtes et/ou des nœuds définis dans le modèle. Les propriétés et les fonctions des propriétés des arêtes de longueur variable sont retournées sous la forme d’un tableau dynamique, chaque valeur du tableau correspond à une occurrence du bord de longueur variable.
Exemples
L’exemple suivant représente une hiérarchie organisationnelle. Il montre comment un arête de longueur variable peut être utilisé pour rechercher des employés de différents niveaux de la hiérarchie dans une requête unique. Les nœuds du graphique représentent les employés et les arêtes sont d’un employé à son responsable. Après avoir créé le graphique à l’aide de make-graph, nous recherchons des employés dans Alice'organisation plus jeune que 30.
Exécuter le de requête
let employees = datatable(name:string, age:long)
[
"Alice", 32,
"Bob", 31,
"Eve", 27,
"Joe", 29,
"Chris", 45,
"Alex", 35,
"Ben", 23,
"Richard", 39,
];
let reports = datatable(employee:string, manager:string)
[
"Bob", "Alice",
"Chris", "Alice",
"Eve", "Bob",
"Ben", "Chris",
"Joe", "Alice",
"Richard", "Bob"
];
reports
| make-graph employee --> manager with employees on name
| graph-match (alice)<-[reports*1..5]-(employee)
where alice.name == "Alice" and employee.age < 30
project employee = employee.name, age = employee.age, reportingPath = map(reports, manager)
de sortie
| employé | âge | reportingPath |
|---|---|---|
| Joe | 29 | [ « Alice » ] |
| Veille | 27 | [ « Alice », « Bob » ] |
| Benoît | 23 | [ « Alice », « Chris » ] |
L’exemple suivant génère un graphique à partir des tables Actions et Entities. Les entités sont des personnes et des systèmes, et les actions décrivent différentes relations entre les entités. Après l’opérateur make-graph qui génère le graphique est un appel à graph-match avec un modèle de graphique qui recherche les chemins d’attaque vers le système "Apollo".
Exécuter le de requête
let Entities = datatable(name:string, type:string, age:long)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Apollo", "System", 99
];
let Actions = datatable(source:string, destination:string, action_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Apollo", "trusts",
"Bob", "Apollo", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
Actions
| make-graph source --> destination with Entities on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo)
where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission"
project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name
de sortie
| Attaquant | Compromis | Système |
|---|---|---|
| Mallory | Pendiller | Apollon |
L’exemple suivant est similaire à l’exemple de chemin d’accès d’attaque précédent, mais avec une contrainte supplémentaire : nous voulons que l’entité compromise communique également avec Alice. Le préfixe de modèle graph-match est identique à l’exemple précédent et nous ajoutons une autre séquence avec le compromis comme lien entre les séquences.
Exécuter le de requête
let Entities = datatable(name:string, type:string, age:long)
[
"Alice", "Person", 23,
"Bob", "Person", 31,
"Eve", "Person", 17,
"Mallory", "Person", 29,
"Apollo", "System", 99
];
let Actions = datatable(source:string, destination:string, action_type:string)
[
"Alice", "Bob", "communicatesWith",
"Alice", "Apollo", "trusts",
"Bob", "Apollo", "hasPermission",
"Eve", "Alice", "attacks",
"Mallory", "Alice", "attacks",
"Mallory", "Bob", "attacks"
];
Actions
| make-graph source --> destination with Entities on name
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo), (compromised)-[communicates]-(alice)
where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission" and alice.name == "Alice"
project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name
de sortie
| Attaquant | Compromis | Système |
|---|---|---|
| Mallory | Pendiller | Apollon |
Contenu connexe
- opérateurs graph
- opérateur make-graph
- tout()
- any()
- map()
- inner_nodes()