Schreiben von Diagrammmusterabfragen in Microsoft Fabric

Mit dem Diagrammmusterabgleich können Sie die Struktur der Daten beschreiben, die Sie mithilfe intuitiver visueller Syntax finden möchten. Anstatt Tabellen zu verknüpfen, schreiben Sie Muster, die wie die Beziehungen selbst aussehen – Knoten, die durch Ränder verbunden sind. In diesem Artikel erfahren Sie, wie Sie GQL-Musterabfragen für allgemeine Szenarien in Diagrammen in Microsoft Fabric schreiben.

In den Beispielen wird das Beispiel-Dataset für soziale Netzwerke verwendet. Eine vollständige Mustersyntaxreferenz finden Sie unter GQL-Diagrammmuster.

Nutzen Sie diesen Artikel, um zu lernen, wie man Knoten-, Kanten- und Pfadmuster konstruiert und kombiniert. Für anpassungsbereite Aufgaben wie das Finden von Nachbarn oder Entitäten ohne Beziehungen siehe Write common GQL Queries. Für Filter-, Gruppierungs- und Aggregations-Workflows siehe Filter- und aggregierende Graphdaten.

Voraussetzungen

Direkte Beziehungen abgleichen

Ein einfaches Muster entspricht einem Knotentyp, einem bestimmten Edgetyp und einem anderen Knotentyp. Die Syntax sieht wie ein Diagramm der Beziehung aus.

Um beispielsweise bis zu 100 Personen zu finden, die mit dem Unternehmen gekoppelt sind, bei dem sie arbeiten:

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

Verwenden Sie ein ungerichtetes Kantenmuster, wenn Sie die Richtung nicht kennen oder es Ihnen egal ist. Um beispielsweise bis zu 100 gegenseitige Bekannte zu finden, unabhängig davon, wer die Verbindung initiiert hat:

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

Note

Graph unterstützt derzeit nicht das Erstellen von nicht geleiteten Kanten, Sie können jedoch Ränder in beliebiger Richtung mithilfe der -[:label]- Syntax abfragen.

Filtermuster mit Inline WHERE

Platziere WHERE innerhalb des Musters, wenn eine Bedingung definiert, welcher Knoten oder welche Kante am Match teilnehmen kann. Verwenden Sie eine Bedingung auf Anweisungsebene MATCH ... WHERE, um den abgeschlossenen Treffer nachträglich zu filtern, oder ein separates FILTER, wenn die Bedingung auf die von einer früheren Anweisung erzeugte Zeile angewendet wird. Die Prädikatenplatzierung kann die Ergebnisse des kürzesten Pfades verändern. Weitere Informationen finden Sie unter Platz-Prädikate vor oder nach der Pfadauswahl.

Um beispielsweise Personen zu finden, die vor 1990 geboren wurden, die in einem Unternehmen arbeiten, dessen Name mit "A" beginnt:

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

Filtern Sie nach Edgeeigenschaften, um einzuschränken, welche Beziehungen übereinstimmen. Um beispielsweise nur Personen zurückzugeben, die 2010 oder später in einem Unternehmen zu arbeiten begonnen haben.

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

Anpassung von Multi-Hop-Beziehungen

Verwenden Sie Muster mit variabler Länge, um mehrere Sprünge in einem Ausdruck zu überwinden. Geben Sie die minimale und maximale Anzahl von Hops mit der Syntax {min,max} an.

Um beispielsweise bis zu 100 Menschen zu finden, die innerhalb von zwei bis vier Grad Freundschaft von Alice erreichbar sind:

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

Um bis zu 100 direkte und zweitgradige Verbindungen (einen oder zwei Sprünge) von Alice zu finden:

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

Steuern der Durchquerung mit Pfadmodi

Standardmäßig verwendet GQL WALK, was wiederholte Knoten und Kanten ermöglicht. Benutze einen anderen Pfadmodus, wenn du strengere Element-Eindeutigkeit brauchst.

Pfadmodus Behavior Verwenden, wenn ...
WALK Erlaubt wiederholte Knoten und Kanten (Standard) Du willst alle passenden Wege innerhalb einer endlichen Schranke finden.
TRAIL Keine wiederholten Kanten Man möchte vermeiden, dieselbe Kante zu wiederholen, aber derselbe Knoten kann durch verschiedene Kanten erscheinen.
SIMPLE Keine wiederholten Knoten außer einem gemeinsamen Start- und Endknoten, und keine wiederholten Kanten Sie möchten, dass kein Knoten mehr als einmal innerhalb eines Pfads vorkommt, aber Pfade zulassen, die sich wieder zum Anfang schließen. Nützlich zum Erkennen von Schleifen.
ACYCLIC Keine wiederholten Knoten oder Kanten Sie müssen sicherstellen, dass kein Knoten mehr als einmal im Pfad angezeigt wird. Wird für strenge Hierarchien, Linien oder alle Durchgänge verwendet, bei denen das Erneute Anarbeiten eines Knotens zu falschen Ergebnissen führen würde.

WALK ist der restriktivste Modus und ACYCLIC ist der restriktivste.

Für SIMPLE und ACYCLICfolgt die Kanteneindeutigkeit aus der Knoteneindeutigkeit. Ein SIMPLE Pfad kann sich schließen, indem er zu seinem ersten Knoten zurückkehrt, aber er kann eine Kante trotzdem nicht wiederverwenden.

