Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Grafmønster-matching lader dig beskrive strukturen af de data, du ønsker at finde, ved hjælp af intuitiv, visuel syntaks. I stedet for at forbinde tabeller skriver du mønstre, der ligner relationerne selv – noder forbundet af kanter. Denne artikel viser dig, hvordan du skriver GQL-mønsterforespørgsler for almindelige scenarier i graf i Microsoft Fabric.
Eksemplerne bruger det sociale netværks eksempeldatasæt. For en fuld mønstersyntaksreference, se GQL-grafmønstre.
Brug denne artikel til at lære, hvordan man konstruerer og kombinerer node-, kant- og stimønstre. For opgaver, der er klar til at tilpasse, såsom at finde naboer eller enheder uden relationer, se Write common GQL-forespørgsler. For filtrering, gruppering og aggregerede arbejdsgange, se Filter og aggreger grafdata.
Forudsætninger
- Et grafelement bygget ud fra det sociale netværks eksempeldatasæt, med nodetyper, kanttyper og egenskaber beskrevet i eksemplet med sociale netværksskema.
- Fortrolighed med grundlæggende
MATCHogRETURNforespørgsler. Se GQL-sprogvejledningen.
Match direkte relationer
Et grundlæggende mønster matcher en nodetype, en specifik kanttype og en anden nodetype. Syntaksen ligner et diagram over relationen.
For eksempel for at finde op til 100 personer parret med den virksomhed, de arbejder hos:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100
Brug et urettet kantmønster, når du ikke kender eller ikke bekymrer dig om retningen. For eksempel at finde op til 100 fælles bekendte, uanset hvem der tog initiativ til forbindelsen:
MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100
Bemærkning
Graph understøtter i øjeblikket ikke oprettelse af urettede kanter, men du kan forespørge kanter i enhver retning ved at bruge -[:label]- syntaks.
Filtrer mønstre med inline HVOR
Placer WHERE inden for mønsteret, når en betingelse definerer, hvilken node eller kant der kan deltage i matchet. Brug en sætningsniveaubetingelse MATCH ... WHERE til at postfiltrere det færdige match, eller en separat FILTER når betingelsen gælder for den række, der er produceret af en tidligere sætning. Placering af prædikater kan ændre resultaterne af kortest-vejen. For mere information, se Place-prædikater før eller efter stivalg.
For eksempel at finde personer født før 1990, som arbejder i en virksomhed, hvis navn starter 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å kantegenskaber for at begrænse, hvilke relationer der matcher. For eksempel kun at returnere personer, der begyndte at arbejde i en virksomhed 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 relationer
Brug mønstre med variabel længde til at gennemgå flere hop i ét udtryk. Angiv minimums- og maksimumstal af hop med {min,max} syntaks.
For eksempel for at finde op til 100 personer, der kan nås inden for to til fire grader af venskab fra Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
For at finde op til 100 umiddelbare og andengradsforbindelser (et eller to hop) fra Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Kontrolgennemgang med sti-tilstande
Som standard bruger WALKGQL , som tillader gentagne noder og kanter. Brug en anden sti-tilstand, når du har brug for strengere elementunikhed.
| Stitilstand | Adfærd | Brug når... |
|---|---|---|
WALK |
Tillader gentagne noder og kanter (standard) | Du vil have alle matchende walks inden for en endelig grænse. |
TRAIL |
Ingen gentagne kanter | Du vil undgå at skulle spore den samme kant igen, men den samme node kan dukke op gennem forskellige kanter. |
SIMPLE |
Ingen gentagne noder undtagen en delt start- og slutnode, og ingen gentagne kanter | Du vil ikke have, at der ikke optræder en node mere end én gang midt i en sti, men tillad stier, der ligger tæt på starten. Nyttig til at opdage løkker. |
ACYCLIC |
Ingen gentagne noder eller kanter | Du skal garantere, at der ikke dukker nogen node op på stien mere end én gang. Brug til strenge hierarkier, slægtslinjer eller enhver gennemgang, hvor et genbesøg af en node ville give forkerte resultater. |
WALK er den mest tilladende tilstand og ACYCLIC den mest restriktive.
For SIMPLE og ACYCLICfølger kantenes unikhed af nodens unikhed. En SIMPLE sti kan lukke ved at vende tilbage til sin første node, men den kan stadig ikke genbruge en kant.
For at illustrere forskellen, betragt stien Alice → Bob → Carol → Bob:
- WALK — tillader denne vej. Noder og kanter kan gentages frit.
- TRAIL — tillader denne sti. Bob optræder to gange, men hver kant har et forskelligt forhold (Alice→Bob og Carol→Bob er forskellige kanter), så ingen kant gentages.
- SIMPELT — blokerer denne vej. Bob optræder mere end én gang, og SIMPLE tillader kun, at en node gentager, hvis det både er starten og slutningen af stien (en lukket cyklus). Her er Alice starten, og Bob er slutningen, så der er ingen undtagelse.
- ACYCLIC — blokerer denne vej. Bob dukker op mere end én gang hvor som helst på stien.
Følgende eksempel viser, hvordan man kan tælle TRAIL , hvor mange forskellige stier der fører til hver af de første 100 personer, der kan nås i Alices netværk inden for fire hop:
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
Brug ACYCLIC det til at returnere op til 100 personer, der kan nås fra Alice inden for fire hop, 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
Standard REPEATABLE ELEMENTS match-tilstand tillader, at en kant genbruges af separate stier i samme grafmønster. Brug DIFFERENT EDGES eller DIFFERENT RELATIONSHIPS når hver kantbinding på alle baner skal være forskellig:
MATCH DIFFERENT EDGES
(p:Person)-[:knows]->(friend:Person),
(p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100
Returner én korteste vej
ALL er standardsti-søgningen og returnerer alle matchende stier. Brug ANY SHORTEST til at returnere én korteste sti for hvert kilde-destinationspar. Følgende forespørgsel finder én korteste vej fra Alice til 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
Når flere korteste stier hænger sammen, er det ikke deterministisk, hvilken sti der returneres.
ALL SHORTEST Og ANY sti-søgninger understøttes ikke.
Prædikatplacering kan ændre resultatet af ANY SHORTEST. Inline-node- og kantprædikater begrænser, hvilke stier der er egnelige, mens et postfilter kan fjerne den valgte sti uden at vælge en længere sti i stedet. Se Place-prædikater før eller efter stivalg.
Tip
Foretræk en endelig øvre grænse for forudsigelig forespørgselsomkostning. Ubegrænsede ALL WALK mønstre understøttes ikke. Ubegrænsede mønstre med TRAIL, SIMPLE, eller ACYCLIC afsluttes gennem elementets unikhed, men kan stadig returnere mange stier. Unbounded ANY SHORTEST WALK understøtter kun specifikke forespørgselsformer. Se Nuværende begrænsninger.
Brug variabel genbrug til at udtrykke delte enheder
Genbrug af den samme variabel i to dele af et mønster skaber en implicit lighedsbegrænsning – begge referencer skal matche den samme node. Denne teknik lader dig udtrykke "find entiteter forbundet gennem en delt tredje enhed."
For eksempel at finde op til 100 par mennesker, der kender hinanden og arbejder i samme virksomhed:
MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100
Variablen c genbruges for begge workAt mål, så forespørgslen kun returnerer par, hvor begge personer kender hinanden og arbejder i samme virksomhed.
For at finde op til 100 par personer, der begge kunne lide det samme opslag:
MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100
Tip
Betingelsen WHERE a.id < b.id forhindrer, at duplikerede par (Alice + Bob og Bob + Alice) optræder i resultaterne.
Kombiner flere mønstre
List flere mønstre i et enkelt MATCH, adskilt af kommaer. Genanvend en variabel, når mønstrene skal binde det samme grafelement.
For eksempel for at finde op til 100 personer sammen med både deres arbejdsplads og den by, 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 variabel p forbinder de to mønstre. Hver resultatrække repræsenterer én person med deres firma og by.
Usammenhængende mønstre er også gyldige, men de udgør et kartesiansk produkt af deres matches. Brug dem kun, når du bevidst har brug for alle kombinationer. For performancevejledning, se Brug delte variable for effektive joins.
Match-valgfrie relationer
Brug OPTIONAL MATCH når en relation måske ikke eksisterer for hver node. Rækker uden match bevares med NULL værdier, ligesom i SQL LEFT JOIN.
For eksempel, returner op til 100 personer med deres firmanavn, inklusive personer uden arbejdsgiver (dvs. som returnerer NULL for virksomhedskolonnen):
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100
Brug IS NULL After OPTIONAL MATCH for at finde op til 100 personer, der ikke arbejder i nogen virksomhed:
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100