Dela via


graph-match-operator

Gäller för: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft 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 [whereConstraints] 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-graphsöker vi efter anställda i Aliceorganisation 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