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.
Ten artykuł zawiera praktyczne wzorce zapytań języka GQL dla typowych zadań grafu w Microsoft Fabric: znajdowanie sąsiadów, przechodzenie przez połączenia wielohopowe, identyfikowanie połączeń udostępnionych, liczenie relacji i znajdowanie jednostek bez połączeń.
W przykładach użyto przykładowego zestawu danych sieci społecznościowej. Szczegółowe wyjaśnienie przepływu zapytań i instrukcji można znaleźć w przewodniku językowym GQL. Korzystaj z tego artykułu, gdy wiesz, jakie zadanie grafu chcesz wykonać. Aby uzyskać systematyczne instrukcje dotyczące konstruowania wzorców węzłów, krawędzi i ścieżek, zobacz Write graph pattern queries. Aby uzyskać szczegółowe workflowy filtrowania i agregacji, zobacz Filtruj i agreguj dane grafowe.
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.
Znajdowanie bezpośrednich sąsiadów
Zwróć wszystkie węzły połączone z węzłem początkowym przez jeden przeskok.
Znajdź wszystkich, których dana osoba zna:
MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName
Znajdź wszystkie firmy, w których pracowała osoba:
MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url
Znajdź znajomych znajomych (multi-hop)
Użyj wzorców o zmiennej długości, aby za pomocą {min,max} pokonać więcej niż jeden skok.
Znajdź osoby oddalone od Alice dokładnie o dwie knows krawędzie:
MATCH (alice:Person WHERE alice.firstName = 'Alice')-[:knows]->{2,2}(fof:Person)
RETURN DISTINCT fof.firstName, fof.lastName
LIMIT 100
Znajdź wszystkich osiągalnych w zasięgu trzech stopni.
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,3}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Znajdź najkrótszą ścieżkę z Alice do każdej osoby, którą można osiągnąć w ciągu czterech skoków:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, path_length(p) AS hopCount
ORDER BY hopCount, dst.lastName
LIMIT 100
Jeśli wiele najkrótszych ścieżek prowadzi do tej samej osoby przy tej samej liczbie przeskoków, ANY SHORTEST zwraca jedną z nich bez deterministycznego rozstrzygania remisu.
Predykaty wbudowane ograniczają, które ścieżki kwalifikują się do ANY SHORTEST.
Postfiltry stosuje się po wybraniu najkrótszej ścieżki. Przykłady znajdują się w artykule Umieszczanie warunków przed lub po wybieraniu ścieżki.
Wskazówka
Użyj skończonej górnej granicy dla przewidywalnych kosztów zapytań. Nieograniczone ALL WALK przemieszczanie się nie jest wspierane. Inne tryby ścieżek bez ograniczeń nadal mogą generować obszerne wyniki. Zobacz Bieżące ograniczenia.
Zlicz relacje na jednostkę
Użyj polecenia GROUP BY , count(*) aby policzyć liczbę relacji, które ma każda jednostka.
Szczegółowe grupowanie, filtrowanie agregowane i wzorce routingu warunkowego można znaleźć w artykule Filtruj i agreguj dane grafów.
Zlicz, ile znajomych ma każda osoba, uporządkowanych od większości do najmniejszych:
MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
ORDER BY friendCount DESC
LIMIT 20
Oblicz wartość dla każdej jednostki
Użyj powiązanego podzapytania, CALL aby obliczyć wartość dla każdego wiersza wejściowego. Zmienne z zewnętrznego zapytania są domyślnie dostępne wewnątrz podzapytania.
Oblicz liczbę przyjaciół dla każdej osoby:
MATCH (p:Person)
CALL {
MATCH (p)-[:knows]->(friend:Person)
RETURN count(*) AS friendCount
}
RETURN p.firstName, p.lastName, friendCount
ORDER BY friendCount DESC
Zmienne zewnętrzne pozostają dostępne po CALL. Spośród zmiennych utworzonych wewnątrz podzapytania tylko zwracane kolumny stają się dostępne poza nim. Niezgrupowane count(*) zwraca 0, gdy nie istnieją pasujący znajomi, więc to zapytanie zachowuje osoby, które nie mają znajomych.
Zwykłe CALL pomija wiersz zewnętrzny, gdy podzapytanie nie zwraca żadnych wierszy, i tworzy jeden wiersz wyjściowy dla każdego wiersza podzapytania, gdy zwraca ono wiele wierszy. Używaj OPTIONAL CALL, gdy musisz zachować zewnętrzny wiersz, który nie ma odpowiadającego wiersza podzapytania.
Znajdowanie połączeń udostępnionych
Ponowne użycie zmiennej w dwóch częściach wzorca tworzy niejawne ograniczenie "tego samego węzła". Użyj tego ograniczenia, aby znaleźć jednostki połączone za pośrednictwem udostępnionej trzeciej jednostki.
Znajdź pary osób, które znają tę samą osobę:
MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100
Znajdź pary osób, które pracują w tej samej firmie:
MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100
Wskazówka
Warunek WHERE a.id < b.id uniemożliwia pojawienie się zduplikowanych par (Alice–Bob i Bob–Alice) w wynikach.
Znajdowanie jednostek bez relacji
Użyj NOT EXISTS do znalezienia węzłów, dla których skorelowane podzapytanie nie zwraca żadnych wierszy.
Znajdź osoby, które nie pracują w żadnej firmie:
MATCH (p:Person)
WHERE NOT EXISTS {
MATCH (p)-[:workAt]->(c:Company)
RETURN c
}
RETURN p.firstName, p.lastName
LIMIT 100
Znajdź wpisy bez komentarzy:
MATCH (post:Post)
WHERE NOT EXISTS {
MATCH (comment:Comment)-[:replyOf]->(post)
RETURN comment
}
RETURN post.id, post.content
LIMIT 100
Znajdowanie jednostek z wieloma połączeniami
Połącz GROUP BY i FILTER , aby zidentyfikować węzły o wysokim stopniu połączenia. Ta metoda jest przydatna do znajdowania węzłów lub wartości odstających.
Znajdź osoby z ponad 10 przyjaciółmi:
MATCH (p:Person)-[:knows]->(friend:Person)
LET personId = p.id, name = p.firstName || ' ' || p.lastName
RETURN personId, name, count(*) AS friendCount
GROUP BY personId, name
FILTER friendCount > 10
ORDER BY friendCount DESC
Note
FILTER po GROUP BY działa podobnie jak HAVING w SQL. Filtruje on zagregowany wynik, a nie poszczególne wiersze.