Skriv grafmønsterspørringer i Microsoft Fabric

Note

Denne funksjonen er for øyeblikket i offentlig forhåndsversjon. Denne forhåndsvisningen leveres uten en tjenesteavtale, og anbefales ikke for produksjonsarbeidsbelastninger. Enkelte funksjoner støttes kanskje ikke eller kan ha begrensede funksjoner. For mer informasjon, se Supplemental Terms of Use for Microsoft Azure Previews.

Grafmønstergjenkjenning lar deg beskrive strukturen til dataene du ønsker å finne ved hjelp av intuitiv, visuell syntaks. I stedet for å koble sammen tabeller, skriver du mønstre som ligner selve relasjonene – noder koblet sammen av kanter. Denne artikkelen viser deg hvordan du skriver GQL-mønsterspørringer for vanlige scenarier i graf i Microsoft Fabric.

Eksemplene bruker datasett fra sosiale nettverk. For en fullstendig mønstersyntaksreferanse, se GQL-grafmønstre.

Forutsetninger

  • Et grafelement med data lastet inn. Hvis du er ny på graf, fullfør veiledningen først.
  • Kjennskap til grunnleggende MATCH og RETURN spørringer. Se GQL-språkguiden.

Match-direkte relasjoner

Et grunnleggende mønster matcher en nodetype, en spesifikk kanttype og en annen nodetype. Syntaksen ser ut som et diagram over relasjonen.

For eksempel, for å finne opptil 100 personer som er koblet til selskapet de jobber i:

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

Bruk et urettet kantmønster når du ikke vet eller ikke bryr deg om retningen. For eksempel, for å finne opptil 100 felles bekjente uavhengig av hvem som startet forbindelsen:

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

Note

Graph støtter for øyeblikket ikke å lage urettede kanter, men du kan spørre kanter i hvilken som helst retning ved å bruke -[:label]- syntaks.

Filtrer mønstre med innebygd HVOR

Plasser WHERE dem inne i mønsteret for å filtrere noder og kanter etter hvert som de matches. Denne tilnærmingen er mer effektiv enn å filtrere i etterkant.

For eksempel, for å finne folk født før 1990 som jobber i et selskap hvis navn begynner med 'A':

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

Filtrer på kantegenskaper for å begrense hvilke relasjoner som matcher. For eksempel, å returnere kun personer som begynte å jobbe i et selskap i 2010 eller senere:

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

Match multi-hop-relasjoner

Bruk mønstre med variabel lengde for å krysse flere hopp i ett uttrykk. Spesifiser minimums- og maksimumsantall hopp med {min,max} syntaks.

For eksempel, for å finne opptil 100 personer som er tilgjengelige innen to til fire grader av vennskap fra Alice:

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

For å finne opptil 100 umiddelbare og andregrads forbindelser (ett eller to hopp) fra Alice:

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

Kontrolltraversering med stimoduser

Som standard bruker TRAIL GQL modus, som forhindrer at samme kant kan krysses mer enn én gang. Bruk stimoduser eksplisitt når du trenger forskjellige garantier.

Banemodus Virkemåte Bruk når...
WALK Tillater gjentatte noder og kanter Du vil ha rå traversering uten begrensninger. Sjelden nødvendig; Hovedsakelig nyttig for utforskende spørringer.
TRAIL Ingen gjentatte kanter (standard) Du vil unngå å spore det samme forholdet på nytt, men den samme noden kan dukke opp via ulike relasjoner. Fungerer bra for de fleste traverseringsspørringer.
SIMPLE Ingen gjentatte noder bortsett fra start og slutt Du vil ikke at noen node skal dukke opp mer enn én gang midt i en sti, men tillate stier som lukker seg tilbake til starten. Nyttig for å oppdage løkker.
ACYCLIC Ingen gjentatte noder i det hele tatt Du må være sikker på at ingen node dukker opp noe sted i stien mer enn én gang. Bruk for strenge hierarkier, slektslinjer eller enhver traversering der et nytt besøk av en node ville gi feil resultater.

WALK er den mest tillatende modusen og ACYCLIC den mest restriktive. TRAIL er standard og fungerer bra for de fleste spørringer. Bruk en mer restriktiv modus kun når ditt brukstilfelle krever det.

For å illustrere forskjellen, se på veien Alice → Bob → Carol → Bob:

  • WALK — tillater denne veien. Noder og kanter kan gjentas fritt.
  • TRAIL — tillater denne stien. Bob dukker opp to ganger, men hver kant som brukes har et annet forhold (Alice→Bob og Carol→Bob er distinkte kanter), så ingen kant gjentas.
  • ENKELT — blokkerer denne veien. Bob dukker opp mer enn én gang, og SIMPLE tillater bare at en node gjentas hvis det er både starten og slutten av stien (en lukket syklus). Her er Alice starten og Bob er slutten, så det gjelder ikke noe unntak.
  • ACYCLIC — blokkerer denne veien. Bob dukker opp mer enn én gang hvor som helst i stien.

Følgende eksempel viser hvordan man kan telle TRAIL hvor mange forskjellige stier som leder til hver av de første 100 personene som kan nås i Alices nettverk innen fire hopp:

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

Bruk ACYCLIC det til å returnere opptil 100 personer tilgjengelig fra Alice innen fire hopp, hvor hver person på stien er unik:

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

Tips

For store grafer, sett alltid en øvre grense for mønstre med variabel lengde ({1,4} i stedet for {1,}). Ubegrenset traversering over tette grafer kan treffe tidsbegrensninger for spørringer. Se Nåværende begrensninger.

Bruk variabel gjenbruk for å uttrykke delte enheter

Å gjenbruke samme variabel i to deler av et mønster skaper en implisitt likhetsbegrensning – begge referansene må matche samme node. Denne teknikken lar deg uttrykke «finn enheter koblet sammen gjennom en delt tredje enhet.»

For eksempel, for å finne opptil 100 par mennesker som kjenner hverandre og jobber i samme selskap:

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

Variabelen c gjenbrukes for begge workAt målene, så spørringen returnerer kun par der begge kjenner hverandre og jobber i samme selskap.

For å finne opptil 100 par personer som begge likte det samme innlegget:

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

Tips

Betingelsen WHERE a.id < b.id forhindrer at duplikatpar (Alice + Bob og Bob + Alice) dukker opp i resultatene.

Kombiner flere mønstre

List opp flere mønstre i ett enkelt MATCH, adskilt med kommaer. Alle mønstre må ha minst én variabel til felles slik at de kobles riktig.

For eksempel, for å finne opptil 100 personer sammen med både arbeidsplassen deres og byen de bor i:

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

Den delte variabelen p forbinder de to mønstrene. Hver resultatrad representerer én person med deres selskap og by.

Match-valgfrie forhold

Bruk OPTIONAL MATCH når en relasjon kanskje ikke eksisterer for hver node. Rader uten match beholdes med NULL verdier, likt en SQL LEFT JOIN.

For eksempel, returner opptil 100 personer med sitt firmanavn, inkludert personer uten arbeidsgiver (det vil si som returnerer NULL for selskapskolonnen):

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

Bruk IS NULL After OPTIONAL MATCH for å finne opptil 100 personer som ikke jobber i noen bedrift:

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