Wzorce grafu GQL

Wzorce grafu to podstawowe bloki konstrukcyjne zapytań GQL na grafie w usłudze Microsoft Fabric. Opisują struktury, których szukasz na grafie przy użyciu węzłów i krawędzi w intuicyjny, wizualny sposób. Wzorce grafu można traktować jako szablony, które aparat zapytań próbuje dopasować do rzeczywistych danych na wykresie.

W tym artykule opisano reguły składni i kompozycji dla wzorców grafu w języku GQL.

Proste wzorce elementów

Proste wzorce elementów pomagają dopasować poszczególne węzły i krawędzie z grafu, które spełniają określone wymagania. Te wzorce stanowią podstawę bardziej złożonego dopasowywania wzorców.

Proste wzorce węzłów

Wzorzec węzła określa etykiety i właściwości, które węzeł musi być zgodny:

(:Place&City { name: "New York" })

Ten wzorzec pasuje do wszystkich węzłów, które mają etykietyPlace i ( City wskazywane przez & operatora) i których name właściwość jest "New York"równa . Ta kombinacja wymaganych etykiet i właściwości jest nazywana wypełnieniem wzorca węzła.

Kluczowe pojęcia:

  • Dopasowywanie etykiet: użyj polecenia & , aby wymagać wielu etykiet.
  • Filtrowanie właściwości: określ dokładne wartości, które właściwości muszą być zgodne.
  • Dopasowanie elastyczne ("kowariantne") : dopasowane węzły mogą mieć więcej etykiet i właściwości poza określonymi.

Uwaga / Notatka

Węzły mogą mieć wiele etykiet, ale typy krawędzi z wieloma etykietami nie są jeszcze obsługiwane.

Proste wzorce krawędzi

Wzorce krawędzi są bardziej złożone niż wzorce węzłów. Nie tylko określają wypełniacz, ale także łączą wzór węzła początkowego z wzorcem docelowym. Wzorce krawędzi opisują wymagania dotyczące krawędzi i jej punktów końcowych:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

Kierunek -[...]-> strzałki jest ważny — określa (:Person) jako wzór węzła początkowego i (:Comment) docelowego. Zrozumienie kierunku krawędzi ma kluczowe znaczenie dla poprawnego wykonywania zapytań względem grafu.

Równoważny wzorzec dublowany:

Możesz przerzucić strzałkę i zamienić wzorce węzłów w celu utworzenia równoważnego, dublowanego wzorca krawędzi:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Ten wzorzec znajduje te same relacje, ale z odwrotnej perspektywy.

Wzorce krawędzi dowolnego skierowanego

Gdy kierunek krawędzi grafu nie ma znaczenia dla zapytania, możesz pozostawić go nieokreślony, tworząc wzorzec krawędzi skierowanych do dowolnego:

(:Song)-[:inspired]-(:Movie)

Ten wzór odpowiada tym samym krawędziom co (:Song)-[:inspired]->(:Movie)(:Movie)-[:inspired]->(:Song) i łącznie, niezależnie od tego, który węzeł jest początkiem, a który celem (ten przykład nie pochodzi z typu grafu sieci społecznej).

Skróty do wzorca krawędzi grafu

GQL udostępnia wygodne skróty dla typowych wzorców krawędzi, aby zapytania bardziej zwięzłe:

  • ()->() ()-[]->() oznacza (krawędź skierowana z dowolną etykietą)
  • ()<-() ()<-[]-() oznacza (krawędź skierowana odwrotnie z dowolną etykietą)
  • ()-() ()-[]-() oznacza (dowolna krawędź skierowana z dowolną etykietą)

Te skróty mogą być przydatne, gdy dbasz o łączność, ale nie o konkretny typ krawędzi grafu.

Wyrażenia etykiet

Wzorce mogą wyrażać złożone wymagania dotyczące etykiet dopasowanych węzłów i krawędzi.

Example:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

Zlicza to liczbę isLocatedIn krawędzi łączących Person węzły lub Organizationwęzły (Company które są zawsze University węzłami w schemacie sieci społecznościowej) z City węzłami lub Country węzłami.

