Operatore graph-match
L'operatore graph-match
cerca tutte le occorrenze di un modello a grafo in un'origine del grafo di input.
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 Alice
più 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 |
Contenuto correlato
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per