Sdílet prostřednictvím


Graph-match – operátor

Platí pro: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Operátor graph-match vyhledá všechny výskyty vzoru grafu ve vstupním zdroji grafu.

Poznámka

Tento operátor se používá s operátorem make-graph.

Syntax

G|graph-match [cycles=CyclesOption] vzor [whereomezení] project [Název sloupce=] Výraz [, ...]

Parametry

Jméno Typ Požadovaný Popis
G string ✔️ Zdroj vstupního grafu.
vzorů string ✔️ Jedna nebo více sekvencí oddělených čárkami prvků uzlu grafu propojených hranými prvky grafu pomocí notací grafu. Viz notace schématu grafu.
omezení string Logický výraz složený z vlastností pojmenovaných proměnných v vzoru. Každý prvek grafu (uzel/hrana) má sadu vlastností, které byly k němu připojeny během vytváření grafu. Omezení definují, které prvky (uzly a hrany) odpovídají vzoru. Na vlastnost odkazuje název proměnné následovaný tečkou (.) a názvem vlastnosti.
výrazu string ✔️ Klauzule project převede každý vzor na řádek v tabulkovém výsledku. Výrazy projektu musí být skalární a odkazové vlastnosti pojmenovaných proměnných definované v Vzor. Na vlastnost odkazuje název proměnné následovaný tečkou (.) a názvem atributu.
CyclesOption string Určuje, zda se cykly shodují v vzoru, povolené hodnoty: all, none, unique_edges. Pokud je zadán all, budou se všechny cykly shodovat, pokud none nejsou zadány cykly, pokud jsou zadány unique_edges (výchozí), cykly se shodují, ale pouze pokud cykly neobsahují stejnou hranu více než jednou.

Zápis schématu grafu

Následující tabulka ukazuje podporovanou notaci grafu:

Element Pojmenovaná proměnná Anonymní
Uzel ( n) ()
Směrovaný okraj: zleva doprava -[ e]-> -->
Směrovaný okraj: zprava doleva <-[ e]- <--
Libovolná hrana směru -[ e]- --
Hrana s proměnlivou délkou -[ e*3..5]- -[*3..5]-

Hrana s proměnlivou délkou

Hrana proměnlivé délky umožňuje, aby se určitý vzor v definovaných mezích opakoval vícekrát. Tento typ hrany je označen hvězdičkou (*), za kterou následuje minimální a maximální počet výskytů ve formátu min..maximální. Minimální i maximální hodnoty musí být celočíselné skaláry. Jakákoli posloupnost hran spadajících do tohoto rozsahu výskytu se může shodovat s proměnlivým okrajem vzoru, pokud všechny hrany v sekvenci splňují omezení uvedená v klauzuli where.

Více sekvencí

K vyjádření nelineárních vzorů se používá více sekvencí oddělených čárkami. Aby bylo popsáno propojení mezi různými sekvencemi, musí sdílet jeden nebo více názvů proměnných uzlu. Chcete-li například znázorňovat hvězdicový vzor s uzlem n uprostřed připojeným k uzlům ,b,ca d, je možné použít následující vzor:

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

Podporují se pouze vzory jednotlivých připojených komponent.

Návraty

Operátor graph-match vrátí tabulkový výsledek, kde každý záznam odpovídá shodě vzoru v grafu.
Vrácené sloupce jsou definovány v klauzuli project operátoru pomocí vlastností hran nebo uzlů definovaných v modelu. Vlastnosti a funkce vlastností hrany proměnlivé délky se vrátí jako dynamické pole, každá hodnota v poli odpovídá výskytu hrany délky proměnné.

Příklady

Příklady v této části ukazují, jak používat syntaxi, která vám pomůže začít.

Všichni zaměstnanci v organizaci vedoucího

Následující příklad představuje organizační hierarchii. Ukazuje, jak by se dala použít proměnná délka okraje k vyhledání zaměstnanců různých úrovní hierarchie v jednom dotazu. Uzly v grafu představují zaměstnance a hrany jsou od zaměstnance ke svému nadřízenýmu. Po vytvoření grafu pomocí make-graphvyhledáme zaměstnance v organizaci Alice, která je mladší než 30.

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)

výstupní

zaměstnanec věk reportingPath
Pepa 29 [
"Alice"
]
Předvečer 27 [
"Alice",
"Bob"
]
Hora 23 [
"Alice",
"Chris"
]

Cesta útoku

Následující příklad sestaví graf z tabulek Actions a Entities. Entity jsou lidé a systémy a akce popisují různé vztahy mezi entitami. Po operátoru make-graph, který vytváří graf, je volání graph-match s grafovým vzorem, který hledá cesty útoku do systému "Apollo".

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

výstupní

Útočník Udělal kompromis Systém
Mallory Olovnice Apollón

Vzor hvězdy

Následující příklad je podobný předchozímu příkladu cesty útoku, ale s dodatečným omezením: chceme, aby ohrožená entita také komunikovala s Alice. Předpona vzoru graph-match je stejná jako v předchozím příkladu a přidáme další sekvenci s ohroženými jako propojení mezi sekvencemi.

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

výstupní

Útočník Udělal kompromis Systém
Mallory Olovnice Apollón