Graph-match – operátor
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 [where
omezení] 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-graph
vyhledá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 |
Související obsah
- operátory Graphu
- operátor make-graph
- all()
- map()
- inner_nodes()