GQL-Diagrammmuster

Graph-Muster sind kernbausteine Ihrer GQL-Abfragen in Graph in Microsoft Fabric. Sie beschreiben die Im Diagramm gesuchten Strukturen mithilfe von Knoten und Kanten auf intuitive, visuelle Weise. Stellen Sie sich Diagrammmuster als Vorlagen vor, die vom Abfragemodul mit den tatsächlichen Daten in Ihrem Diagramm abgeglichen werden sollen.

In diesem Artikel werden die Syntax- und Kompositionsregeln für Diagrammmuster in GQL erläutert.

Von Bedeutung

In diesem Artikel wird ausschließlich das Beispieldiagramm-Dataset für soziale Netzwerke verwendet.

Einfache Elementmuster

Einfache Elementmuster helfen Ihnen beim Abgleichen einzelner Knoten und Kanten aus Ihrem Diagramm, die bestimmte Anforderungen erfüllen. Diese Muster bilden die Grundlage für komplexere Musterabgleiche.

Einfache Knotenmuster

Ein Knotenmuster gibt die Beschriftungen und Eigenschaften an, die ein Knoten erfüllen muss:

(:Place&City { name: "New York" })

Dieses Muster gleicht alle Knoten ab, die sowohl die als Place die City Beschriftungen aufweisen (die durch den & Operator angegeben sind) und deren name Eigenschaft gleich ist"New York". Diese Kombination von erforderlichen Beschriftungen und Eigenschaften wird als Füllfeld des Knotenmusters bezeichnet.

Schlüsselkonzepte:

  • Bezeichnungsabgleich: Verwenden, & um mehrere Bezeichnungen zu erfordern.
  • Eigenschaftenfilterung: Geben Sie genaue Werte an, die Eigenschaften übereinstimmen müssen.
  • Flexibler ("kovarianter") Abgleich: Übereinstimmende Knoten können mehr Bezeichnungen und Eigenschaften aufweisen, die über die angegebenen hinausgehen.

Hinweis

Knoten können mehrere Bezeichnungen aufweisen, aber Edgetypen mit mehreren Bezeichnungen werden noch nicht unterstützt.

Einfache Kantenmuster

Edgemuster sind komplexer als Knotenmuster. Sie spezifizieren nicht nur einen Füller, sondern verbinden auch ein Ursprungsknotenmuster mit einem Zielknotenmuster. Edgemuster beschreiben Anforderungen sowohl am Edge als auch an den Endpunkten:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

Die Pfeilrichtung -[...]-> ist wichtig – sie bestimmt (:Person) das Ursprungsknotenmuster und (:Comment) das Zielknotenmuster. Das Verständnis der Edgerichtung ist entscheidend für die ordnungsgemäße Abfrage Ihres Diagramms.

Entsprechendes gespiegeltes Muster:

Sie können den Pfeil kippen und die Knotenmuster austauschen, um das entsprechende gespiegelte Kantenmuster zu erstellen:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Dieses Muster findet die gleichen Beziehungen, aber aus der entgegengesetzten Perspektive.

Alle gerichteten Kantenmuster

Wenn die Richtung eines Diagrammrands für Ihre Abfrage nicht wichtig ist, können Sie sie nicht angegeben lassen, indem Sie ein beliebiges gerichtetes Randmuster erstellen:

(:Song)-[:inspired]-(:Movie)

Dieses Muster entspricht denselben Kanten wie (:Song)-[:inspired]->(:Movie) und (:Movie)-[:inspired]->(:Song) kombiniert, unabhängig davon, welcher Knoten der Ursprung und welcher das Ziel ist (dieses Beispiel stammt nicht aus dem Graph-Typ des sozialen Netzwerks).

Verknüpfungen für Graph-Randmuster

GQL bietet praktische Tastenkombinationen für allgemeine Edgemuster, um Ihre Abfragen präziser zu gestalten:

  • ()->() steht für ()-[]->() (gerichtete Kante mit beliebigem Etikett)
  • ()<-() steht für ()<-[]-() (gerichteter Rand in umgekehrter Richtung mit beliebiger Beschriftung)
  • ()-() steht für ()-[]-() (beliebige Kante mit beliebiger Beschriftung)

