Pisanie zapytań wzorca grafu w Microsoft Fabric

Note

Ta funkcja jest obecnie w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie jest zalecana w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą nie być obsługiwane lub mogą mieć ograniczone możliwości. Aby uzyskać więcej informacji, zobacz Warunki dodatkowe korzystania z testowych wersji Microsoft Azure.

Dopasowywanie wzorca grafu umożliwia opisanie struktury danych, które mają być wyszukiwane przy użyciu intuicyjnej składni wizualnej. Zamiast łączyć tabele, piszesz wzorce, które wyglądają jak same relacje — węzły połączone za pomocą krawędzi. W tym artykule pokazano, jak pisać zapytania dotyczące wzorca GQL dla typowych scenariuszy na grafie w Microsoft Fabric.

W przykładach użyto przykładowego zestawu danych sieci społecznościowej. Aby uzyskać pełną dokumentację składni wzorca, zobacz Wzorce grafu GQL.

Wymagania wstępne

  • Element grafu z załadowanymi danymi. Jeśli jesteś nowy w grafie, najpierw ukończ samouczek.
  • Znajomość podstawowych MATCH i RETURN zapytań. Zobacz Przewodnik po języku GQL.

Dopasuj relacje bezpośrednie

Podstawowy wzorzec jest zgodny z typem węzła, określonym typem krawędzi i innym typem węzła. Składnia wygląda jak diagram relacji.

Na przykład aby znaleźć do 100 osób sparowanych z firmą, w której pracują:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100

Użyj niekierunkowego wzorca krawędzi, jeśli nie wiesz lub nie dbasz o kierunek. Aby na przykład znaleźć do 100 wzajemnych znajomych niezależnie od tego, kto zainicjował połączenie:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

Note

Wykres obecnie nie obsługuje tworzenia nieskierowanych krawędzi, ale można wykonywać zapytania o krawędzie w dowolnym kierunku przy użyciu składni -[:label]-.

Filtrowanie wzorców za pomocą wbudowanej funkcji WHERE

Umieść WHERE wewnątrz wzorca, aby filtrować węzły i krawędzie podczas ich dopasowywania. Takie podejście jest bardziej wydajne niż filtrowanie po fakcie.

Aby na przykład znaleźć osoby urodzone przed 1990 r., które pracują w firmie, której nazwa zaczyna się od "A":

MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

Filtruj właściwości krawędzi, aby ograniczyć, które relacje są zgodne. Aby na przykład zwrócić tylko osoby, które rozpoczęły pracę w firmie w 2010 r. lub później:

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom

Dopasowywanie relacji z wieloetapowymi połączeniami

Użyj wzorców o zmiennej długości, aby przejść przez wiele przeskoków w jednym wyrażeniu. Określ minimalną i maksymalną liczbę przeskoków ze składnią {min,max} .

Na przykład, aby znaleźć do 100 osób osiągalnych w ciągu dwóch do czterech poziomów znajomości od Alicji:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Aby znaleźć maksymalnie 100 połączeń bezpośrednich i drugiego stopnia (jednym lub dwoma przeskokami) od Alicji:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

Sterowanie przechodzeniem za pomocą trybów ścieżki

Domyślnie GQL używa TRAIL trybu, który uniemożliwia przechodzenie przez tę samą krawędź więcej niż raz. Użyj trybów ścieżki jawnie, gdy potrzebujesz różnych gwarancji.

Tryb ścieżki Behavior Użyj, gdy...
WALK Zezwala na powtarzające się węzły i krawędzie Chcesz bezpośredniego przeszukiwania bez ograniczeń. Rzadko potrzebne; przydatne głównie w przypadku zapytań eksploracyjnych.
TRAIL Brak powtarzających się krawędzi (ustawienie domyślne) Chcesz uniknąć powtarzania tej samej relacji, ale ten sam węzeł może pojawić się poprzez różne relacje. Dobrze sprawdza się w przypadku większości zapytań dotyczących przeszukiwania.
SIMPLE Brak powtarzających się węzłów z wyjątkiem początkowego i końcowego. Nie chcesz, aby węzeł był wyświetlany więcej niż raz w środku ścieżki, ale zezwalaj na ścieżki zamykające się z powrotem do początku. Przydatne do wykrywania pętli.
ACYCLIC Brak powtarzających się węzłów Należy zagwarantować, że żaden węzeł nie pojawia się w dowolnym miejscu w ścieżce więcej niż raz. Służy do ścisłej hierarchii, pochodzenia lub dowolnego przechodzenia, gdy ponowne przejście węzła spowoduje wygenerowanie nieprawidłowych wyników.