Składnia:

Składnia Meaning
A&B Etykiety muszą zawierać zarówno A, jak i B.
A|B Etykiety muszą zawierać co najmniej jedną z etykiet A lub B.
!A Etykiety muszą wykluczać A.

Ponadto użyj nawiasu, aby kontrolować kolejność obliczania wyrażeń etykiet. Domyślnie ! ma najwyższy priorytet i & ma wyższy pierwszeństwo niż |. W związku !A&B|C|!D z tym wartość jest taka sama jak ((!A)&B)|C|(!D).

Zmienne powiązania

Zmienne umożliwiają odwoływanie się do dopasowanych elementów grafu w innych częściach zapytania. Zrozumienie sposobu wiązania i używania zmiennych jest niezbędne do tworzenia zaawansowanych zapytań.

Wiązanie zmiennych elementów

Wzorce węzłów i krawędzi mogą wiązać dopasowane węzły i krawędzie ze zmiennymi w celu późniejszego odwołania.

(p:Person)-[w:workAt]->(c:Company)

W tym wzorcu p jest powiązany z pasującymi Person węzłami, w do pasujących workAt krawędzi i c do pasujących Company węzłów.

Ponowne użycie zmiennych w przypadku ograniczeń strukturalnych:

Ponowne przy użyciu tej samej zmiennej we wzorcu wiele razy wyraża ograniczenie struktury dopasowań. Każde wystąpienie tej samej zmiennej musi zawsze wiązać się z tym samym elementem grafu w prawidłowym dopasowaniu. Ponowne użycie zmiennych jest zaawansowane w celu wyrażania złożonych wymagań strukturalnych.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Wzorzec znajduje Person węzły x i zna siebie nawzajem y i działa w tym samym Companyobiekcie , który jest powiązany ze zmienną c. Ponowne użycie c gwarantuje, że obie osoby pracują w tej samej firmie.

Predykaty wzorców ze zmiennymi elementów:

Zmienne elementu powiązania umożliwiają określanie predykatów wzorca węzła i krawędzi. Zamiast po prostu dostarczać wypełnienie z dokładnymi wartościami właściwości, takimi jak { name: "New York, USA" }, wypełniacz może określić predykat, który jest oceniany dla każdego elementu kandydata. Wzorzec jest zgodny tylko wtedy, gdy predykat daje wartość :TRUE

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

Wzorzec krawędzi znajduje ludzi, którzy znali się od 1 stycznia 2000 r., używając elastycznego warunku, a nie dokładnego dopasowania.

Uwaga / Notatka

Zmienne wzorca krawędzi zawsze wiążą się z poszczególnymi krawędziami w predykacie wzorca krawędzi, nawet w przypadku używania wzorców o zmiennej długości. Może to pomóc w braku konieczności niepotrzebnego wyświetlania zmiennych listy grup krawędzi w celu wykonania filtru po filtrze. Zobacz Wiązanie zmiennych krawędzi wzorca o zmiennej długości.

Zaawansowane techniki predykatu wzorca:

Predykaty wzorców zapewniają zaawansowane funkcje filtrowania wbudowanego, które mogą zwiększyć czytelność zapytań:

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.birthday < 19900101 AND p.gender = 'female')
      -[:workAt]->
      (c:Company WHERE c.name STARTS WITH 'A')

-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL

-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL

Wskazówka

Umieść predykat w wzorcu, gdy opisuje, który węzeł lub krawędź może wziąć udział w grze.

Zmienne ścieżki powiązania

Możesz również powiązać dopasowaną ścieżkę ze zmienną ścieżki w celu dalszego przetwarzania lub zwrócić pełną strukturę ścieżki do użytkownika:

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

p W tym miejscu jest powiązana z wartością ścieżki reprezentującą pełną dopasowaną strukturę ścieżki, w tym wartości odwołania dla wszystkich węzłów i krawędzi w podanej kolejności.

