Grafiekpatroonquery's schrijven in Microsoft Fabric

Met grafiekpatronen kunt u de structuur beschrijven van de gegevens die u wilt vinden met behulp van intuïtieve, visuele syntaxis. In plaats van tabellen samen te voegen, schrijft u patronen die eruitzien als de relaties zelf: knooppunten die zijn verbonden door randen. In dit artikel leest u hoe u GQL-patroonquery's schrijft voor veelvoorkomende scenario's in de grafiek in Microsoft Fabric.

In de voorbeelden wordt de voorbeeldgegevensset van het sociale netwerk gebruikt. Zie GQL-grafiekpatronen voor een volledig overzicht van de syntaxis van het patroon.

Gebruik dit artikel om te leren hoe je knoop-, rand- en padpatronen kunt construeren en combineren. Voor taken die klaar zijn om aan te passen, zoals het vinden van buren of entiteiten zonder relaties, zie Write common GQL queries. Voor filter-, groeperings- en aggregateworkflows, zie Filter en aggregeer grafiekgegevens.

Prerequisites

Directe relaties vergelijken

Een basispatroon komt overeen met een knooppunttype, een specifiek edge-type en een ander knooppunttype. De syntaxis ziet eruit als een diagram van de relatie.

Als u bijvoorbeeld maximaal 100 personen wilt vinden die zijn gekoppeld aan het bedrijf waar ze werken:

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

Gebruik een niet-gericht randpatroon als u het niet weet of niet om richting geeft. Als u bijvoorbeeld maximaal 100 wederzijdse kennissen wilt vinden, ongeacht wie de verbinding heeft geïnitieerd:

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

Note

graph biedt momenteel geen ondersteuning voor het maken van niet-gerichte randen, maar u kunt randen in elke richting opvragen met behulp van -[:label]- de syntaxis.

Patronen filteren met inline WHERE

Plaats WHERE binnen het patroon wanneer een voorwaarde bepaalt welke node of edge aan de match mag deelnemen. Gebruik een statement-level MATCH ... WHERE voorwaarde om de voltooide match na te filteren, of een aparte FILTER wanneer de voorwaarde van toepassing is op de rij die door een eerdere statement is geproduceerd. Predicaatplaatsing kan de resultaten van het kortste pad veranderen. Zie Plaats predicaten vóór of na het selecteren van een pad voor meer informatie.

Als u bijvoorbeeld personen wilt vinden die zijn geboren vóór 1990 die bij een bedrijf werken waarvan de naam begint met 'A':

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

Filter op randeigenschappen om te beperken welke relaties overeenkomen. Als u bijvoorbeeld alleen personen wilt filteren die in 2010 of later aan een bedrijf begonnen te werken:

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

Vinden van multihop-relaties

Gebruik patronen met een variabele lengte om meerdere hops in één expressie te doorlopen. Geef het minimum- en maximum aantal hops op met {min,max} syntaxis.

Als u bijvoorbeeld maximaal 100 mensen wilt vinden die bereikbaar zijn binnen twee tot vier graden vriendschap van Alice:

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

Om maximaal 100 directe en tweedegraads verbindingen (een of twee hops) van Alice te vinden:

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

Navigatie beheren met padenmodi

Standaard gebruikt GQL WALK, waarmee herhaalde knopen en randen zijn toegestaan. Gebruik een andere padmodus wanneer je een striktere uniciteit van elementen nodig hebt.

Padmodus Gedrag Gebruiken wanneer...
WALK Staat herhaalde knopen en randen toe (standaard) Je wilt alle overeenkomende wandelingen binnen een eindige grens.
TRAIL Geen herhaalde randen Je wilt voorkomen dat je dezelfde rand opnieuw volgt, maar dezelfde knoop kan via verschillende randen verschijnen.
SIMPLE Geen herhaalde knooppunten behalve een gedeelde start- en eindknoop, en geen herhaalde randen U wilt dat er geen knooppunt meer dan één keer in het midden van een pad wordt weergegeven, maar dat paden die zich weer bij het begin sluiten, toestaan. Handig voor het detecteren van lussen.
ACYCLIC Geen herhaalde knooppunten of randen U moet garanderen dat er geen knooppunt meer dan één keer in het pad wordt weergegeven. Gebruik voor strikte hiërarchieën, afstamming, of elke doorkruising waarbij het opnieuw bezoeken van een knooppunt onjuiste resultaten zou opleveren.

WALK is de meest permissieve modus en ACYCLIC is de meest beperkende.

Voor SIMPLE en ACYCLICvolgt randuniciteit uit knoopuniciteit. Een SIMPLE pad kan sluiten door terug te keren naar zijn eerste knooppunt, maar het kan nog steeds geen rand hergebruiken.