Diese Tastenkombinationen können nützlich sein, wenn Sie sich um Konnektivität, aber nicht um den spezifischen Graph-Randtyp kümmern.

Bezeichnungsausdrücke

Muster können komplexe Anforderungen an die Bezeichnungen übereinstimmener Knoten und Kanten ausdrücken.

Example:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

Dies zählt die Anzahl der isLocatedIn Ränder, die Knoten verbinden Person oder Organization-aber nicht-Company Knoten (die immer University Knoten im Schema des sozialen Netzwerks sind) mit City oder Country Knoten.

Syntax:

Syntax Bedeutung
A&B Bezeichnungen müssen sowohl A als auch B enthalten.
A|B Bezeichnungen müssen mindestens einen von A oder B enthalten.
!A Bezeichnungen müssen A ausschließen.

Verwenden Sie außerdem die Klammer, um die Reihenfolge der Beschriftungsausdrucksauswertung zu steuern. Hat standardmäßig ! die höchste Rangfolge und & hat eine höhere Rangfolge als |. Daher !A&B|C|!D ist dasselbe wie ((!A)&B)|C|(!D).

Bindungsvariablen

Mithilfe von Variablen können Sie auf übereinstimmende Diagrammelemente in anderen Teilen Ihrer Abfrage verweisen. Das Verständnis der Bindung und Verwendung von Variablen ist für die Erstellung leistungsstarker Abfragen unerlässlich.

Bindungselementvariablen

Sowohl Knoten- als auch Edgemuster können übereinstimmende Knoten und Kanten für spätere Verweise an Variablen binden.

(p:Person)-[w:workAt]->(c:Company)

In diesem Muster p ist an übereinstimmende Person Knoten gebunden, w an übereinstimmende workAt Kanten und c an übereinstimmende Company Knoten.

Variable Wiederverwendung für strukturelle Einschränkungen:

Wenn Sie dieselbe Variable in einem Muster mehrmals wiederverwenden, wird eine Einschränkung der Struktur der Übereinstimmungen ausgedrückt. Jedes Vorkommen derselben Variablen muss immer an dasselbe Diagrammelement in einer gültigen Übereinstimmung gebunden werden. Die variable Wiederverwendung ist leistungsfähig, um komplexe strukturelle Anforderungen auszudrücken.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Das Muster findet Person Knoten x , die y einander kennen und an demselben CompanyArbeiten arbeiten, das an die Variable cgebunden ist. Durch die Wiederverwendung wird c sichergestellt, dass beide Personen im selben Unternehmen arbeiten.

Muster-Prädikate mit Elementvariablen:

Mit Bindungselementvariablen können Sie Knoten- und Edgemuster-Prädikate angeben. Anstatt nur einen Füllstoff mit exakten Eigenschaftswerten wie { name: "New York, USA" }z. B. bereitzustellen, kann ein Füllfeld ein Prädikat angeben, das für jedes Kandidatenelement ausgewertet wird. Das Muster stimmt nur überein, wenn das Prädikat zu TRUE:

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

Das Randmuster findet Personen, die sich seit dem 1. Januar 2000 gegenseitig kennen, und verwendet eine flexible Bedingung anstelle einer exakten Übereinstimmung.

Hinweis

Edgemustervariablen binden immer an den einzelnen Rand im Edgemuster-Prädikat, auch bei Verwendung von Mustern mit variabler Länge. Dies kann hilfreich sein, wenn Sie nicht die größten Gruppenlistenvariablen zum Ausführen eines Nachfilters ausführen müssen. Siehe Bind Variable-Length-Muster-Edgevariablen.

Erweiterte Muster-Prädikattechniken:

Muster-Prädikate bieten leistungsstarke Inlinefilterfunktionen, die die Lesbarkeit von Abfragen verbessern können:

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.birthday < 19900101 AND p.gender = 'female')
      -[:workAt]->
      (c:Company WHERE c.name STARTS WITH 'A')

-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL

-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL

Tipp

Behalte ein Prädikat im Muster, wenn es beschreibt, welcher Knoten oder welche Kante am Match teilnehmen kann.

Bindungspfadvariablen