Ścieżki ograniczone mogą być zwracane użytkownikowi lub dalej przetwarzane za pomocą funkcji takich jak NODES lub EDGES:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

Tworzenie wzorców

Zapytania w świecie rzeczywistym często wymagają bardziej złożonych wzorców niż proste struktury węzłów brzegowych węzłów. GQL udostępnia kilka sposobów tworzenia wzorców dla zaawansowanych przechodzenia grafu.

Tworzenie wzorców ścieżek

Wzorce ścieżek mogą być komponowane przez łączenie prostych wzorców węzłów i krawędzi w celu utworzenia dłuższych przejść.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Wzorzec przechodzi od osoby przez ich kontakty społeczne i zawodowe, aby znaleźć, gdzie znajduje się firma współpracownika.

Konstrukcja deseń częściowych: Wzorce ścieżek można również tworzyć przyrostowo, co ułatwia odczytywanie i zrozumienie złożonych wzorców:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

To podejście dzieli ten sam przechodzenie do kroków logicznych, co ułatwia zrozumienie i debugowanie.

Tworzenie wzorców nieliniowych

Wynikowy kształt wzorca nie musi być ścieżką liniową. Można dopasować bardziej złożone struktury, takie jak wzorce "w kształcie gwiazdy", które promieniują z węzła centralnego:

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

Wzorzec znajduje osobę wraz z ich wykształceniem, zatrudnieniem i preferencjami zawartości jednocześnie — kompleksowym zapytaniem profilu.

Wzory w tym samym MATCH nie muszą dzielić zmiennej. Rozłączone wzorce tworzą kartezjański iloczyn ich dopasowania. Ponownie użyj zmiennej, gdy wzorce powinny wiązać ten sam element grafu i pozostaną tylko połączone kombinacje.

Ponowne wykorzystanie elementów sterujących

GQL kontroluje powtarzające się węzły i krawędzie na dwóch poziomach:

  • Tryb dopasowania dotyczy pełnego wzorca grafu, w tym ścieżek rozdzielonych przecinkami.
  • Tryb ścieżki dotyczy jednej ścieżki.

Domyślny tryb meczu to REPEATABLE ELEMENTS. Pozwala na występowanie wiązania tego samego elementu w różnych częściach wzorca grafu, w zależności od trybu ścieżki każdej ścieżki. Możesz to napisać wprost:

REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Użyj DIFFERENT EDGES lub jego synonimu DIFFERENT RELATIONSHIPS , aby wymagać unikalności krawędzi w całym wzorcu grafu. Ten tryb dopasowania zmienia również każdą WALK ścieżkę w wzorcu do TRAIL zachowania.

DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Następujące tryby ścieżek kontrolują powtarzające się elementy w obrębie każdej ścieżki:

Tryb ścieżki Ponowne wykorzystanie pierwiastków
WALK Węzły i krawędzie mogą się powtarzać.
TRAIL Krawędzie nie mogą się powtarzać, ale węzły mogą się powtarzać.
SIMPLE Węzły nie mogą się powtarzać, z wyjątkiem tego, że pierwszy i ostatni węzeł mogą być takie same. Krawędzie nie mogą się powtarzać.
ACYCLIC Węzły nie mogą się powtarzać, w tym pierwszy i ostatni. Krawędzie nie mogą się powtarzać.

WALK to domyślny tryb ścieżki. Poprzedzaj ścieżkę innym trybem, gdy potrzebujesz bardziej rygorystycznej unikalności elementu:

Dla SIMPLE i ACYCLIC, unikalność krawędzi wynika z jednoznaczności węzłów. Ścieżka może się SIMPLE zamknąć, wracając do pierwszego węzła, ale nadal nie może ponownie użyć krawędzi.

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

Wzór TRAIL daje tylko dopasowania, w których e1, e2, i e3 są różne. Węzły mogą się powtarzać, więc ścieżka może tworzyć cykl bez ponownego użycia krawędzi.

Kontrolować, które ścieżki są zwracane