Als u het verschil wilt illustreren, bekijkt u het pad alice → Bob → Carol → Bob:

  • WALK : staat dit pad toe. Knooppunten en randen kunnen vrijelijk worden herhaald.
  • TRAIL : staat dit pad toe. Bob wordt twee keer weergegeven, maar elke gebruikte rand is een andere relatie (Alice→Bob en Carol→Bob zijn afzonderlijke randen), dus er wordt geen rand herhaald.
  • SIMPLE : blokkeert dit pad. Bob wordt meerdere keren weergegeven en MET SIMPLE kan een knooppunt alleen worden herhaald als het zowel het begin als het einde van het pad (een gesloten cyclus) is. Hier is Alice het begin en Bob is het einde, dus er is geen uitzondering van toepassing.
  • ACYCLIC : blokkeert dit pad. Bob verschijnt meer dan één keer ergens in het pad.

In het volgende voorbeeld ziet u hoe u TRAIL kunt gebruiken om te tellen hoeveel afzonderlijke paden leiden tot elk van de eerste 100 personen die bereikbaar zijn in het netwerk van Alice binnen vier sprongen.

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

Gebruik ACYCLIC om maximaal 100 personen te retourneren die bereikbaar zijn vanuit Alice binnen vier hops, waarbij elke persoon in het pad uniek is:

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

De standaard REPEATABLE ELEMENTS matchmodus maakt het mogelijk dat een rand wordt hergebruikt door afzonderlijke paden in hetzelfde grafiekpatroon. Gebruik DIFFERENT EDGES of DIFFERENT RELATIONSHIPS wanneer elke randbinding over alle paden anders moet zijn:

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

Keer één kortste pad terug

ALL is de standaard padzoekopdracht en geeft elk overeenkomend pad terug. Gebruik ANY SHORTEST om één kortste pad terug te geven voor elk bron-bestemmingspaar. De volgende zoekopdracht vindt één kortste pad van Alice naar 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

Wanneer meerdere kortste paden samenkomen, is het teruggegeven pad niet deterministisch. ALL SHORTEST En ANY padzoekopdrachten worden niet ondersteund.

Predicaatplaatsing kan het resultaat van ANY SHORTESTveranderen. Inline node- en edge-predicaten beperken welke paden in aanmerking komen, terwijl een postfilter het geselecteerde pad kan verwijderen zonder een langer pad te kiezen. Zie Predicaten vóór of na padselectie plaatsen.

Tip

Geef de voorkeur aan een eindige bovengrens voor voorspelbare querykosten. Onbegrensde ALL WALK patronen worden niet ondersteund. Onbegrensde patronen met TRAIL, SIMPLE, of ACYCLIC eindigen via elementuniciteit, maar kunnen nog steeds veel paden teruggeven. Unbounded ANY SHORTEST WALK ondersteunt alleen specifieke queryvormen. Zie Huidige beperkingen.

Variabele hergebruik gebruiken om gedeelde entiteiten uit te drukken

Als u dezelfde variabele in twee delen van een patroon opnieuw gebruikt, wordt een impliciete gelijkheidsbeperking gemaakt. Beide verwijzingen moeten overeenkomen met hetzelfde knooppunt. Met deze techniek kunt u 'entiteiten zoeken die zijn verbonden via een gedeelde derde entiteit'.

Als u bijvoorbeeld maximaal 100 paren personen wilt vinden die elkaar kennen en bij hetzelfde bedrijf werken:

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

De variabele c wordt opnieuw gebruikt voor beide workAt doelen, dus de query retourneert alleen paren waarbij beide personen elkaar kennen en bij hetzelfde bedrijf werken.

Als u maximaal 100 paren personen wilt vinden die beide hetzelfde bericht leuk vonden:

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

Tip

De WHERE a.id < b.id voorwaarde voorkomt dat dubbele paren (Alice + Bob en Bob + Alice) worden weergegeven in de resultaten.

Meerdere patronen combineren

Maak een lijst met meerdere patronen in één MATCH, gescheiden door komma's. Hergebruik een variabele wanneer de patronen hetzelfde grafelement moeten binden.

Als u bijvoorbeeld maximaal 100 personen wilt vinden, samen met zowel hun werkplek als de stad waarin ze wonen:

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

De gedeelde variabele p verbindt de twee patronen. Elke resultaatrij vertegenwoordigt één persoon met zijn bedrijf en plaats.

Niet-verbonden patronen zijn ook geldig, maar ze vormen het cartesische product van hun overeenkomsten. Gebruik ze alleen als je elke combinatie bewust nodig hebt. Voor prestatierichtlijnen, zie Gebruik gedeelde variabelen voor efficiënte joins.

Optionele relaties vergelijken

Gebruik OPTIONAL MATCH deze functie wanneer er mogelijk geen relatie bestaat voor elk knooppunt. Rijen zonder overeenkomst worden behouden met NULL waarden, vergelijkbaar met een SQL LEFT JOIN.

Retourneer bijvoorbeeld maximaal 100 personen met hun bedrijfsnaam, inclusief personen zonder werkgever (dat wil zeggen, die een NULL hebben voor de bedrijfskolom):

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

Gebruik IS NULL wel na OPTIONAL MATCH om maximaal 100 mensen te vinden die niet bij een bedrijf werken.

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