Sie können auch einen übereinstimmenden Pfad an eine Pfadvariable zur weiteren Verarbeitung binden oder die vollständige Pfadstruktur an den Benutzer zurückgeben:

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Hier ist an einen Pfadwert gebunden, p der die vollständige übereinstimmende Pfadstruktur darstellt, einschließlich Der Referenzwerte für alle Knoten und Kanten in der angegebenen Reihenfolge.

Gebundene Pfade können entweder an den Benutzer zurückgegeben oder mit Funktionen wie NODES oder EDGESweiterverarbeitet werden:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

Verfassenmuster

Reale Abfragen erfordern häufig komplexere Muster als einfache Knoten-Edge-Knotenstrukturen. GQL bietet verschiedene Möglichkeiten zum Verfassen von Mustern für komplexe Diagramm-Traversale.

Pfadmuster zum Verfassen

Pfadmuster können durch Verketten einfacher Knoten- und Randmuster erstellt werden, um längere Durchläufe zu erstellen.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Das Muster durchläuft eine Person durch ihre sozialen und beruflichen Verbindungen, um zu finden, wo sich das Unternehmen ihres Kollegen befindet.

Stückweise Musterkonstruktion: Sie können Pfadmuster auch inkrementeller erstellen, wodurch komplexe Muster leichter zu lesen und zu verstehen sind:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Bei diesem Ansatz wird die gleiche Durchquerung in logische Schritte unterteilt, wodurch es einfacher zu verstehen und zu debuggen ist.

Nichtlineare Muster verfassen

Die resultierende Form eines Musters muss kein linearer Pfad sein. Sie können komplexere Strukturen wie sternförmige Muster abgleichen, die von einem zentralen Knoten ausstrahlen:

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

Das Muster findet eine Person zusammen mit ihren Bildungs-, Beschäftigungs- und Inhaltseinstellungen auf einmal – eine umfassende Profilabfrage.

Muster in derselben MATCH Variante müssen keine gemeinsame Variable haben. Nicht zusammenhängende Muster bilden ein kartesisches Produkt ihrer Übereinstimmungen. Verwenden Sie eine Variable wieder, wenn die Muster dasselbe Graphelement binden sollten und nur verbundene Kombinationen erhalten bleiben sollten.

Wiederverwendung von Steuerelementen

GQL steuert wiederholte Knoten und Kanten auf zwei Ebenen:

  • Ein Match-Modus gilt für das vollständige Graphenmuster, einschließlich kommagetrennter Pfade.
  • Ein Pfadmodus gilt für einen Pfad.

Der Standard-Matchmodus ist REPEATABLE ELEMENTS. Es erlaubt die Bindung desselben Elements in verschiedenen Teilen des Graphenmusters, abhängig vom Pfadmodus jedes Pfades. Du kannst es explizit schreiben:

REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Verwenden DIFFERENT EDGES Sie oder ihr Synonym DIFFERENT RELATIONSHIPS , um Kanten-Eindeutigkeit über das gesamte Graphenmuster zu verlangen. Dieser Match-Modus verändert auch jeden WALK Pfad im Muster zum Verhalten TRAIL .

DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Die folgenden Pfadmodi steuern wiederholte Elemente innerhalb jedes Pfades:

Pfadmodus Element-Wiederverwendung
WALK Knoten und Kanten können sich wiederholen.
TRAIL Edges können sich nicht wiederholen, aber Nodes können sich wiederholen.
SIMPLE Knoten können sich nicht wiederholen, außer dass der erste und der letzte Knoten gleich sein können. Kanten können sich nicht wiederholen.
ACYCLIC Knoten können sich nicht wiederholen, einschließlich des ersten und letzten Knotens. Kanten können sich nicht wiederholen.

WALK ist der Standardpfadmodus. Setzen Sie einen Pfad mit einem anderen Modus voran, wenn Sie strengere Element-Eindeutigkeit benötigen:

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.

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

Das Muster TRAIL erzeugt nur Übereinstimmungen, in denen e1, e2, und e3 unterschiedlich sind. Knoten können sich weiterhin wiederholen, sodass der Pfad einen Zyklus bilden kann, ohne eine Kante wiederzuverwenden.

