Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
Grafmønstre er kjernebyggeblokker i GQL-spørringene i grafen i Microsoft Fabric. De beskriver strukturene du leter etter i grafen ved hjelp av noder og kanter på en intuitiv, visuell måte. Tenk på grafmønstre som maler som spørringsmotoren prøver å sammenligne med de faktiske dataene i grafen.
Denne artikkelen forklarer syntaks- og sammensetningsreglene for grafmønstre i GQL.
Viktig!
Denne artikkelen bruker utelukkende eksempeldatasett for sosiale nettverk.
Enkle elementmønstre
Enkle elementmønstre hjelper deg med å sammenligne individuelle noder og kanter fra grafen som oppfyller spesifikke krav. Disse mønstrene danner grunnlaget for mer kompleks mønstersamsvar.
Enkle nodemønstre
Et nodemønster angir etikettene og egenskapene som en node må samsvare med:
(:Place&City { name: "New York" })
Dette mønsteret samsvarer med alle noder som har bådePlace etikettene og City etikettene (angitt av operatoren & ) og hvis name egenskap er lik "New York". Denne kombinasjonen av obligatoriske etiketter og egenskaper kalles fyllstoffet for nodemønsteret.
Nøkkelkonsepter:
-
Etikettsamsvar: Brukes
&til å kreve flere etiketter. - Egenskapsfiltrering: Angi nøyaktige verdier som egenskapene må samsvare med.
- Fleksibel (kovariant)-samsvar: Samsvarende noder kan ha flere etiketter og egenskaper utover de angitte.
Note
Noder kan ha flere etiketter, men kanttyper med flere etiketter støttes ennå ikke.
Enkle kantmønstre
Edge-mønstre er mer komplekse enn nodemønstre. De spesifiserer ikke bare en fyller, men kobler også et opprinnelses-nodemønster til et mål-nodemønster. Edge-mønstre beskriver krav både på kanten og endepunktene:
(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)
Pilretningen -[...]-> er viktig – den bestemmer (:Person) både opprinnelsesnodemønsteret og (:Comment) målnodemønsteret. Det er viktig å forstå kantretningen for å spørre grafen riktig.
Tilsvarende speilvendt mønster:
Du kan vende pilen og bytte nodemønstrene for å opprette det tilsvarende, speilvendte kantmønsteret:
(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)
Dette mønsteret finner de samme relasjonene, men fra motsatt perspektiv.
Mønstre for en hvilken som helst rettet kant
Når retningen på en grafkant ikke spiller noen rolle for spørringen, kan du la den være uspesifisert ved å opprette et hvilket som helst rettet kantmønster:
(:Song)-[:inspired]-(:Movie)
Dette mønsteret matcher de samme kantene som (:Song)-[:inspired]->(:Movie) og (:Movie)-[:inspired]->(:Song) kombinert, uavhengig av hvilken node som er origo og hvilken som er mål (dette eksempelet er ikke fra typen sosiale nettverksgrafer).
Snarveier til diagramkantmønster
GQL gir praktiske snarveier for vanlige kantmønstre for å gjøre spørringene mer konsise:
-
()->()står for()-[]->()(rettet kant med en hvilken som helst etikett) -
()<-()står for()<-[]-()(rettet kant i revers med en hvilken som helst etikett) -
()-()står for()-[]-()(en hvilken som helst rettet kant med en hvilken som helst etikett)
Disse hurtigtastene kan være nyttige når du bryr deg om tilkobling, men ikke om den bestemte grafkanttypen.
Etikettuttrykk
Mønstre kan uttrykke komplekse krav på etikettene til samsvarende noder og kanter.
Eksempel:
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
Dette teller antall isLocatedIn kanter som kobler Person noder eller Organization-men-ikke-noderCompany (som alltid University er noder i det sosiale nettverksskjemaet) til City eller Country noder.
Syntaks:
| Syntaks | Betydning |
|---|---|
A&B |
Etiketter må inkludere både A og B. |
A\|B |
Etiketter må inneholde minst én av A eller B. |
!A |
Etiketter må utelate A. |
I tillegg kan du bruke parentes til å kontrollere rekkefølgen på etikettuttrykksevalueringen. Som standard ! har den høyeste prioriteten og & har høyere prioritet enn |. Derfor !A&B|C|!D er det samme som ((!A)&B)|C|(!D).
Bindingsvariabler
Variabler lar deg referere til samsvarende grafelementer i andre deler av spørringen. Det er viktig å forstå hvordan du binder og bruker variabler for å bygge kraftige spørringer.
Bindingselementvariabler
Både node- og kantmønstre kan binde samsvarende noder og kanter til variabler for senere referanse.
(p:Person)-[w:workAt]->(c:Company)
I dette mønsteret er p det bundet til samsvarende Person noder, w til samsvarende workAt kanter og c til samsvarende Company noder.
Variabel gjenbruk for strukturelle begrensninger:
Gjenbruk av samme variabel i et mønster flere ganger uttrykker en begrensning på strukturen til treff. Hver forekomst av samme variabel må alltid bindes til det samme grafelementet i et gyldig samsvar. Variabel gjenbruk er kraftig for å uttrykke komplekse strukturelle krav.
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
Mønsteret finner Person noder x , og y som kjenner hverandre og arbeider på samme Companymåte , som er bundet til variabelen c. Gjenbruk av c sikrer at begge personer jobber i samme selskap.
Mønsterpredikater med elementvariabler:
Med bindingselementvariabler kan du angi node- og kantmønsterpredikater. I stedet for bare å gi en fyllstoff med nøyaktige egenskapsverdier som { name: "New York, USA" }, kan et fyllstoff angi et predikat som evalueres for hvert kandidatelement. Mønsteret samsvarer bare hvis predikatet evalueres til TRUE:
(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)
Kantmønsteret finner personer som kjente hverandre siden 1. januar 2000, ved hjelp av en fleksibel tilstand i stedet for et nøyaktig treff.
Note
Kantmønstervariabler binder seg alltid til den individuelle kanten i kantmønsterpredikatet, selv når du bruker mønstre med variabel lengde. Dette kan hjelpe med at du ikke trenger å dele opp listevariabler for kantgrupper for å utføre et postfilter. Se Bind variabler for mønsterkantvariabler med variabel lengde.
Avanserte mønsterpredikatteknikker:
Mønsterpredikater gir kraftige innebygde filtreringsfunksjoner som kan forbedre lesbarheten for spørringen:
-- 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
Tips
Hold et predikat inne i mønsteret når det beskriver hvilken node eller kant som kan delta i kampen.
Bindingsbanevariabler
Du kan også binde en samsvarende bane til en banevariabel for videre behandling eller for å returnere den fullstendige banestrukturen til brukeren:
p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
p Her er bundet til en baneverdi som representerer den fullstendig samsvarende banestrukturen, inkludert referanseverdier for alle noder og kanter i den angitte rekkefølgen.
Bundne stier kan enten returneres til brukeren eller behandles videre ved hjelp av funksjoner som NODES eller EDGES:
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
Skrive mønstre
Virkelige spørringer krever ofte mer komplekse mønstre enn enkle nodekant-nodestrukturer. GQL gir flere måter å skrive mønstre for avanserte graf traversaler.
Skrive banemønstre
Banemønstre kan komponeres ved å sette sammen enkle node- og kantmønstre for å opprette lengre traverser.
(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Mønsteret krysser fra en person gjennom deres sosiale og profesjonelle forbindelser for å finne ut hvor kollegaens selskap befinner seg.
Mønsterkonstruksjon på stykkevis: Du kan også bygge banemønstre mer trinnvist, noe som kan gjøre komplekse mønstre enklere å lese og forstå:
(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Denne tilnærmingen bryter ned den samme traversen i logiske trinn, noe som gjør det enklere å forstå og feilsøke.
Skrive ikke-lineære mønstre
Den resulterende formen på et mønster trenger ikke å være en lineær bane. Du kan sammenligne mer komplekse strukturer som stjerneformede mønstre som stråler ut fra en sentral node:
(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)
Mønsteret finner en person sammen med utdannings-, ansettelses- og innholdsinnstillingene samtidig – en omfattende profilspørring.
Mønstre i samme MATCH trenger ikke å ha en variabel til felles. Usammenhengende mønstre danner et kartesisk produkt av deres matcher. Gjenbruk en variabel når mønstrene skal binde det samme grafelementet og bare sammenkoblede kombinasjoner skal være igjen.
Gjenbruk av kontrollelement
GQL kontrollerer gjentatte noder og kanter på to nivåer:
- En match-modus gjelder for det komplette grafmønsteret, inkludert komma-separerte stier.
- En sti-modus gjelder for én sti.
Standard kampmodus er REPEATABLE ELEMENTS. Den tillater at samme elementbinding skjer i forskjellige deler av grafmønsteret, avhengig av stimodusen til hver sti. Du kan skrive det eksplisitt:
REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Bruk DIFFERENT EDGES eller dets synonym DIFFERENT RELATIONSHIPS for å kreve kantunikhet over hele grafmønsteret. Denne matchmodusen endrer også enhver WALK vei i mønsteret til atferd TRAIL .
DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Følgende stimoduser kontrollerer gjentatte elementer innenfor hver sti:
| Banemodus | Gjenbruk av elementer |
|---|---|
WALK |
Noder og kanter kan gjenta seg. |
TRAIL |
Kanter kan ikke gjenta seg, men noder kan gjenta seg. |
SIMPLE |
Noder kan ikke gjentas, bortsett fra at den første og siste noden kan være like. Kanter kan ikke gjenta seg. |
ACYCLIC |
Noder kan ikke gjentas, inkludert den første og siste noden. Kanter kan ikke gjenta seg. |
WALK er standard stimodus. Prefikset en sti med en annen modus når du trenger strengere elementunikhet:
For SIMPLE og ACYCLIC, følger kantens unikhet fra nodens unikhet. En SIMPLE sti kan lukke seg ved å returnere til sin første node, men den kan fortsatt ikke gjenbruke en kant.
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
Mønsteret TRAIL gir bare treff der e1, e2, og e3 er forskjellige. Noder kan fortsatt gjentas, så stien kan danne en syklus uten å gjenbruke en kant.
Kontroller hvilke stier som returneres
Et sti-søk-prefiks styrer hvilke stier et stimønster returnerer. Standardprefikset ALL returnerer alle stier som samsvarer med stimodus og mønster. Du kan skrive ALL eksplisitt:
ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)
Bruk ANY SHORTEST for å returnere én korteste matchende sti for hvert kilde-destinasjonspar fra hver inngangsrad:
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
Hvis flere stier knyttes for korteste lengde, returnerer spørringen én av dem, men hvilken bundet sti som returneres er ikke deterministisk. En nedre grense på null kan returnere en nullhopp-sti fra en kildenode til seg selv.
ALL SHORTEST Og ANY stisøk støttes ikke.
Plasser predikater før eller etter stivalg
Predikatplassering avgjør om en betingelse definerer kvalifiserte stier eller filtrerer stier etter at stisøkeprefikset har valgt dem:
- En inline
WHEREi et node- eller kantmønster er en del av mønsteret. Den begrenser hvilke veier som er kvalifisert førALLellerANY SHORTESTbenyttes. - Et statement-nivå
WHEREetter det kompletteMATCHmønsteret er et postfilter. Den filtrerer rader etter at sti-søkeprefikset har valgt stier. - En påfølgende
FILTERsetning filtrerer også rader etter valg av sti.
Denne distinksjonen er spesielt viktig med ANY SHORTEST. I følgende mønster er det kun knows kanter opprettet på eller etter den angitte datoen som er gyldige når spørringen velger en korteste sti:
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
Å flytte kantbetingelsen til et postfilter endrer betydningen. Spørringen velger først en korteste vei uten denne betingelsen. Den fjerner deretter den valgte stien hvis en kant ikke oppfyller betingelsen; den velger ikke en lengre sti i stedet:
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
Viktig!
For noen ANY SHORTEST spørringsformer kan Graph for øyeblikket anvende en setningsnivåbetingelse MATCH ... WHERE før valg av sti. Inntil denne begrensningen er løst, bruk inline-predikater for sti-egnethet og en separat FILTER setning for filtrering etter utvelgelse. For mer informasjon, se Nåværende begrensninger.
Bruk mønstre med variabel lengde
Mønstre med variabel lengde er kraftige konstruksjoner som lar deg finne baner av varierende lengde uten å skrive gjentakende mønsterspesifikasjoner. De er avgjørende for å krysse hierarkier, sosiale nettverk og andre strukturer der den optimale banelengden ikke er kjent på forhånd.
Avgrensede mønstre med variabel lengde
Mange vanlige grafspørringer krever at du gjentar det samme kantmønsteret flere ganger. I stedet for å skrive detaljerte mønstre som:
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
Du kan bruke den mer konsise syntaksen med variabel lengde:
(:Person)-[:knows]->{3}(:Person)
Angir {3} at kantmønsteret -[:knows]-> skal gjentas nøyaktig tre ganger.
Fleksible repetisjonsområder: Hvis du vil ha mer fleksibilitet, kan du angi både en nedre grense og en øvre grense for repetisjonen:
(:Person)-[:knows]->{1, 3}(:Person)
Dette mønsteret finner direkte venner, venner-av-venner og venner-av-venner-av-venner alt i en enkelt spørring.
Note
Den nedre grensen kan også være null. En zero-hop-match inneholder ingen kanter og krever at begge endepunktsnodemønstrene matcher samme node.
Example:
(p1:Person)-[:knows]->{0,1}(p2:Person)
Dette mønsteret matcher hver person som både p1 og p2 ved null hopp, og matcher sammenkoblede par ved ett hopp.
Når ingen nedre grense er spesifisert i {,n}, går den som standard til null.
Komplekse komposisjoner med variabel lengde: Mønstre med variabel lengde kan være en del av større, mer komplekse mønstre, som i følgende spørring:
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
Mønsteret finner par av kommentarer hvor folk som kjenner hverandre liker forskjellige kommentarer, og en melding m er koblet til hver kommentar med en kjede på én til tre replyOf kanter.
Binde variable mønsterkantvariabler med variabel lengde
Når du binder et variabelt kantmønster, endres verdien og typen til kantvariabelen avhengig av referansekonteksten. Å forstå denne virkemåten er avgjørende for riktig behandling av samsvar mellom variabel lengde:
To referansegrader:
- Inne i et mønster med variabel lengde: Grafkantvariabler binder seg til hver enkelt kant langs den samsvarende banen (også kalt «singleton grad av referanse»)
- Utenfor et mønster med variabel lengde: Grafkantvariabler binder seg til sekvensen av alle kanter langs den samsvarende banen (også kalt «gruppegrad av referanse»)
Eksempel som demonstrerer begge kontekstene:
MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100
Evalueringen av kantvariabelen e forekommer i to kontekster:
I uttalelsen
MATCH: Spørringen finner kjeder av venner-av-venner-av-venner hvor hvert vennskap ble etablert siden år 2000. Under mønstersamsvar evalueres kantmønsterpredikatete.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")én gang for hver kandidatkant. I denne konteksteneer bundet til en referanseverdi for én enkelt kant.I setningen
RETURN: Hereer bundet til en (gruppe) liste over kantreferanseverdier i rekkefølgen de forekommer i den samsvarende kjeden. Resultatet ave[0]er den første kantreferanseverdien i hver samsvarende kjede.
Variable mønsterkantvariabler i horisontal aggregering:
Kantvariabler bundet av mønstermatching med variabel lengde er gruppelister utenfor mønsteret med variabel lengde, og kan derfor brukes i horisontal aggregering.
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
For mer informasjon, se Aggregerte funksjoner.
Ubundne mønstre med variabel lengde
Bruk en ubegrenset kvantifikator når maksimal stilengde ikke er kjent:
-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)
Og *+ snarveiene spesifiserer null eller flere og én eller flere repetisjoner:
-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)
-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)
Et ubundet mønster med standardkombinasjonen ALL WALK avvises fordi sykluser kan gi uendelig mange matchende stier. Bruk TRAIL, SIMPLE, eller ACYCLIC for å begrense stien gjennom kant- eller node-unikhet. Disse modusene garanterer terminering, men en stor graf kan fortsatt produsere et stort antall stier.
Viktig!
For en sti bundet av en ubegrenset ANY SHORTEST WALK, er PATH_LENGTH(path) de eneste støttede bruksområdene og, ved siden av den, path IS NULL. Grafen materialiserer ikke hele stien i denne formen. Bruk en endelig øvre grense eller spesifiser TRAIL, SIMPLE, eller ACYCLIC for å returnere eller på annen måte bruke stien.