Grafiekpatroonquery's schrijven in Microsoft Fabric

Note

Deze functie is momenteel beschikbaar als openbare preview-versie. Deze preview wordt geleverd zonder een service level agreement en wordt niet aanbevolen voor productieworkloads. Bepaalde functies worden mogelijk niet ondersteund of hebben mogelijk beperkte mogelijkheden. Zie Aanvullende gebruiksvoorwaarden voor Microsoft Azure Previews voor meer informatie.

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.

Prerequisites

  • Een grafiekitem met gegevens geladen. Als u nog niet eerder met grafieken werkt, voltooit u eerst de zelfstudie .
  • Bekendheid met basis MATCH- en RETURN-queries. Zie de GQL-taalhandleiding.

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 in het patroon om knooppunten en randen te filteren wanneer ze worden gematcht. Deze aanpak is efficiënter dan filteren na het feit.

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

GQL maakt standaard gebruik TRAIL van de modus, waardoor dezelfde rand niet meer dan één keer wordt doorkruist. Gebruik padmodi expliciet wanneer u verschillende garanties nodig hebt.

Padmodus Gedrag Gebruiken wanneer...
WALK Staat herhaalde knooppunten en randen toe Je wilt ongefilterde doorkruising zonder beperkingen. Zelden nodig; vooral nuttig voor verkennende query's.
TRAIL Geen herhaalde randen (standaard) U wilt voorkomen dat u dezelfde relatie opnieuw navolgt, maar hetzelfde knooppunt kan via verschillende relaties verschijnen. Werkt goed voor de meeste traversal queries.
SIMPLE Geen herhaalde knooppunten behalve begin en einde 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 Helemaal geen herhaalde knooppunten 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. TRAIL is de standaardinstelling en werkt goed voor de meeste query's. Gebruik alleen een meer beperkende modus wanneer uw use-case dit vereist.

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)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
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

Tip

Voor grote grafieken stelt u altijd een bovengrens in voor patronen met variabele lengte ({1,4} in plaats {1,}van ). Onbegrensde doorkruising in dichte grafen kan time-outlimieten voor queries bereiken. 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. Alle patronen moeten ten minste één variabele delen, zodat ze correct worden samengevoegd.

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.

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