Pisanie typowych zapytań GQL 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.

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ń.

Przykłady korzystają z przykładowego zestawu danych sieci społecznościowej. Aby uzyskać pełną dokumentację języka, zobacz Przewodnik po języku GQL.

Wymagania wstępne

  • Element grafu z załadowanymi danymi. Jeśli jesteś nowicjuszem w grafach, najpierw ukończ samouczek.
  • Znajomość podstawowych MATCH i RETURN zapytań. 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ź ludzi dwa stopnie oddalenia - znajomi znajomych Alicji, których Alicja nie zna osobiście.

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

Wskazówka

Zawsze ustanawiaj górną granicę dla iteracji o zmiennej długości. Nieograniczone wzorce na dużych lub gęstych grafach mogą przekroczyć limit czasu zapytania. Zobacz Bieżące ograniczenia.

Zlicz relacje na jednostkę

Użyj polecenia GROUP BY , count(*) aby policzyć liczbę relacji, które ma każda jednostka.

Zlicz, ile znajomych ma każda osoba, uporządkowanych od większości do najmniejszych:

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
ORDER BY friendCount DESC
LIMIT 20

Zlicz, ile pracowników pracuje w każdej firmie:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC

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 OPTIONAL MATCH, a następnie sprawdzania wartości null, aby znaleźć węzły, które nie mają zgodnej relacji.

Znajdź osoby, 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

Znajdź wpisy bez komentarzy:

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
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 name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY 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.