Prefiks przeszukiwania ścieżek kontroluje, które ścieżki zwraca wzór ścieżki. Domyślny ALL prefiks zwraca każdą ścieżkę odpowiadającą trybowi i wzorcowi ścieżki. Możesz napisać ALL wprost:

ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)

Użyj ANY SHORTEST do zwracania jednej najkrótszej ścieżki dopasowania dla każdej pary źródło-cel z każdego wiersza wejściowego:

MATCH p = ANY SHORTEST
  (src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100

Jeśli wiele ścieżek łączy się przez najkrótszą długość, zapytanie zwraca jedną z nich, ale która ścieżka jest zwrócona, nie jest deterministyczne. Dolna granica zera może zwrócić ścieżkę zerową od węzła źródłowego do siebie samego.

ALL SHORTEST ANY A przeszukiwania ścieżek nie są wspierane.

Umieść predykaty przed lub po wyborze ścieżki

Umieszczenie predykatów określa, czy warunek definiuje odpowiednie ścieżki lub filtruje ścieżki po wybraniu ich przez prefiks ścieżek wyszukiwania:

  • Inline WHERE w wzorze węzłowym lub krawędziowym jest częścią wzoru. Ogranicza on, które ścieżki są kwalifikowane przed ALL lub ANY SHORTEST zastosowaniem.
  • Poziom WHERE instrukcji po pełnym MATCH wzorcu to filtr post. Filtruje wiersze po tym, jak prefiks ścieżki wyszukiwania wybrał ścieżki.
  • Kolejne FILTER polecenie również filtruje wiersze po wybraniu ścieżki.

To rozróżnienie jest szczególnie ważne przy ANY SHORTEST. W poniższym wzorcu tylko knows krawędzie utworzone w określonym dniu lub po dacie są kwalifikowane, gdy zapytanie wybiera najkrótszą ścieżkę:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connection:knows
    WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
RETURN p

Przeniesienie warunku krawędzi do filtra post-filtra zmienia znaczenie. Zapytanie najpierw wybiera najkrótszą ścieżkę bez tego warunku. Następnie usuwa wybraną ścieżkę, jeśli jakakolwiek krawędź nie spełnia warunku; nie wybiera dłuższej ścieżki:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connections:knows]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
           WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p

Ważne

Dla niektórych ANY SHORTEST kształtów zapytań Graph może obecnie zastosować warunek na poziomie MATCH ... WHERE instrukcji przed wyborem ścieżki. Dopóki to ograniczenie nie zostanie rozwiązane, należy stosować inline predykaty do uprawniania ścieżek oraz osobne oświadczenie FILTER do filtrowania po wyborze. Aby uzyskać więcej informacji, zobacz Bieżące ograniczenia.

Używanie wzorców o zmiennej długości

Wzorce o zmiennej długości to zaawansowane konstrukcje, które umożliwiają znajdowanie ścieżek o różnych długościach bez konieczności pisania powtarzających się specyfikacji wzorca. Są one niezbędne dla przechodzenia hierarchii, sieci społecznościowych i innych struktur, w których optymalna długość ścieżki nie jest znana z wyprzedzeniem.

Ograniczone wzorce o zmiennej długości

Wiele typowych zapytań grafu wymaga wielokrotnego powtarzania tego samego wzorca krawędzi. Zamiast pisać pełne wzorce, takie jak:

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

Możesz użyć bardziej zwięzłej składni o zmiennej długości:

(:Person)-[:knows]->{3}(:Person)

Określa {3} , że -[:knows]-> wzorzec krawędzi powinien być powtarzany dokładnie trzy razy.

Elastyczne zakresy powtórzeń: Aby uzyskać większą elastyczność, można określić zarówno dolną granicę, jak i górną granicę dla powtórzenia:

(:Person)-[:knows]->{1, 3}(:Person)

Ten wzorzec znajduje bezpośrednich przyjaciół, przyjaciół przyjaciół i przyjaciół przyjaciół-of-friends-of-friends-all w jednym zapytaniu.

Uwaga / Notatka

