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.
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. Hvis du vil ha mer informasjon, kan du se Supplerende vilkår for bruk for Microsoft Azure Previews.
Grafmønstre er kjernebyggeblokker i GQL-spørringene. 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.
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:
(: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 spesifikasjonen av nødvendige 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
Grafmodeller med flere elementetiketter støttes ennå ikke (kjent problem).
Enkle kantmønstre
Edge-mønstre er mer komplekse enn nodemønstre. De angir ikke bare et fyllstoff, men kobler også et kildenodemønster til et målnodemø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) som kildenodemønster og (:Comment) som målnodemønster. 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 samsvarer med de samme kantene som (:Song)-[:inspired]->(:Movie) og (:Movie)-[:inspired]->(:Song) kombineres, uavhengig av hvilken node som er kilden og hvilken som er målet (dette eksemplet er ikke fra den sosiale nettverksgraftypen).
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.age > 30 AND p.department = 'Engineering')
-[:workAt]->
(c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')
-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z')
AND w.salary > 75000]-(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE
-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target
Tips
Bruk av mønsterpredikater når betingelsene er svært selektive, kan redusere størrelsen på mellomliggende resultater.
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.
Samsvare med løyper
I komplekse mønstre er det ofte uønsket å krysse samme kant flere ganger. Gjenbruk av Edge blir viktig når den faktiske grafen inneholder sykluser som kan føre til uendelige eller altfor lange baner. Grafen i Microsoft Fabric støtter samsvarsmodus for å håndtere gjenbruk av TRAIL kanter.
Prefiksering av et banemønster med nøkkelordet TRAIL forkaster alle treff som binder samme kant flere ganger:
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
Ved hjelp TRAILav produserer mønsteret bare treff der alle kanter er forskjellige. Selv om c = a banen danner en syklus i et gitt treff, e3 bindes det derfor aldri til samme kant som e1.
Modusen TRAIL er viktig for å forhindre uendelige løkker og sikre at spørringene returnerer meningsfulle, ikke-forbløffende baner.
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
Viktig!
Avgrensede mønstre med variabel lengde støtter for øyeblikket bare en maksimal øvre grense på 8. Se artikkelen om gjeldende begrensninger.
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 0. I dette tilfellet samsvarer ingen kanter, og hele mønsteret samsvarer bare hvis og bare hvis de to endepunktnodemønstrene samsvarer med samme node.
Example:
(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)
Dette mønsteret matcher par av forskjellige personer som kjenner hverandre , men matcher også samme person som begge p1 og p2 – selv om personen ikke "kjenner" seg selv.
Når ingen nedre grense er angitt, brukes vanligvis 0 (null) som standard.
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 med kommentarer der personer som kjenner hverandre likte forskjellige kommentarer, og disse kommentarene er koblet sammen gjennom svarkjeder på 1-5 nivåer hver.
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
Se avsnittet om horisontal aggregering for flere detaljer.