Condividi tramite


Operatore graph-match

L'operatore graph-match cerca tutte le occorrenze di un modello a grafo in un'origine del grafo di input.

Nota

Questo operatore viene usato insieme all'operatore make-graph.

Sintassi

G graph-match | [cycles = CyclesOption] Vincoli project di criteri where [ColumnName =] Expression [, ...]

Parametri

Nome Digita Obbligatorio Descrizione
G string ✔️ Origine del grafo di input.
Modello string ✔️ Una o più sequenze delimitate da virgole degli elementi del nodo del grafo connessi dagli elementi del bordo del grafo usando le notazioni del grafo. Vedere Notazione del criterio grafico.
Vincoli string ✔️ Espressione booleana composta da proprietà di variabili denominate nel criterio. Ogni elemento del grafo (nodo/bordo) ha un set di proprietà associate durante la costruzione del grafo. I vincoli definiscono gli elementi (nodi e archi) corrispondenti al modello. Viene fatto riferimento a una proprietà dal nome della variabile seguito da un punto (.) e dal nome della proprietà.
Expression string La project clausola converte ogni criterio in una riga in un risultato tabulare. Le espressioni di progetto devono essere scalari e proprietà di riferimento delle variabili denominate definite nel modello. Viene fatto riferimento a una proprietà dal nome della variabile seguito da un punto (.) e dal nome dell'attributo.
CyclesOption string Controlla se i cicli vengono confrontati nel criterio, i valori consentiti: all, none, unique_edges. Se all viene specificato , vengono confrontati tutti i cicli, se none i cicli specificati non corrispondono, se unique_edges (impostazione predefinita) viene specificata la corrispondenza dei cicli, ma solo se i cicli non includono lo stesso bordo più di una volta.

Notazione del modello a grafo

La tabella seguente mostra la notazione del grafo supportata:

Elemento Variabile denominata Anonimo
Nodo (n) ()
Bordo diretto: da sinistra a destra -[e]-> -->
Bordo diretto: da destra a sinistra <-[e]- <--
Qualsiasi bordo di direzione -[e]- --
Bordo a lunghezza variabile -[e*3..5]- -[*3..5]-

Bordo a lunghezza variabile

Un bordo di lunghezza variabile consente di ripetere più volte un modello specifico entro i limiti definiti. Questo tipo di bordo è indicato da un asterisco (*), seguito dai valori di occorrenza minimo e massimo nel formato min..max. I valori minimo e massimo devono essere scalari interi . Qualsiasi sequenza di archi che rientrano in questo intervallo di occorrenze può corrispondere al bordo variabile del criterio, se tutti i bordi della sequenza soddisfano i vincoli descritti nella where clausola .

Più sequenze (anteprima)

Per esprimere modelli non lineari vengono usate più sequenze delimitate da virgole. Per descrivere la connessione tra sequenze diverse, è necessario condividere uno o più nomi di variabile di un nodo. Ad esempio, per esprimere un modello a stella con un nodo n al centro della stella e connesso ai nodi a,b,c e d è possibile usare il modello seguente: (a)--(n,c)--())--(( n)--(d.) Nore che sono supportati solo modelli di componenti connessi singoli.

Valori restituiti

L'operatore graph-match restituisce un risultato tabulare, in cui ogni record corrisponde a una corrispondenza del modello nel grafico.
Le colonne restituite vengono definite nella clausola dell'operatore project usando proprietà di archi e/o nodi definiti nel criterio. Le proprietà e le funzioni delle proprietà dei bordi a lunghezza variabile vengono restituite come matrice dinamica, ogni valore nella matrice corrisponde a un'occorrenza del bordo della lunghezza variabile.

Esempi

Tutti i dipendenti dell'organizzazione di un manager

L'esempio seguente rappresenta una gerarchia organizzativa, illustra come usare un arco di lunghezza variabile per trovare dipendenti di diversi livelli della gerarchia in una singola query. I nodi nel grafico rappresentano i dipendenti e i bordi provengono da un dipendente al proprio manager. Dopo aver compilato il grafico usando make-graph, si cerca i dipendenti nell'organizzazione Alicepiù giovane di 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 = reports.manager

Output

impiegato età ReportingPath
Joe 29 [
"Alice"
]
Eve 27 [
"Alice",
"Bob"
]
Ben 23 [
"Alice",
"Chris"
]

Percorso di attacco

Nell'esempio seguente viene compilato un grafico dalle Actions tabelle e Entities . Le entità sono persone e sistemi e le azioni descrivono relazioni diverse tra entità. Seguendo l'operatore make-graph che compila il grafico è una chiamata a con un modello a graph-match grafo che cerca i percorsi di attacco al sistema "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

Output

Utente malintenzionato Compromessa System
Mallory Bob Apollo

Modello a stella (anteprima)

L'esempio seguente è simile all'esempio di percorso di attacco precedente, ma con un vincolo aggiuntivo: si vuole che l'entità compromessa comunichi anche con Alice. Il graph-match prefisso del criterio è uguale all'esempio precedente e viene aggiunta una sequenza aggiuntiva con compromessa come collegamento tra le sequenze.

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

Output

Utente malintenzionato Compromessa System
Mallory Bob Apollo