GQL-grafmønstre

Grafmønstre er kernekomponenter i dine GQL-forespørgsler i graph i Microsoft Fabric. De beskriver de strukturer, du leder efter i grafen, ved hjælp af noder og kanter på en intuitiv visuel måde. Tænk på grafmønstre som skabeloner, som forespørgselsprogrammet forsøger at matche med de faktiske data i din graf.

I denne artikel forklares syntaks- og kompositionsregler for grafmønstre i GQL.

Vigtigt

Denne artikel bruger udelukkende datasættet for eksempelgrafer på sociale netværk.

Enkle elementmønstre

Enkle elementmønstre hjælper dig med at matche individuelle noder og kanter fra din graf, der opfylder specifikke krav. Disse mønstre danner grundlaget for mere kompleks matchning af mønstre.

Enkle nodemønstre

Et nodemønster angiver de navne og egenskaber, som en node skal matche:

(:Place&City { name: "New York" })

Dette mønster svarer til alle noder, der både har mærkaterne Place og City (angivet af operatoren & ), og hvis name egenskab er "New York"lig med . Denne kombination af påkrævede navne og egenskaber kaldes fyldstof i nodemønsteret.

Nøglebegreber:

  • Navnematchning: Bruges & til at kræve flere navne.
  • Egenskabsfiltrering: Angiv de nøjagtige værdier, som egenskaberne skal matche.
  • Fleksibel ("covariant")-matchning: Matchende noder kan have flere mærkater og egenskaber ud over dem, der er angivet.

Notat

Noder kan have flere navne, men kanttyper med flere navne understøttes endnu ikke.

Enkle kantmønstre

Kantmønstre er mere komplekse end nodemønstre. De specificerer ikke kun en filler, men forbinder også et oprindelsesnodemønster til et målnodemønster. Edge-mønstre beskriver kravene på både kanten og dens slutpunkter:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

Pilretningen -[...]-> er vigtig—den bestemmer (:Person) som oprindelsesnodemønsteret og (:Comment) som målnodemønsteret. Forståelse af kantretning er afgørende for at forespørge din graf korrekt.

Tilsvarende spejlvendt mønster:

Du kan vende pilen og bytte nodemønstrene for at oprette det tilsvarende spejlvendte kantmønster:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Dette mønster finder de samme relationer, men fra det modsatte perspektiv.

Vilkårlige kantmønstre

Når retningen af en grafkant ikke betyder noget for din forespørgsel, kan du lade den være uspecificeret ved at oprette et vilkårligt retningsbestemt kantmønster:

(:Song)-[:inspired]-(:Movie)

Dette mønster matcher de samme kanter som (:Song)-[:inspired]->(:Movie) og (:Movie)-[:inspired]->(:Song) kombineret, uanset hvilken node der er oprindelse og hvilken der er målet (dette eksempel stammer ikke fra typen af sociale netværksgrafer).

Genveje til grafkantmønster

GQL indeholder praktiske genveje til almindelige kantmønstre for at gøre dine forespørgsler mere præcise:

  • ()->() står for ()-[]->() (retningskant med en hvilken som helst etiket)
  • ()<-() står for ()<-[]-() (retningskant i omvendt retning med en hvilken som helst etiket)
  • ()-() står for ()-[]-() (enhver retningsbestemt kant med en hvilken som helst etiket)

Disse genveje kan være nyttige, når du er interesseret i forbindelse, men ikke om den specifikke grafkanttype.

Navneudtryk

Mønstre kan udtrykke komplekse krav til mærkaterne på matchende noder og kanter.

Eksempel:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

Dette tæller antallet af isLocatedIn kanter, der forbinder Person noder eller Organization-men-ikke-noderCompany (som altid University er noder i skemaet på det sociale netværk) til City eller Country noder.

Syntaks:

Syntaks Betydning
A&B Etiketter skal indeholde både A og B.
A|B Mærkaterne skal indeholde mindst én af A eller B.
!A Etiketter skal udelade A.

Du kan også bruge parenteser til at styre rækkefølgen af evalueringen af mærkatudtryk. Har som standard ! den højeste prioritet og & har højere prioritet end |. Er derfor !A&B|C|!D den samme som ((!A)&B)|C|(!D).