Kontrollieren Sie, welche Pfade zurückgegeben werden

Ein Pfadsuchpräfix bestimmt, welche Pfade ein Pfadmuster zurückgibt. Das Standardpräfix ALL gibt jeden Pfad zurück, der zum Pfadmodus und -muster passt. Du kannst explizit schreiben ALL :

ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)

Verwenden Sie ANY SHORTEST , um für jedes Quell-Ziel-Paar einen kürzesten passenden Pfad aus jeder Eingabezeile zurückzugeben:

MATCH p = ANY SHORTEST
  (src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100

Wenn mehrere Pfade für die kürzeste Länge verbunden sind, gibt die Abfrage einen von ihnen zurück, aber welcher gebundene Pfad zurückgegeben wird, ist nicht deterministisch. Eine untere Schranke von null kann einen Zero-Hop-Pfad von einem Quellknoten zu sich selbst zurückgeben.

ALL SHORTEST Und ANY Pfadsuche werden nicht unterstützt.

Prädikate vor oder nach der Pfadauswahl platzieren

Die Prädikatenplatzierung bestimmt, ob eine Bedingung geeignete Pfade definiert oder Pfade filtert, nachdem das Pfadsuchpräfix sie ausgewählt hat:

  • Eine Inline WHERE in einem Knoten- oder Kantenmuster ist Teil des Musters. Es schränkt ein, welche Wege vor oder ANY SHORTEST bei ALL Anwendung zugelassen sind.
  • Ein Statement-Level WHERE nach dem vollständigen MATCH Muster ist ein Postfilter. Es filtert Zeilen, nachdem das Pfadsuchpräfix Pfade ausgewählt hat.
  • Eine nachfolgende FILTER Anweisung filtert auch Zeilen nach der Pfadauswahl.

Diese Unterscheidung ist besonders wichtig bei ANY SHORTEST. Im folgenden Muster sind nur knows Kanten, die am oder nach dem angegebenen Datum erstellt werden, zulässig, wenn die Abfrage einen kürzesten Pfad auswählt:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connection:knows
    WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
RETURN p

Das Verschieben der Kantenbedingung auf einen Postfilter ändert die Bedeutung. Die Abfrage wählt zunächst einen kürzesten Pfad ohne diese Bedingung. Sie entfernt dann den ausgewählten Pfad, falls eine Kante die Bedingung nicht erfüllt; stattdessen wählt sie keinen längeren Pfad aus:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')
  -[connections:knows]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
           WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p

Von Bedeutung

Für einige ANY SHORTEST Abfrageformen kann Graph derzeit vor der Pfadauswahl eine Bedingung auf Anweisungsebene MATCH ... WHERE anwenden. Bis diese Einschränkung aufgehoben ist, verwenden Sie Inline-Prädikate für die Pfadberechtigung und eine separate FILTER Anweisung für das Filtern nach der Auswahl. Weitere Informationen finden Sie unter Aktuelle Einschränkungen.

Verwenden von Mustern mit variabler Länge

Muster mit variabler Länge sind leistungsstarke Konstrukte, mit denen Sie Pfade unterschiedlicher Länge finden können, ohne sich wiederholende Musterspezifikationen zu schreiben. Sie sind für das Durchlaufen von Hierarchien, sozialen Netzwerken und anderen Strukturen unerlässlich, bei denen die optimale Pfadlänge im Voraus nicht bekannt ist.

Gebundene Variablenlängenmuster

Viele gängige Diagrammabfragen erfordern mehrmals dasselbe Edgemuster. Anstatt ausführliche Muster wie:

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

Sie können die prägnantere Syntax variabler Länge verwenden:

(:Person)-[:knows]->{3}(:Person)

Dies {3} gibt an, dass das -[:knows]-> Kantenmuster genau dreimal wiederholt werden soll.

Flexible Wiederholungsbereiche: Um mehr Flexibilität zu gewährleisten, können Sie sowohl eine untere Grenze als auch eine obere Grenze für die Wiederholung angeben:

(:Person)-[:knows]->{1, 3}(:Person)

Dieses Muster findet direkte Freunde, Freunde von Freunden und Freunden von Freunden in einer einzigen Abfrage.

Hinweis

Die untere Schranke kann ebenfalls null sein. Ein Zero-Hop-Match enthält keine Kanten und erfordert, dass beide Endpunkt-Knotenmuster denselben Knoten übereinstimmen.

Beispiel:

(p1:Person)-[:knows]->{0,1}(p2:Person)

Dieses Muster passt zu jeder Person als sowohl als auch p1p2 bei null Sprüngen und passt zu verbundenen Paaren bei einem Hop.

Wenn keine untere Schranke in {,n}angegeben ist, steht sie standardmäßig auf null.

Komplexe Kompositionen variabler Länge: Muster mit variabler Länge können Teil größerer, komplexerer Muster sein, wie in der folgenden Abfrage:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

Das Muster findet Paare von Kommentaren, bei denen Personen, die sich kennen, unterschiedliche Kommentare liken, und eine Nachricht m ist mit jedem Kommentar durch eine Kette von ein bis drei replyOf Kanten verbunden.

Binden variabler Muster-Randvariablen

Wenn Sie ein Randmuster mit variabler Länge binden, ändern sich der Wert und typ der Edgevariable je nach Bezugskontext. Das Verständnis dieses Verhaltens ist entscheidend für die ordnungsgemäße Verarbeitung von Übereinstimmungen mit variabler Länge:

Zwei Bezugsgrade:

  • Innerhalb eines Musters mit variabler Länge: Graph-Randvariablen binden an jede einzelne Kante entlang des übereinstimmenden Pfads (auch als "Singleton Grad der Referenz" bezeichnet)
  • Außerhalb eines Musters mit variabler Länge: Graph-Randvariablen binden an die Abfolge aller Kanten entlang des übereinstimmenden Pfads (auch als "Gruppenverweisgrad" bezeichnet)

Beispiel für beide Kontexte:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

Die Auswertung der Edgevariable e erfolgt in zwei Kontexten:

  • In der MATCH Anweisung: Die Abfrage findet Ketten von Freunden-von-Freunden-von-Freunden, wo jede Freundschaft seit dem Jahr 2000 gegründet wurde. Beim Musterabgleich wird das Edgemuster-Prädikat e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") einmal für jeden Kandidatenrand ausgewertet. In diesem Zusammenhang e ist an einen einzelnen Edgeverweiswert gebunden.

  • In der RETURN Anweisung: Hier ist an eine (Gruppen)Liste der Edgeverweiswerte in der Reihenfolge gebunden, e in der sie in der übereinstimmenden Kette auftreten. Das Ergebnis e[0] ist der erste Edgeverweiswert in jeder übereinstimmenen Kette.

Variable Längen-Musterkantenvariablen in horizontaler Aggregation:

Kantenvariablen, die durch variable Längenmusterabstimmung begrenzt sind, sind Gruppenlisten außerhalb des variablen Längenmusters und können daher in der horizontalen Aggregation verwendet werden.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

Weitere Informationen finden Sie unter Aggregierte Funktionen.

Ungebundene Variablenlängenmuster

Verwenden Sie einen unbeschränkten Quantor, wenn die maximale Weglänge nicht bekannt ist:

-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)

Die und + Shortcuts * geben null-oder-mehr sowie ein-oder-mehr-Wiederholungen an:

-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)

-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)

Ein unbeschränktes Muster mit der Standardkombination ALL WALK wird abgelehnt, weil Zyklen unendlich viele passende Pfade erzeugen können. Verwenden TRAILSie , SIMPLE, oder ACYCLIC um den Pfad durch die Kanten- oder Knoten-Eindeutigkeit zu begrenzen. Diese Modi garantieren eine Abschlussphase, aber ein großer Graph kann dennoch eine große Anzahl von Pfaden erzeugen.

Von Bedeutung

Für einen durch einen unbeschränkten ANY SHORTEST WALKPfad gebunden ist, sind PATH_LENGTH(path) die einzigen unterstützten Verwendungen und neben ihm path IS NULL. Der Graph materialisiert den vollständigen Pfad in dieser Form nicht. Verwenden Sie eine endliche obere Schranke oder geben Sie TRAIL, SIMPLE, oder ACYCLIC um den Pfad zurückzugeben oder anderweitig zu verwenden.