Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält praktische GQL-Abfragemuster für allgemeine Diagrammaufgaben in Microsoft Fabric: Suchen von Nachbarn, Durchlaufen von Multihopverbindungen, Identifizieren freigegebener Verbindungen, Zählen von Beziehungen und Suchen von Entitäten ohne Verbindungen.
In den Beispielen wird das Beispiel-Dataset für soziale Netzwerke verwendet. Für eine vollständige Erklärung des Abfrageflusses und der Anweisungen siehe GQL-Sprachleitfaden. Verwenden Sie diesen Artikel, wenn Sie wissen, welche Graphenaufgabe Sie erfüllen möchten. Für systematische Anweisungen zum Aufbau von Knoten-, Kanten- und Pfadmustern siehe Schreib Graphenmuster-Abfragen. Für detaillierte Filter- und Aggregations-Workflows siehe Filter- und aggregierende Graphdaten.
Voraussetzungen
- Ein Graphenelement, das aus dem Beispieldatensatz für soziale Netzwerke erstellt wurde, mit den Knotentypen, Kantentypen und Eigenschaften, die im Beispiel des sozialen Netzwerk-Schemas beschrieben sind.
- Vertrautheit mit grundlegenden
MATCHundRETURNAbfragen. Siehe GQL-Sprachhandbuch.
Direkte Nachbarn finden
Gibt alle Knoten zurück, die durch einen Hop mit einem Startknoten verbunden sind.
Suchen Sie alle Personen, die eine bestimmte Person kennt:
MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName
Suchen Sie alle Unternehmen, an der eine Person gearbeitet hat:
MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url
Freunde von Freunden suchen (Multi-Hop)
Verwenden Sie {min,max} mit Mustern variabler Länge, um mehrere Sprünge zu durchlaufen.
Finden Sie Personen, die von Alice aus über genau zwei knows Kanten erreichbar sind:
MATCH (alice:Person WHERE alice.firstName = 'Alice')-[:knows]->{2,2}(fof:Person)
RETURN DISTINCT fof.firstName, fof.lastName
LIMIT 100
Finden Sie alle innerhalb von drei Grad erreichbaren Personen:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,3}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Finde einen kürzesten Weg von Alice zu jeder Person, der innerhalb von vier Sprüngen erreichbar ist:
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
Wenn mehrere kürzeste Wege dieselbe Person in gleicher Anzahl von Sprüngen erreichen, ANY SHORTEST gibt einer davon ohne deterministische Tie-Wahl zurück.
Inline-Prädikate schränken ein, welche Pfade für ANY SHORTEST infrage kommen.
Postfilter werden angewendet, nachdem ein kürzester Pfad ausgewählt wurde. Beispiele finden sich unter Platzprädikate vor oder nach der Pfadauswahl.
Tip
Verwenden Sie eine endliche obere Schranke für vorhersehbare Abfragekosten. Unbegrenzte ALL WALK Durchquerung wird nicht unterstützt. Andere unbeschränkte Pfadmodi können dennoch große Ergebnisse liefern. Weitere Informationen finden Sie unter "Aktuelle Einschränkungen".
Zählen von Beziehungen pro Entität
Verwenden Sie GROUP BY zusammen mit count(*), um zu zählen, wie viele Beziehungen jede Entität hat.
Für detaillierte Gruppierung, aggregierte Filterung und bedingte Routing-Muster siehe Filter- und aggregierte Graphendaten.
Zählen Sie, wie viele Freunde jede Person hat, sortiert von den meisten bis zu wenigen:
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
Berechnen Sie für jede Entität einen Wert
Verwenden Sie eine korrelierte CALL Unterabfrage, um für jede Eingabezeile einen Wert zu berechnen. Variablen aus der äußeren Abfrage sind implizit innerhalb der Unteranfrage verfügbar.
Berechnen Sie die Anzahl der Freunde pro Person:
MATCH (p:Person)
CALL {
MATCH (p)-[:knows]->(friend:Person)
RETURN count(*) AS friendCount
}
RETURN p.firstName, p.lastName, friendCount
ORDER BY friendCount DESC
Äußere Variablen bleiben nach CALL verfügbar. Von den innerhalb der Unterabfrage erstellten Variablen sind außerhalb nur zurückgegebene Spalten verfügbar. Ein ungruppiertes count(*) gibt 0 zurück, wenn keine passenden Freunde vorhanden sind, sodass diese Abfrage auch Personen ohne Freunde beibehält.
Ordinary entfernt eine äußere Zeile CALL , wenn die Unterabfrage keine Zeilen zurückgibt, und erzeugt für jede Unterabfrage eine Ausgabezeile, wenn sie mehrere Zeilen zurückgibt. Verwenden Sie OPTIONAL CALL, wenn Sie eine Zeile der äußeren Abfrage beibehalten möchten, für die es keine passende Zeile in der Unterabfrage gibt.
Suchen nach gemeinsamen Verbindungen
Durch die Wiederverwendung einer Variablen in zwei Teilen eines Musters wird eine implizite Einschränkung "gleicher Knoten" erstellt. Verwenden Sie diese Bedingung, um Entitäten zu finden, die über eine gemeinsame dritte Entität verbunden sind.
Suchen Sie Paare von Personen, die beide die gleiche Person kennen:
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
Suchen Sie Paare von Personen, die im selben Unternehmen arbeiten:
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
Tip
Die WHERE a.id < b.id Bedingung verhindert, dass doppelte Paare (Alice-Bob und Bob-Alice) in Ergebnissen angezeigt werden.
Suchen nach Entitäten ohne Beziehungen
Verwenden Sie NOT EXISTS , um Knoten zu finden, für die eine korrelierte Unterabfrage keine Zeilen zurückgibt.
Suchen Sie Personen, die nicht in einem Unternehmen arbeiten:
MATCH (p:Person)
WHERE NOT EXISTS {
MATCH (p)-[:workAt]->(c:Company)
RETURN c
}
RETURN p.firstName, p.lastName
LIMIT 100
Beiträge ohne Kommentare suchen:
MATCH (post:Post)
WHERE NOT EXISTS {
MATCH (comment:Comment)-[:replyOf]->(post)
RETURN comment
}
RETURN post.id, post.content
LIMIT 100
Suchen nach Entitäten mit vielen Verbindungen
Kombinieren Sie GROUP BY und FILTER, um hoch verbundene Knoten zu identifizieren. Diese Methode ist nützlich, um Hubs oder Ausreißer zu finden.
Personen mit mehr als 10 Freunden finden:
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 nach GROUP BY funktioniert wie HAVING in SQL. Sie filtert nach dem aggregierten Ergebnis, nicht nach den einzelnen Zeilen.