Bindingsvariabler

Variabler giver dig mulighed for at referere til matchende grafelementer i andre dele af forespørgslen. Det er vigtigt at forstå, hvordan variabler bindes og bruges, for at du kan oprette effektive forespørgsler.

Bindingselementvariabler

Både node- og kantmønstre kan binde matchende noder og kanter til variabler til senere reference.

(p:Person)-[w:workAt]->(c:Company)

I dette mønster p bindes til matchende Person noder, w til matchende workAt kanter og c til matchende Company noder.

Genbrug af variabler i forbindelse med strukturelle begrænsninger:

Hvis den samme variabel genbruges i et mønster flere gange, udtrykkes der en begrænsning i matchstrukturen. Hver forekomst af den samme variabel skal altid bindes til det samme grafelement i et gyldigt match. Genbrug af variabler er effektivt til at udtrykke komplekse strukturelle krav.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Mønsteret finder Person noder x , og y som kender hinanden og arbejder på samme Company, som er bundet til variablen c. Genbrug af c sikrer, at begge personer arbejder i samme virksomhed.

Mønster prædikater med elementvariabler:

Bindingselementvariabler giver dig mulighed for at angive prædikater for node- og kantmønster. I stedet for blot at angive et fyldstof med nøjagtige egenskabsværdier som { name: "New York, USA" }, kan et fyldstof angive et prædikat, der evalueres for hvert kandidatelement. Mønsteret stemmer kun overens, hvis prædikatet evalueres til TRUE:

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

Kantmønsteret finder personer, der har kendt hinanden siden den 1. januar 2000, ved hjælp af en fleksibel tilstand i stedet for et nøjagtigt match.

Notat

Kantmønstervariabler bindes altid til den individuelle kant i prædikatet for kantmønsteret, selv når der bruges mønstre med variabel længde. Dette kan hjælpe med ikke at skulle fjerne kantgruppelistevariabler for at udføre et postfilter. Se Bind kantvariabler for mønster med variabel længde.

Avancerede mønster prædikatteknikker:

Mønster prædikater giver effektive indbyggede filtreringsfunktioner, der kan forbedre forespørgslens læsbarhed:

-- 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 prædikat inde i mønsteret, når det beskriver, hvilken node eller kant der kan deltage i matchen.

Bindingsstivariabler

Du kan også binde en tilsvarende sti til en stivariabel til yderligere behandling eller for at returnere den komplette stistruktur til brugeren:

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Her bindes til en stiværdi, p der repræsenterer den komplette tilsvarende stistruktur, herunder referenceværdier for alle noder og kanter i den angivne rækkefølge.

Bundne stier kan enten returneres til brugeren eller behandles yderligere ved hjælp af funktioner 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

Opret mønstre

Forespørgsler i den virkelige verden kræver ofte mere komplekse mønstre end simple node-edge-nodestrukturer. GQL giver flere måder at skrive mønstre til avancerede graf traversals.

Mønstre for oprettelse af sti

Stimønstre kan sammensættes ved at sammenkæde enkle node- og kantmønstre for at oprette længere gennemgange.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Mønsteret krydser fra en person gennem deres sociale og professionelle forbindelser for at finde ud af, hvor deres kollegas firma er placeret.

Konstruktion af stykkevis mønster: Du kan også oprette stimønstre mere trinvist, hvilket kan gøre komplekse mønstre nemmere at læse og forstå:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Denne fremgangsmåde opdeler den samme gennemgang i logiske trin, hvilket gør det nemmere at forstå og foretage fejlfinding.

Opret ikke-linjemønstre

Den resulterende form af et mønster behøver ikke at være en lineær sti. Du kan matche mere komplekse strukturer som "stjerneformede" mønstre, der udstråler fra en central node:

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

Mønsteret finder en person sammen med deres uddannelses-, beskæftigelses- og indholdspræferencer på én gang – en omfattende profilforespørgsel.

Mønstre i samme MATCH kategori behøver ikke at have en fælles variabel. Usammenhængende mønstre danner et kartesiansk produkt af deres matches. Genanvend en variabel, når mønstrene burde binde det samme grafelement, og kun joinede kombinationer skal forblive.

