Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Operator graph-match wyszukuje wszystkie wystąpienia wzorca grafu w źródle grafu wejściowego.
Uwaga
Ten operator jest używany z operatorem make-graph.
Składnia
G|graph-match [cycles] = [whereograniczenia] [project] =Wyrażenie [, ...]
Parametry
| Nazwa | Typ | Wymagane | 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. |
|
| Wyrażenie | string |
✔️ | Klauzula project konwertuje każdy wzorzec na wiersz w wyniku tabelarycznym. Wyrażenia projektu muszą być właściwościami skalarnych 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, , noneunique_edges. 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:
| Składnik | Nazwana zmienna | Anonim |
|---|---|---|
| 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
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 reprezentować wzorzec gwiazdy z węzłem n w środku połączonym z węzłami a,b,c i d, można użyć następującego wzorca:
(
a)--(n)--()()--()--( d)
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
Poniższy przykład reprezentuje hierarchię organizacyjną. Pokazuje, jak można użyć krawędzi o zmiennej długości do znajdowania 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 = map(reports, manager)
Wynik
| pracownik | wiek | reportingPath |
|---|---|---|
| Joe | 29 | [ "Alicja" ] |
| Przeddzień | 27 | [ "Alicja", "Bob" ] |
| Ben | 23 | [ "Alicja", "Chris" ] |
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. Po operatorze make-graph tworzącym graf jest wywołanie graph-match wzorca grafu, które wyszukuje ścieżki ataków do "Apollo" systemu.
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
Wynik
| Napastnik | Zagrożone | System |
|---|---|---|
| Mallory | Robert | Apollo |
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 Alice.
graph-match Prefiks wzorca jest taki sam jak w poprzednim przykładzie i dodamy kolejną 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
Wynik
| Napastnik | Zagrożone | System |
|---|---|---|
| Mallory | Robert | Apollo |