graph-match-operator
Gäller för: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Operatorn graph-match
söker efter alla förekomster av ett diagrammönster i en indatagrafkälla.
Not
Den här operatorn används med operatorn make-graph.
Syntax
G|
graph-match
[cycles
=
CyclesOption] Pattern [where
Constraints] project
[ColumnName=
] Expression [,
...]
Parametrar
Namn | Typ | Krävs | Beskrivning |
---|---|---|---|
G | string |
✔️ | Indatadiagramkällan. |
Mönster | string |
✔️ | En eller flera kommaavgränsade sekvenser av grafnodelement som är anslutna till grafkantelement med hjälp av grafnotationer. Se Diagrammönster notation. |
begränsningar | string |
Ett booleskt uttryck som består av egenskaper för namngivna variabler i Pattern. Varje grafelement (nod/kant) har en uppsättning egenskaper som var kopplade till det under grafkonstruktionen. Begränsningarna definierar vilka element (noder och kanter) som matchas av mönstret. En egenskap refereras till av variabelnamnet följt av en punkt (. ) och egenskapsnamnet. |
|
uttryck | string |
✔️ | Satsen project konverterar varje mönster till en rad i ett tabellresultat. Projektuttrycken måste vara skalära och referensegenskaperna för namngivna variabler som definieras i Pattern. En egenskap refereras till av variabelnamnet följt av en punkt (. ) och attributnamnet. |
CyclesOption | string |
Styr om cykler matchas i Pattern, tillåtna värden: all , none , unique_edges . Om all anges matchas alla cykler, om none angivna cykler inte matchas, om unique_edges (standard) anges matchas cyklerna men endast om cyklerna inte innehåller samma kant mer än en gång. |
Diagrammönster notation
I följande tabell visas den diagram notation som stöds:
Element | Namngiven variabel | Anonym |
---|---|---|
Nod |
(
n) |
() |
Riktad kant: vänster till höger |
-[
e]-> |
--> |
Riktad kant: höger till vänster |
<-[
e]- |
<-- |
Alla riktningskanter |
-[
e]- |
-- |
Kant med variabel längd |
-[
e*3..5]- |
-[*3..5]- |
Kant med variabel längd
Med en variabellängdsgräns kan ett specifikt mönster upprepas flera gånger inom definierade gränser. Den här typen av kant betecknas av en asterisk (*
), följt av lägsta och högsta förekomstvärden i formatet min..
max. Både minimi- och maxvärdena måste vara heltal skalärer. En sekvens med kanter som faller inom det här förekomstintervallet kan matcha mönstrets variabelkant, om alla kanter i sekvensen uppfyller de begränsningar som beskrivs i where
-satsen.
Flera sekvenser
Flera kommaavgränsade sekvenser används för att uttrycka icke-linjära mönster. För att beskriva anslutningen mellan olika sekvenser måste de dela ett eller flera variabelnamn för en nod. Om du till exempel vill representera ett stjärnmönster med noden n i mitten som är ansluten till noder en,b,coch dkan följande mönster användas:
(
en)--(
n)--(
b)
,(
c)--(
n)--(
d)
Endast mönster för en enda ansluten komponent stöds.
Returnerar
Operatorn graph-match
returnerar ett tabellresultat, där varje post motsvarar en matchning av mönstret i diagrammet.
De returnerade kolumnerna definieras i operatorns project
-sats med egenskaper för kanter och/eller noder som definierats i mönstret. Egenskaper och funktioner för egenskaper för kanter med variabel längd returneras som en dynamisk matris. Varje värde i matrisen motsvarar en förekomst av variabellängdsgränsen.
Exempel
Exemplen i det här avsnittet visar hur du använder syntaxen för att komma igång.
Alla anställda i en chefs organisation
Följande exempel representerar en organisationshierarki. Den visar hur en variabel längd kan användas för att hitta anställda på olika nivåer i hierarkin i en enda fråga. Noderna i diagrammet representerar anställda och kanterna är från en anställd till deras chef. När vi har skapat diagrammet med hjälp av make-graph
söker vi efter anställda i Alice
organisation som är yngre än 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)
utdata
anställd | ålder | reportingPath |
---|---|---|
Joe | 29 | [ "Alice" ] |
Afton | 27 | [ "Alice", "Bob" ] |
Ben | 23 | [ "Alice", "Chris" ] |
Attackväg
I följande exempel skapas ett diagram från tabellerna Actions
och Entities
. Entiteterna är personer och system, och åtgärderna beskriver olika relationer mellan entiteter. Att följa make-graph
operatorn som skapar grafen är ett anrop till graph-match
med ett grafmönster som söker efter attackvägar till "Apollo"
systemet.
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
utdata
Angripare | Äventyras | System |
---|---|---|
Mallory | Guppa | Apollo |
Stjärnmönster
Följande exempel liknar exemplet med föregående attackväg, men med en extra begränsning: vi vill att den komprometterade entiteten också ska kommunicera med Alice. Det graph-match
mönsterprefixet är samma som i föregående exempel och vi lägger till ytterligare en sekvens med komprometterad som en länk mellan sekvenserna.
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
utdata
Angripare | Äventyras | System |
---|---|---|
Mallory | Guppa | Apollo |