Genbrug af kontrolelement

GQL kontrollerer gentagne noder og kanter på to niveauer:

  • En match-tilstand gælder for det komplette grafmønster, inklusive komma-adskilte stier.
  • En sti-tilstand gælder for én sti.

Standard matchtilstand er REPEATABLE ELEMENTS. Det tillader, at den samme elementbinding forekommer i forskellige dele af grafmønsteret, afhængigt af sti-tilstanden for hver sti. Du kan skrive det eksplicit:

REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Brug DIFFERENT EDGES eller dets synonym DIFFERENT RELATIONSHIPS til at kræve kant-unikhed på tværs af hele grafmønsteret. Denne match-tilstand ændrer også enhver WALK vej i mønsteret til adfærd TRAIL .

DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)

Følgende sti-tilstande styrer gentagne elementer inden for hver sti:

Stitilstand Genbrug af grundstoffer
WALK Noder og kanter kan gentage sig.
TRAIL Kanter kan ikke gentage sig, men noder kan gentage sig.
SIMPLE Noder kan ikke gentage sig, bortset fra at den første og sidste node kan være ens. Kanter kan ikke gentage sig.
ACYCLIC Noder kan ikke gentage sig, inklusive den første og sidste node. Kanter kan ikke gentage sig.

WALK er standard sti-tilstand. Foransætter en sti med en anden tilstand, når du har brug for strengere element-entydighed:

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.

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

Mønsteret TRAIL producerer kun matches, hvor e1, e2, og e3 er forskellige. Noder kan stadig gentage sig, så stien kan danne en cyklus uden at genbruge en kant.

Kontroller hvilke stier der returneres

Et sti-søgningspræfiks styrer, hvilke stier et sti-mønster returnerer. Standardpræfikset ALL returnerer alle stier, der matcher sti-tilstanden og mønsteret. Du kan skrive ALL eksplicit:

ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)

Brug ANY SHORTEST til at returnere én korteste matchende sti for hvert kilde-destinationspar fra hver inputrække:

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 binder sig til den korteste længde, returnerer forespørgslen en af dem, men hvilken bundet sti der returneres, er ikke deterministisk. En nedre grænse på nul kan returnere en zero-hop sti fra en kildenode til sig selv.

ALL SHORTEST Og ANY sti-søgninger understøttes ikke.

Placeringsprædikater før eller efter stivalg

Prædikatplacering bestemmer, om en betingelse definerer berettigede stier eller filtrerer stier efter, at sti-søgepræfikset har valgt dem:

  • En inline WHERE i et node- eller kantmønster er en del af mønsteret. Det begrænser, hvilke veje der er berettigede før ALL eller ANY SHORTEST anvendes.
  • Et statement-niveau WHERE efter det komplette MATCH mønster er et postfilter. Den filtrerer rækker efter, at sti-søgepræfikset har valgt stier.
  • En efterfølgende FILTER sætning filtrerer også rækker efter stivalg.

Denne sondring er især vigtig med ANY SHORTEST. I følgende mønster er kun knows kanter, der oprettes på eller efter den angivne dato, berettigede, når forespørgslen vælger 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

At flytte kantbetingelsen til et postfilter ændrer betydningen. Forespørgslen vælger først den korteste sti uden den betingelse. Den fjerner derefter den valgte sti, hvis en kant fejler betingelsen; den vælger ikke en længere 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

Vigtigt

For nogle ANY SHORTEST forespørgselsformer kan Graph i øjeblikket anvende en sætnings-niveau MATCH ... WHERE betingelse før stivalg. Indtil denne begrænsning er løst, skal du bruge inline-prædikater til sti-berettigelse og en separat FILTER sætning til filtrering efter udvælgelse. For mere information, se Nuværende begrænsninger.

Brug mønstre med variabel længde

Mønstre med variabel længde er effektive konstruktioner, så du kan finde stier med forskellige længder uden at skrive specifikationer for gentagne mønstre. De er vigtige for at gennemgå hierarkier, sociale netværk og andre strukturer, hvor den optimale stilængde ikke er kendt på forhånd.

