Freigeben über


Graph-Match-Operator

Gilt für: ✅Microsoft Fabric

Der graph-match Operator sucht nach allen Vorkommen eines Diagrammmusters in einer Eingabediagrammquelle.

Hinweis

Dieser Operator wird mit dem Make-Graph-Operator verwendet.

Syntax

G|graph-match [cycles=CyclesOption] Pattern [whereConstraints] project [ColumnName=] Expression [, ...]

Die Parameter

Name Typ Erforderlich BESCHREIBUNG
G string ✔️ Die Eingabediagrammquelle.
Muster string ✔️ Eine oder mehrere durch Trennzeichen getrennte Sequenzen von Diagrammknotenelementen, die mit Graph-Randelementen verbunden sind, mithilfe von Diagrammnotationen. Siehe Graph-Musternotation.
Einschränkungen string Ein boolescher Ausdruck, der aus Eigenschaften benannter Variablen im Muster besteht. Jedes Diagrammelement (Knoten/Rand) verfügt über eine Reihe von Eigenschaften, die während der Diagrammerstellung an sie angefügt wurden. Die Einschränkungen definieren, welche Elemente (Knoten und Kanten) mit dem Muster abgeglichen werden. Auf eine Eigenschaft wird durch den Variablennamen gefolgt von einem Punkt (.) und dem Eigenschaftennamen verwiesen.
Ausdruck string ✔️ Die project Klausel konvertiert jedes Muster in eine Zeile in einem tabellarischen Ergebnis. Die Projektausdrücke müssen skalare Und Referenzeigenschaften benannter Variablen sein, die im Muster definiert sind. Auf eine Eigenschaft wird durch den Variablennamen gefolgt von einem Punkt (.) und dem Attributnamen verwiesen.
CyclesOption string Steuert, ob Zyklen im Muster, zulässigen Werten: all, , none. unique_edges Wenn all angegeben, werden alle Zyklen abgeglichen, wenn none angegebene Zyklen nicht übereinstimmen, wenn unique_edges (Standard) angegeben wird, werden Zyklen abgeglichen, aber nur, wenn die Zyklen nicht mehr als einmal denselben Rand enthalten.

Graph-Musternotation

Die folgende Tabelle zeigt die unterstützte Diagrammnotation:

Element Benannte Variable Anonym
Knoten ( n) ()
Gerichteter Rand: von links nach rechts -[ e]-> -->
Gerichteter Rand: von rechts nach links <-[ e]- <--
Beliebige Richtungskante -[ e]- --
Variabler Längenrand -[ e*3..5]- -[*3..5]-

Variabler Längenrand

Eine variable Längenkante ermöglicht es einem bestimmten Muster, mehrere Male innerhalb definierter Grenzwerte wiederholt zu werden. Dieser Randtyp wird durch ein Sternchen (*), gefolgt von den minimalen und maximalen Vorkommenwerten im Format "min max.." bezeichnet. Sowohl die Minimal- als auch die Maximalwerte müssen ganzzahlige Skalare sein. Jede Sequenz von Kanten, die in diesen Vorkommensbereich fallen, kann mit dem variablen Rand des Musters übereinstimmen, wenn alle Kanten in der Sequenz die in der where Klausel beschriebenen Einschränkungen erfüllen.

Mehrere Sequenzen

Mehrere durch Trennzeichen getrennte Sequenzen werden verwendet, um nichtlineare Muster auszudrücken. Um die Verbindung zwischen verschiedenen Sequenzen zu beschreiben, müssen sie einen oder mehrere Variablennamen eines Knotens freigeben. Um z. B. ein Sternmuster mit Knoten n in der Mitte darzustellen, die mit Knoten a,b,c und d verbunden sind, könnte das folgende Muster verwendet werden:

( ein)--(n)--(b,c)()--(n)--(d)

Es werden nur einzelne verbundene Komponentenmuster unterstützt.

Rückgaben

Der graph-match Operator gibt ein tabellarisches Ergebnis zurück, wobei jeder Datensatz einer Übereinstimmung des Musters im Diagramm entspricht.
Die zurückgegebenen Spalten werden in der Operatorklausel project mithilfe von Eigenschaften von Kanten und/oder Knoten definiert im Muster definiert. Eigenschaften und Funktionen von Eigenschaften variabler Längenränder werden als dynamisches Array zurückgegeben, jeder Wert im Array entspricht einem Vorkommen des Rands der variablen Länge.

Beispiele

Das folgende Beispiel stellt eine Organisationshierarchie dar. Es veranschaulicht, wie ein Rand mit variabler Länge verwendet werden kann, um Mitarbeiter verschiedener Ebenen der Hierarchie in einer einzigen Abfrage zu finden. Die Knoten im Diagramm stellen Mitarbeiter und die Kanten von einem Mitarbeiter zum Vorgesetzten dar. Nachdem wir das Diagramm mithilfe von make-graphGraph erstellt haben, suchen wir nach Mitarbeitern in Aliceder Organisation, die jünger als 30sind.

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)

Ausgabe

Arbeitnehmer Alter reportingPath
Joe 29 [
"Alice"
]
Abend 27 [
"Alice",
"Bob"
]
Ben 23 [
"Alice",
"Chris"
]

Im folgenden Beispiel wird ein Diagramm aus den Actions Tabellen erstellt Entities . Die Entitäten sind Personen und Systeme, und die Aktionen beschreiben unterschiedliche Beziehungen zwischen Entitäten. Nach dem make-graph Operator, der das Diagramm erstellt, handelt es sich um einen Aufruf graph-match mit einem Diagrammmuster, das nach Angriffspfaden zum "Apollo" System sucht.

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

Ausgabe

Angreifer Kompromittiert System
Mallory Bubikopf Apollo

Das folgende Beispiel ähnelt dem vorherigen Beispiel für den Angriffspfad, aber mit einer zusätzlichen Einschränkung: Wir möchten, dass die kompromittierte Entität auch mit Alice kommuniziert. Das graph-match Musterpräfix ist identisch mit dem vorherigen Beispiel und wir fügen eine weitere Sequenz mit der kompromittierten Als Verknüpfung zwischen den Sequenzen hinzu.

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

Ausgabe

Angreifer Kompromittiert System
Mallory Bubikopf Apollo