Udostępnij za pośrednictwem


operator dopasowania grafu

Operator graph-match wyszukuje wszystkie wystąpienia wzorca grafu w źródle grafu wejściowego.

Uwaga

Ten operator jest używany w połączeniu z operatorem make-graph.

Składnia

G graph-match | [cycles = CyclesOption] Ograniczenia project wzorcawhere [ColumnName =] Expression [, ...]

Parametry

Nazwisko Type Wymagania opis
G string ✔️ Źródło wykresu wejściowego.
Wzorzec string ✔️ Co najmniej jedna sekwencja rozdzielana przecinkami elementów węzła grafu połączona za pomocą elementów krawędzi grafu przy użyciu notacji grafów. Zobacz Notacja wzorca grafu.
Ograniczenia string ✔️ Wyrażenie logiczne składające się z właściwości nazwanych zmiennych w wzorcu. Każdy element grafu (węzeł/krawędź) ma zestaw właściwości, które zostały do niego dołączone podczas budowy grafu. Ograniczenia definiują, które elementy (węzły i krawędzie) są dopasowywane przez wzorzec. Do właściwości odwołuje się nazwa zmiennej, po której następuje kropka (.) i nazwa właściwości.
Expression string Klauzula project konwertuje każdy wzorzec na wiersz w wyniku tabelarycznym. Wyrażenia projektu muszą być właściwościami skalarnym i referencyjnymi nazwanych zmiennych zdefiniowanych w elemencie Pattern. Do właściwości odwołuje się nazwa zmiennej, po której następuje kropka (.) i nazwa atrybutu.
CyclesOption string Określa, czy cykle są zgodne ze wzorcem, dozwolone wartości: all, , unique_edgesnone. Jeśli all zostanie określony, wszystkie cykle są zgodne, jeśli none określone cykle nie są zgodne, jeśli unique_edges (wartość domyślna) jest określona, cykle są dopasowywane, ale tylko wtedy, gdy cykle nie zawierają tej samej krawędzi więcej niż raz.

Notacja wzorca grafu

W poniższej tabeli przedstawiono obsługiwaną notację grafu:

Element Nazwana zmienna Anonimowe
Węzeł (n) ()
Krawędź skierowana: od lewej do prawej -[e]-> -->
Krawędź skierowana: od prawej do lewej <-[e]- <--
Dowolna krawędź kierunku -[e]- --
Krawędź zmiennej długości -[e*3..5]- -[*3..5]-

Krawędź zmiennej długości

Krawędź o zmiennej długości umożliwia wielokrotne powtarzanie określonego wzorca w ramach zdefiniowanych limitów. Ten typ krawędzi jest oznaczony gwiazdką (*), po której następuje minimalna i maksymalna wartość wystąpień w formacie min..max. Zarówno wartości minimalne, jak i maksymalne muszą być skalarnymi liczbami całkowitymi. Każda sekwencja krawędzi należących do tego zakresu wystąpień może być zgodna ze zmienną krawędzią wzorca, jeśli wszystkie krawędzie w sekwencji spełniają ograniczenia opisane w klauzuli where .

Wiele sekwencji (wersja zapoznawcza)

Wiele sekwencji rozdzielonych przecinkami służy do wyrażania wzorców nieliniowych. Aby opisać połączenie między różnymi sekwencjami, muszą one współużytkować co najmniej jedną nazwę zmiennej węzła. Na przykład aby wyrazić wzorzec gwiazdy z węzłem n w środku gwiazdy i połączonym z węzłami a,b,c i d można użyć następującego wzorca:)--(( n)--(b,c)()--( n)--(d.) Nore, że obsługiwane są tylko pojedyncze połączone wzorce składników.

Zwraca

Operator graph-match zwraca wynik tabelaryczny, w którym każdy rekord odpowiada dopasowaniu wzorca na grafie.
Zwrócone kolumny są definiowane w klauzuli operatora project przy użyciu właściwości krawędzi i/lub węzłów zdefiniowanych we wzorcu. Właściwości i funkcje właściwości krawędzi o zmiennej długości są zwracane jako tablica dynamiczna, każda wartość w tablicy odpowiada wystąpieniu krawędzi zmiennej długości.

Przykłady

Wszyscy pracownicy w organizacji menedżera

Poniższy przykład reprezentuje hierarchię organizacyjną, pokazuje, jak można użyć krawędzi o zmiennej długości do znalezienia pracowników różnych poziomów hierarchii w jednym zapytaniu. Węzły na wykresie reprezentują pracowników, a krawędzie pochodzą od pracownika do menedżera. Po utworzeniu grafu przy użyciu metody make-graphwyszukujemy pracowników w Aliceorganizacji, które są młodsze niż 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

Wyjście

pracownik wiek reportingPath
Joe 29 [
"Alicja"
]
Przeddzień 27 [
"Alicja",
"Bob"
]
Ben 23 [
"Alicja",
"Chris"
]

Ścieżka ataku

Poniższy przykład tworzy graf z Actions tabel i Entities . Jednostki to ludzie i systemy, a akcje opisują różne relacje między jednostkami. make-graph Po operatorze, który tworzy graf, jest wywołaniem graph-match metody z wzorcem grafu, który wyszukuje ścieżki ataków do systemu "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

Wyjście

Osoba atakująca Zagrożone System
Mallory Robert Apollo

Wzorzec gwiazdy (wersja zapoznawcza)

Poniższy przykład jest podobny do poprzedniego przykładu ścieżki ataku, ale z dodatkowym ograniczeniem: chcemy, aby naruszona jednostka również komunikowała się z Alicją. graph-match Prefiks wzorca jest taki sam jak w poprzednim przykładzie i dodamy dodatkową sekwencję z naruszonymi zagrożeniami jako łączem między sekwencjami.

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

Wyjście

Osoba atakująca Zagrożone System
Mallory Robert Apollo