Afgrænsede mønstre med variabel længde

Mange almindelige grafforespørgsler kræver, at det samme kantmønster gentages flere gange. I stedet for at skrive detaljerede mønstre som:

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

Du kan bruge den mere præcise syntaks med variabel længde:

(:Person)-[:knows]->{3}(:Person)

{3} angiver, at -[:knows]-> kantmønsteret skal gentages nøjagtigt tre gange.

Fleksible gentagelsesområder: Hvis du vil have mere fleksibilitet, kan du angive både en nedre og en øvre grænse for gentagelsen:

(:Person)-[:knows]->{1, 3}(:Person)

Dette mønster finder direkte venner, venner-af-venner, og venner-af-venner-af-venner alle i en enkelt forespørgsel.

Notat

Den nedre grænse kan også være nul. Et zero-hop match indeholder ingen kanter og kræver, at begge endpoint-nodemønstre matcher den samme node.

Eksempel:

(p1:Person)-[:knows]->{0,1}(p2:Person)

Dette mønster matcher hver person både som og p1p2 ved nul hop, og matcher forbundne par ved ét hop.

Når der ikke er angivet nogen nedre grænse i {,n}, går den som standard til nul.

Komplekse kompositioner med variabel længde: Mønstre med variabel længde kan være en del af større, mere komplekse mønstre, som i følgende forespørgsel:

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ønstret finder par af kommentarer, hvor folk, der kender hinanden, har liket forskellige kommentarer, og en besked m er forbundet til hver kommentar med en kæde af en til tre replyOf kanter.

Bind kantvariabler med variabel længde

Når du binder et kantmønster med variabel længde, ændres værdien og typen af kantvariablen afhængigt af referencekonteksten. Forståelse af denne funktionsmåde er afgørende for korrekt behandling af match med variabel længde:

To referencegrader:

  • Inde i et mønster med variabel længde: Grafkantvariabler bindes til hver enkelt kant langs den tilsvarende sti (også kaldet "singleton grad af reference")
  • Uden for et mønster med variabel længde: Grafkantvariabler bindes til sekvensen af alle kanter langs den tilsvarende sti (også kaldet "gruppegraden af reference")

Eksempel på demonstration af begge kontekster:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

Evalueringen af kantvariablen e sker i to kontekster:

  • I sætningenMATCH: Forespørgslen finder kæder af friends-of-friends-of-friends, hvor hvert venskab blev etableret siden år 2000. Under matchning af mønster evalueres prædikatet e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") for kantmønster én gang for hver kandidatkant. Er i denne kontekst e bundet til en enkelt kantreferenceværdi.

  • I sætningenRETURN: Her er bundet til en (gruppe) liste over kantreferenceværdier i den rækkefølge, e de forekommer i den tilsvarende kæde. Resultatet af e[0] er den første kantreferenceværdi i hver matchende kæde.

Variable længde mønsterkantvariabler i horisontal aggregering:

Kantvariabler bundet af mønstermatching af variabel længde er gruppelister uden for mønsteret med variabel længde og kan derfor bruges 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 mere information, se Samlede funktioner.

Ubundne mønstre med variabel længde

Brug en ubegrænset kvantor, når den maksimale stilængde ikke er kendt:

-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)

Og + genvejene * angiver nul-eller-flere og én eller flere gentagelser:

-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)

-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)

Et ubegrænset mønster med standardkombinationen ALL WALK afvises, fordi cyklusser kan producere uendeligt mange matchende stier. Brug TRAIL, SIMPLE, eller ACYCLIC til at begrænse stien gennem kant- eller node-entydighed. Disse tilstande garanterer terminering, men en stor graf kan stadig producere et stort antal stier.

Vigtigt

For en sti bundet af en ubegrænset ANY SHORTEST WALK, er PATH_LENGTH(path) de eneste understøttede anvendelser og ved siden af den, path IS NULL. Grafen materialiserer ikke hele stien i denne form. Brug en endelig øvre grænse eller specificér TRAIL, SIMPLE, eller ACYCLIC til at returnere eller på anden måde bruge stien.