Um den Unterschied zu veranschaulichen, betrachten Sie den Pfad Alice → Bob → Carol → Bob:

  • WALK – ermöglicht diesen Pfad. Knoten und Kanten können frei wiederholt werden.
  • TRAIL – ermöglicht diesen Pfad. Bob erscheint zweimal, aber jede benutzte Kante ist eine andere Beziehung (Alice→Bob und Carol→Bob sind unterschiedliche Kanten), was bedeutet, dass keine Kante wiederholt wird.
  • EINFACH – blockiert diesen Pfad. Bob wird mehr als einmal angezeigt, und SIMPLE ermöglicht es nur, einen Knoten zu wiederholen, wenn er sowohl der Anfang als auch das Ende des Pfads (ein geschlossener Zyklus) ist. Hier ist Alice der Start und Bob ist das Ende, sodass keine Ausnahme gilt.
  • ACYCLIC – blockiert diesen Pfad. Bob erscheint mehr als einmal irgendwo im Pfad.

Das folgende Beispiel zeigt, wie Sie TRAIL verwenden können, um zu zählen, wie viele Pfade unterschiedlicher Art zu jedem der ersten 100 Menschen führen, die innerhalb von vier Sprüngen im Netzwerk von Alice erreichbar sind.

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

Verwenden Sie ACYCLIC , um bis zu 100 Personen zurückzugeben, die von Alice innerhalb von vier Hops erreichbar sind, wobei jede Person im Pfad einzigartig ist.

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

Der Standard-Match-Modus REPEATABLE ELEMENTS erlaubt es, eine Kante durch separate Pfade im selben Graphenmuster wiederzuverwenden. Verwenden Sie DIFFERENT EDGES oder DIFFERENT RELATIONSHIPS, wenn jede Kantenbindung in allen Pfaden unterschiedlich sein muss:

MATCH DIFFERENT EDGES
  (p:Person)-[:knows]->(friend:Person),
  (p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100

Gibt einen kürzesten Pfad zurück

ALL ist die Standard-Pfadsuche und liefert jeden passenden Pfad zurück. Verwenden Sie ANY SHORTEST , um für jedes Quell-Ziel-Paar einen kürzesten Pfad zurückzugeben. Die folgende Abfrage findet einen kürzesten Weg von Alice zu Bob:

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

Wenn mehrere kürzeste Pfade zusammenkommen, ist der zurückgegebene Pfad nicht deterministisch. ALL SHORTEST und ANY Pfadsuchen werden nicht unterstützt.

Die Prädikatenplatzierung kann das Ergebnis von ANY SHORTESTverändern. Inline-Knoten- und Kantenprädikate schränken ein, welche Pfade zulässig sind, während ein Postfilter den ausgewählten Pfad entfernen kann, ohne stattdessen einen längeren Pfad zu wählen. Siehe Platzprädikate vor oder nach der Pfadwahl.

Tip

Bevorzugen Sie eine endliche obere Schranke für vorhersehbare Abfragekosten. Unbegrenzte ALL WALK Muster werden nicht unterstützt. Unbeschränkte Muster mit TRAIL, SIMPLE, oder ACYCLIC enden durch Element-Eindeutigkeit, können aber dennoch viele Wege zurückgeben. Unbounded ANY SHORTEST WALK unterstützt nur spezifische Abfrageformen. Weitere Informationen finden Sie unter "Aktuelle Einschränkungen".

Verwenden von Variablenwiederverwendung zum Ausdrücken gemeinsamer Entitäten

Durch die Wiederverwendung derselben Variablen in zwei Teilen eines Musters wird eine implizite Gleichheitseinschränkung erstellt. Beide Verweise müssen mit demselben Knoten übereinstimmen. Mit dieser Technik können Sie zum Ausdruck bringen, „Entitäten zu finden, die über eine gemeinsame dritte Entität verbunden sind".

Um beispielsweise bis zu 100 Personenpaare zu finden, die einander kennen und am gleichen Unternehmen arbeiten:

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

Die Variable c wird für beide workAt Ziele wiederverwendet, sodass die Abfrage nur Paare zurückgibt, bei denen beide Personen einander kennen und bei demselben Unternehmen arbeiten.

So finden Sie bis zu 100 Paare von Personen, die beide denselben Beitrag gefällten:

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

Tip

Die WHERE a.id < b.id Bedingung verhindert, dass doppelte Paare (Alice + Bob und Bob + Alice) in den Ergebnissen angezeigt werden.

Kombinieren mehrerer Muster

Auflisten mehrerer Muster in einem einzelnen MATCH, durch Kommas getrennt. Verwenden Sie eine Variable wieder, wenn die Muster dasselbe Graphelement binden müssen.

Um beispielsweise bis zu 100 Personen zusammen mit ihrem Arbeitsplatz und der Stadt zu finden, in der sie leben:

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

Die freigegebene Variable p verbindet die beiden Muster. Jede Ergebniszeile stellt eine Person mit ihrem Unternehmen und ihrer Stadt dar.

Nicht zusammenhängende Muster sind ebenfalls gültig, bilden aber ein kartesisches Produkt ihrer Übereinstimmungen. Benutze sie nur, wenn du absichtlich jede Kombination brauchst. Hinweise zur Leistung finden Sie unter Verwenden Sie gemeinsame Variablen für effiziente Joins.

Optionale Beziehungen abgleichen

Verwenden Sie OPTIONAL MATCH , wenn eine Beziehung für jeden Knoten möglicherweise nicht vorhanden ist. Zeilen ohne Übereinstimmung werden mit NULL Werten beibehalten, ähnlich einem SQL LEFT JOIN.

Geben Sie beispielsweise bis zu 100 Personen mit ihrem Firmennamen zurück, einschließlich Personen ohne Arbeitgeber (d. h., die für die Unternehmensspalte NULL zurückkehren):

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

Verwenden Sie nach IS NULL , OPTIONAL MATCH um bis zu 100 Personen zu finden, die nicht in einem Unternehmen arbeiten:

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