WALK jest najbardziej permissywnym trybem i ACYCLIC jest najbardziej restrykcyjny. TRAIL jest wartością domyślną i sprawdza się w przypadku większości zapytań. Użyj bardziej restrykcyjnego trybu tylko wtedy, gdy wymaga tego przypadek użycia.

Aby zilustrować różnicę, rozważ ścieżkę Alice → Bob → Carol → Bob:

  • WALK — umożliwia tę ścieżkę. Węzły i krawędzie mogą swobodnie powtarzać się.
  • TRAIL — umożliwia tę ścieżkę. Bob pojawia się dwa razy, ale każda używana krawędź jest inną relacją (Alice→Bob i Carol→Bob są odrębnymi krawędziami), więc żadna krawędź nie jest powtarzana.
  • SIMPLE — blokuje tę ścieżkę. Bob pojawia się więcej niż raz, a funkcja SIMPLE umożliwia powtarzanie węzła tylko wtedy, gdy jest to zarówno początek, jak i koniec ścieżki (zamknięty cykl). Tutaj Alice jest początkiem, a Bob jest końcem, więc nie ma wyjątku.
  • ACYCLIC — blokuje tę ścieżkę. Bob pojawia się więcej niż raz w dowolnym miejscu ścieżki.

W poniższym przykładzie pokazano, jak użyć TRAIL , aby policzyć, jak wiele odrębnych ścieżek prowadzi do każdego z pierwszych 100 osób, do których można dotrzeć w sieci Alicji w ciągu czterech przeskoków.

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

Użyj ACYCLIC, aby zwrócić do 100 osób osiągalnych od Alicji w ciągu czterech przeskoków, gdzie każda osoba na ścieżce jest unikatowa.

MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Wskazówka

W przypadku dużych grafów zawsze należy ustawić górną granicę dla wzorców o zmiennej długości ({1,4} zamiast {1,}). Nieograniczone przechodzenie przez gęste grafy może przekraczać limity czasu zapytania. Zobacz Bieżące ograniczenia.

Używanie ponownego użycia zmiennej do wyrażania jednostek udostępnionych

Ponowne użycie tej samej zmiennej w dwóch częściach wzorca powoduje utworzenie niejawnego ograniczenia równości — oba odwołania odnoszą się do tego samego węzła. Ta technika umożliwia wyrażenie "znajdowanie jednostek połączonych za pośrednictwem udostępnionej trzeciej jednostki".

Na przykład aby znaleźć do 100 par osób, które znają się nawzajem i pracują w tej samej firmie:

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

Zmienna c jest ponownie wykorzystywana dla obu workAt obiektów docelowych, więc zapytanie zwraca tylko pary, w których obie osoby znają się nawzajem i pracują w tej samej firmie.

Aby znaleźć do 100 par osób, które polubiły ten sam post:

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Wskazówka

Warunek WHERE a.id < b.id uniemożliwia pojawienie się zduplikowanych par (Alice + Bob i Bob + Alice) w wynikach.

Łączenie wielu wzorców

Wypisz wiele wzorców w jednym MATCH, rozdzielając je przecinkami. Wszystkie wzorce muszą dzielić co najmniej jedną zmienną, aby poprawnie się przyłączyły.

Na przykład aby znaleźć maksymalnie 100 osób wraz z miejscem pracy i miastem, w którym mieszkają:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

Współdzielona zmienna p łączy te dwa wzorce. Każdy wiersz wyników reprezentuje jedną osobę ze swoją firmą i miastem.

Dopasuj relacje opcjonalne

Użyj OPTIONAL MATCH, gdy relacja może nie istnieć dla każdego węzła. Wiersze bez dopasowania są zachowywane z wartościami NULL podobnie jak w SQL LEFT JOIN.

Na przykład wróć do 100 osób z nazwą firmy, w tym osób bez pracodawcy (czyli osób, które zwracają NULL kolumnę firmy):

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

Użyj IS NULL po OPTIONAL MATCH, aby znaleźć do 100 osób, które nie pracują w żadnej firmie.

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100