Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Skorzystaj z tego artykułu, aby nauczyć się, jak konstruować i łączyć wzorce węzłów, krawędzi i ścieżek. W przypadku gotowych do adaptacji zadań, takich jak wyszukiwanie sąsiadów lub podmiotów bez relacji, zobacz Write common GQL queries. Aby poznać przepływy pracy filtrowania, grupowania i agregacji, zobacz Filtruj i agreguj dane grafów.
Wymagania wstępne
- Element grafu zbudowany na podstawie przykładowego zbioru danych sieci społecznej, z typami węzłów, typami krawędzi i właściwościami opisanymi w przykładzie schematu sieci społecznej.
- Znajomość podstawowych
MATCHiRETURNzapytań. 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 w wzorcu tak, że warunek definiuje, który węzeł lub krawędź może uczestniczyć w dopasowaniu. Użyj warunku na poziomie instrukcji MATCH ... WHERE, aby odfiltrować ukończone dopasowanie, lub osobnego FILTER, gdy warunek dotyczy wiersza utworzonego przez wcześniejszą instrukcję. Umieszczenie predykatów może zmieniać wyniki najkrótszej ścieżki. Więcej informacji można znaleźć w artykule Umieszczanie predykatów przed lub po wybieraniu ścieżki.
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 WALK, co pozwala na powtarzające się węzły i krawędzie. Użyj innego trybu ścieżki, gdy potrzebujesz bardziej rygorystycznej unikalności elementów.
| Tryb ścieżki | Behavior | Użyj, gdy... |
|---|---|---|
WALK |
Pozwala na powtarzające się węzły i krawędzie (domyślnie) | Chcesz, aby wszystkie pasujące ścieżki mieściły się w obrębie skończonego ograniczenia. |
TRAIL |
Brak powtarzających się krawędzi | Chcesz unikać ponownego przechodzenia tą samą krawędzią, ale ten sam węzeł może zostać osiągnięty różnymi krawędziami. |
SIMPLE |
Brak powtarzających się węzłów poza wspólnym węzłem startowym i końcowym oraz brak powtarzających się krawędzi | 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 czy krawędzi | 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.
Dla SIMPLE i ACYCLIC unikalność krawędzi wynika z unikalności węzłów. Ścieżka SIMPLE może się zamknąć, wracając do pierwszego węzła, ale nadal nie może użyć tej samej krawędzi ponownie.
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)
LET personId = dst.id
RETURN personId, dst.firstName, dst.lastName, count(*) AS pathCount
GROUP BY personId, dst.firstName, dst.lastName
ORDER BY pathCount DESC
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
Domyślny tryb dopasowania REPEATABLE ELEMENTS pozwala na ponowne użycie krawędzi przez różne ścieżki w obrębie tego samego wzorca grafu. Użyj DIFFERENT EDGES lub DIFFERENT RELATIONSHIPS, gdy każde wiązanie krawędzi we wszystkich ścieżkach musi być inne:
MATCH DIFFERENT EDGES
(p:Person)-[:knows]->(friend:Person),
(p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100
Wróć jedną najkrótszą ścieżką
ALL jest domyślnym przeszukiwaniem ścieżek i zwraca każdą pasującą ścieżkę. Użyj ANY SHORTEST, aby zwrócić jedną najkrótszą ścieżkę dla każdej pary źródło–cel. Następujące zapytanie wskazuje jedną najkrótszą ścieżkę z Alicji do Boba:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p, path_length(p) AS hopCount
Gdy istnieje kilka równie najkrótszych ścieżek, to, która z nich zostanie zwrócona, nie jest deterministyczne.
Wyszukiwania ścieżek ALL SHORTEST i ANY nie są obsługiwane.
Umiejscowienie predykatów może zmienić wynik ANY SHORTEST. Wbudowane predykaty węzłów i krawędzi ograniczają, które ścieżki mogą zostać wybrane, natomiast postfiltr może usunąć wybraną ścieżkę bez wybrania w zamian dłuższej ścieżki. Zobacz Umieszczanie predykatów przed lub po wyborze ścieżki.
Wskazówka
Preferuj skończoną górną granicę przewidywalnego kosztu zapytania. Nie wspiera się nieograniczone ALL WALK wzorce. Nieograniczone wzorce z TRAIL, SIMPLE lub ACYCLIC kończą działanie dzięki unikalności elementów, ale nadal mogą zwracać wiele ścieżek. Unbounded ANY SHORTEST WALK obsługuje tylko określone kształty zapytań. 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. Użyj ponownie zmiennej, gdy wzorce muszą wiązać ten sam element grafu.
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.
Rozłączone wzorce również są poprawne, ale tworzą iloczyn kartezjański swoich dopasowań. Używaj ich tylko wtedy, gdy celowo potrzebujesz każdej kombinacji. Wskazówki dotyczące wydajności można znaleźć w artykule Używaj zmiennych współdzielonych dla efektywnych połączeń.
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