Dolna granica może również wynosić zero. Dopasowywanie zero-hop nie zawiera krawędzi i wymaga, aby oba wzorce węzłów końcowych dopasowały się do tego samego węzła.

Example:

(p1:Person)-[:knows]->{0,1}(p2:Person)

Ten wzór dopasowuje każdą osobę zarówno do liczby p1 przeskoków, jak i p2 na zero skoków, oraz do połączonych par na jednym skoku.

Gdy nie jest określona dolna granica w {,n}, domyślnie wynosi zero.

Złożone kompozycje o zmiennej długości: Wzory o zmiennej długości mogą być częścią większych, bardziej złożonych wzorców, jak w następującym zapytaniu:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

Wzorzec ten znajduje pary komentarzy, gdzie osoby znające się nawzajem lajkowały różne komentarze, a wiadomość m jest połączona z każdym komentarzem łańcuchem od jednej do trzech replyOf krawędzi.

Wiązanie zmiennych krawędzi wzorca o zmiennej długości

Po powiązaniu wzorca krawędzi o zmiennej długości wartość i typ zmiennej krawędzi zmieniają się w zależności od kontekstu odwołania. Zrozumienie tego zachowania ma kluczowe znaczenie dla prawidłowego przetwarzania dopasowań o zmiennej długości:

Dwa stopnie odwołania:

  • Wewnątrz wzorca o zmiennej długości: zmienne krawędzi grafu powiązane z poszczególnymi krawędziami wzdłuż dopasowanej ścieżki (nazywanej również "pojedynczym stopniem odwołania")
  • Poza wzorcem o zmiennej długości: zmienne krawędzi grafu wiążą się z sekwencją wszystkich krawędzi wzdłuż dopasowanej ścieżki (nazywanej również "stopniem odniesienia grupy")

Przykład pokazujący oba konteksty:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

Ocena zmiennej e krawędzi odbywa się w dwóch kontekstach:

  • W oświadczeniuMATCH: Zapytanie znajduje łańcuchy przyjaciół-of-friends-of-friends, gdzie każda przyjaźń została ustanowiona od roku 2000. Podczas dopasowywania wzorca predykat e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") wzorca krawędzi jest obliczany raz dla każdej krawędzi kandydata. W tym kontekście e jest powiązana z pojedynczą wartością referencyjną krawędzi.

  • W instrukcjiRETURN: Tutaj e jest powiązana z listą (grup) wartości odwołań krawędzi w kolejności, w której występują w dopasowanym łańcuchu. Wynikiem e[0] jest pierwsza wartość referencyjna krawędzi w każdym dopasowanym łańcuchu.

Zmienne krawędziowe wzoru o zmiennej długości w agregacji poziomej:

Zmienne krawędziowe ograniczone dopasowaniem wzorców o zmiennej długości to listy grupowe spoza wzorca o zmiennej długości i dlatego mogą być używane w agregacji poziomej.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

Więcej informacji można znaleźć w sekcji Funkcje agregatywne.

Niezwiązane wzorce o zmiennej długości

Używaj kwantyfikatora nieograniczonego, gdy maksymalna długość ścieżki nie jest znana:

-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)

Skróty * i + określają zero lub więcej oraz jedno lub więcej powtórzeń:

-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)

-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)

Nieograniczony wzór z domyślną ALL WALK kombinacją jest odrzucany, ponieważ cykle mogą generować nieskończenie wiele ścieżek dopasowania. Użyj TRAIL, SIMPLE, lub ACYCLIC do ograniczenia ścieżki przez unikalność krawędzi lub węzła. Te tryby gwarantują zakończenie, ale duży graf nadal może generować dużą liczbę ścieżek.

Ważne

Dla ścieżki ograniczonej ANY SHORTEST WALK, jedynymi obsługiwanymi zastosowaniami PATH_LENGTH(path) są i, obok niej, path IS NULL. Graf nie materializuje pełnej ścieżki w tej formie. Użyj skończonej górnej granicy lub określ TRAIL, SIMPLE, albo ACYCLIC zwróć lub użyj ścieżki.