GQL-grafmönster

Grafmönster är viktiga byggstenar i dina GQL-frågor i grafen i Microsoft Fabric. De beskriver de strukturer som du letar efter i diagrammet med hjälp av noder och kanter på ett intuitivt, visuellt sätt. Tänk på grafmönster som mallar som frågemotorn försöker matcha mot faktiska data i diagrammet.

I den här artikeln beskrivs syntax- och kompositionsregler för grafmönster i GQL.

Viktigt!

Denna artikel använder uteslutande dataset för sociala nätverk som exempel på graf.

Enkla elementmönster

Enkla elementmönster hjälper dig att matcha enskilda noder och kanter från grafen som uppfyller specifika krav. Dessa mönster utgör grunden för mer komplex mönstermatchning.

Enkla nodmönster

Ett nodmönster anger de etiketter och egenskaper som en nod måste matcha:

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

Det här mönstret matchar alla noder som har både etiketterna Place och City (anges av operatorn & ) och vars name egenskap är "New York"lika med . Den här kombinationen av obligatoriska etiketter och egenskaper kallas filler för nodmönstret.

Viktiga begrepp:

  • Etikettmatchning: Används & för att kräva flera etiketter.
  • Egenskapsfiltrering: Ange exakta värden som egenskaperna måste matcha.
  • Flexibel ("covariant") matchning: Matchade noder kan ha fler etiketter och egenskaper än de som anges.

Anmärkning

Noder kan ha flera etiketter, men kanttyper med flera etiketter stöds ännu inte.

Enkla kantmönster

Kantmönster är mer komplexa än nodmönster. De specificerar inte bara en filler utan kopplar också ett ursprungsnodmönster till ett målnodmönster. Edge-mönster beskriver kraven på både gränsen och dess slutpunkter:

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

Pilriktningen -[...]-> är viktig – den bestämmer (:Person) som ursprungsnodmönster och (:Comment) som målnodmönster. Att förstå kantriktningen är avgörande för att fråga grafen korrekt.

Motsvarande speglat mönster:

Du kan vända pilen och växla nodmönstren för att skapa motsvarande speglade kantmönster:

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

Det här mönstret hittar samma relationer men från motsatt perspektiv.

Alla riktade kantmönster

När riktningen för en grafkant inte spelar någon roll för din fråga kan du lämna den ospecificerad genom att skapa ett valfritt riktat kantmönster:

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

Detta mönster matchar samma kanter som (:Song)-[:inspired]->(:Movie) och (:Movie)-[:inspired]->(:Song) kombinerade, oavsett vilken nod som är ursprung och vilken som är mål (detta exempel kommer inte från typen av sociala nätverksgraf).

Kortkommandon för diagramkantmönster

GQL tillhandahåller praktiska genvägar för vanliga kantmönster för att göra dina frågor mer koncisa:

  • ()->() står för ()-[]->() (riktad kant med valfri etikett)
  • ()<-() står för ()<-[]-() (riktad kant bakåt med valfri etikett)
  • ()-() står för ()-[]-() (alla riktade kanter med valfri etikett)

Dessa genvägar kan vara användbara när du bryr dig om anslutning, men inte om den specifika grafkanttypen.

Etikettuttryck

Mönster kan uttrycka komplexa krav på etiketterna för matchade noder och kanter.

Example:

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

Detta räknar antalet isLocatedIn kanter som ansluter Person noder eller Organization-men-inte-noderCompany (som alltid University är noder i det sociala nätverksschemat) till City eller Country noder.

Syntax:

Syntax Meaning
A&B Etiketter måste innehålla både A och B.
A\|B Etiketter måste innehålla minst ett av A eller B.
!A Etiketter måste undanta A.

Använd dessutom parenteser för att styra ordningen för utvärdering av etikettuttryck. Som standard ! har den högsta prioriteten och & har högre prioritet än |. Därför !A&B|C|!D är samma som ((!A)&B)|C|(!D).

Bindningsvariabler

Med variabler kan du referera till matchade grafelement i andra delar av frågan. Det är viktigt att förstå hur du binder och använder variabler för att skapa kraftfulla frågor.

Bindningselementvariabler

Både nod- och kantmönster kan binda matchade noder och kanter till variabler för senare referens.

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

I det här mönstret p är bunden till matchande Person noder, w matchande workAt kanter och c matchande Company noder.

Variabel återanvändning för strukturella begränsningar:

Att återanvända samma variabel i ett mönster flera gånger uttrycker en begränsning av matchningens struktur. Varje förekomst av samma variabel måste alltid bindas till samma grafelement i en giltig matchning. Variabel återanvändning är kraftfull för att uttrycka komplexa strukturella krav.

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

Mönstret hittar noder Person och x som känner varandra och fungerar på samma y, som är bunden till variabeln Companyc . Återanvändningen av c säkerställer att båda personerna arbetar på samma företag.

Mönsterpredikat med elementvariabler:

Med bindningselementvariabler kan du ange predikat för nod- och kantmönster. I stället för att bara tillhandahålla ett fyllmedel med exakta egenskapsvärden som { name: "New York, USA" }, kan ett fyllmedel ange ett predikat som utvärderas för varje kandidatelement. Mönstret matchar bara om predikatet utvärderas till TRUE:

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

Gränsmönstret hittar personer som kände varandra sedan den 1 januari 2000, med hjälp av ett flexibelt villkor snarare än en exakt matchning.

Anmärkning

Kantmönstervariabler binder alltid till den enskilda kanten i gränsmönstrets predikat, även när mönster med variabel längd används. Detta kan hjälpa dig med att inte behöva ta bort listan över kantgrupper för att utföra ett efterfilter. Se Binda mönsterbrytarvariabler med variabel längd.

Avancerade mönsterpredikattekniker:

Mönsterpredikat ger kraftfulla funktioner för infogad filtrering som kan förbättra frågans läsbarhet:

-- 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/Råd

Behåll ett predikat inom mönstret när det beskriver vilken nod eller kant som kan delta i matchningen.

Bindningssökvägsvariabler

Du kan också binda en matchad sökväg till en sökvägsvariabel för vidare bearbetning eller för att returnera den fullständiga sökvägsstrukturen till användaren:

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

p Här är bunden till ett sökvägsvärde som representerar den fullständiga matchade sökvägsstrukturen, inklusive referensvärden för alla noder och kanter i den angivna ordningen.

Bundna vägar kan antingen returneras till användaren eller bearbetas vidare med 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

Skapa mönster

Verkliga frågor kräver ofta mer komplexa mönster än enkla nod-kant-nodstrukturer. GQL innehåller flera sätt att skapa mönster för avancerade grafblädderingar.

Skapa sökvägsmönster

Sökvägsmönster kan bestå genom att sammanfoga enkla nod- och kantmönster för att skapa längre bläddranden.

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

Mönstret går från en person genom deras sociala och professionella kontakter för att hitta var kollegans företag finns.

Konstruktion av bitvis mönster: Du kan också skapa sökvägsmönster mer stegvis, vilket kan göra komplexa mönster enklare att läsa och förstå:

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

Den här metoden delar upp samma bläddering i logiska steg, vilket gör det lättare att förstå och felsöka.

Skapa icke-linjära mönster

Den resulterande formen av ett mönster behöver inte vara en linjär sökväg. Du kan matcha mer komplexa strukturer som "stjärnformade" mönster som utstrålar från en central nod:

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

Mönstret hittar en person tillsammans med deras utbildnings-, anställnings- och innehållsinställningar på en gång – en omfattande profilfråga.

Mönster i samma MATCH behöver inte dela en variabel. Osammanhängande mönster bildar en kartesisk produkt av sina matchningar. Återanvänd en variabel när mönstren ska binda samma grafelement och endast sammanfogade kombinationer ska finnas kvar.

Återanvändning av styrelement

GQL kontrollerar upprepade noder och kanter på två nivåer:

  • Ett matchningsläge gäller för hela grafmönstret, inklusive kommaseparerade vägar.
  • Ett vägläge gäller för en väg.

Standardmatchläget är REPEATABLE ELEMENTS. Det tillåter att samma elementbindning sker i olika delar av grafmönstret, beroende på varje vägs banläge. Du kan skriva det explicit:

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

Använd DIFFERENT EDGES eller dess synonym DIFFERENT RELATIONSHIPS för att kräva kantunikhet över hela grafmönstret. Detta matchläge ändrar också alla WALK vägar i mönstret till TRAIL beteende.

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

Följande väg-lägen styr upprepade element inom varje väg:

Sökvägsläge Återanvändning av grundämnen
WALK Noder och kanter kan upprepas.
TRAIL Kanter kan inte upprepas, men noder kan upprepas.
SIMPLE Noder kan inte upprepas, förutom att den första och sista noden kan vara samma. Kanter kan inte upprepas.
ACYCLIC Noder kan inte upprepas, inklusive den första och sista noden. Kanter kan inte upprepas.

WALK är standardvägsläget. Infäst en väg med ett annat läge när du behöver striktare elementunikhet:

För SIMPLE och ACYCLICföljer kantens unikhet från nodens unikhet. En SIMPLE väg kan stängas genom att återvända till sin första nod, men den kan fortfarande inte återanvända en kant.

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

Mönstret TRAIL ger endast träffar där e1, e2, och e3 är olika. Noder kan fortfarande upprepas, så vägen kan bilda en cykel utan att återanvända en kant.

Kontrollera vilka vägar som returneras

Ett sökvägsprefix styr vilka vägar ett vägmönster returnerar. Standardprefixet ALL returnerar varje väg som matchar vägens läge och mönster. Du kan skriva ALL explicit:

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

Använd ANY SHORTEST för att returnera en kortast matchande väg för varje käll-destinationspar från varje indatarad:

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

Om flera vägar kopplas för kortast längd returnerar frågan en av dem, men vilken kopplad väg som returneras är inte deterministisk. En nedre gräns på noll kan returnera en nollhoppsväg från en källnod till sig själv.

ALL SHORTEST Och ANY vägsökningar stöds inte.

Placera predikat före eller efter vägval

Predikatplacering avgör om ett villkor definierar berättigade vägar eller filtrerar vägar efter att sökvägsprefixet har valt dem:

  • En inline WHERE i ett nod- eller kantmönster är en del av mönstret. Det begränsar vilka vägar som är berättigade innan ALL eller ANY SHORTEST tillämpas.
  • En satsnivå WHERE efter det kompletta MATCH mönstret är ett postfilter. Den filtrerar rader efter att sökvägsprefixet har valt vägar.
  • Ett efterföljande FILTER uttalande filtrerar också rader efter val av väg.

Denna distinktion är särskilt viktig med ANY SHORTEST. I följande mönster är endast knows kanter skapade på eller efter det angivna datumet berättigade när frågan väljer en kortaste väg:

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

Att flytta kantvillkoret till ett postfilter ändrar betydelsen. Frågan väljer först den kortaste vägen utan det villkoret. Den tar sedan bort den valda vägen om någon kant misslyckas med villkoret; den väljer istället inte en längre väg:

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

Viktigt!

För vissa ANY SHORTEST frågeformer kan Graph för närvarande tillämpa ett satsnivåvillkor MATCH ... WHERE innan valet av väg. Tills denna begränsning är löst, använd inline-predikat för vägbehörighet och ett separat FILTER uttalande för filtrering efter urval. Mer information finns i Aktuella begränsningar.

Använda mönster med variabel längd

Mönster med variabel längd är kraftfulla konstruktioner som gör att du kan hitta sökvägar med varierande längd utan att skriva repetitiva mönsterspecifikationer. De är viktiga för att passera hierarkier, sociala nätverk och andra strukturer där den optimala sökvägslängden inte är känd i förväg.

Avgränsade mönster med variabel längd

Många vanliga graffrågor kräver att samma gränsmönster upprepas flera gånger. I stället för att skriva utförliga mönster som:

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

Du kan använda den mer koncisa syntaxen för variabel längd:

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

{3} Anger att -[:knows]-> kantmönstret ska upprepas exakt tre gånger.

Flexibla upprepningsintervall: Om du vill ha mer flexibilitet kan du ange både en nedre gräns och en övre gräns för upprepningen:

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

Det här mönstret hittar direkta vänner, vänner och vänners vänner i en enda fråga.

Anmärkning

Den undre gränsen kan också vara noll. En zero-hop-match innehåller inga kanter och kräver att båda endpoint-nodmönstren matchar samma nod.

Example:

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

Detta mönster matchar varje person både och p1p2 vid noll hopp, och matchar sammanlänkade par vid ett hopp.

När ingen nedre gräns anges i {,n}, är den som standard noll.

Komplexa kompositioner med variabel längd: Mönster med variabel längd kan ingå i större, mer komplexa mönster, som i följande fråga:

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 hittar par av kommentarer där personer som känner varandra gillar olika kommentarer och ett meddelande m kopplas till varje kommentar med en kedja av en till tre replyOf kanter.

Binda mönsterbrytarvariabler med variabel längd

När du binder ett kantmönster med variabel längd ändras värdet och typen av kantvariabel beroende på referenskontexten. Att förstå det här beteendet är avgörande för korrekt bearbetning av matchningar med variabel längd:

Två referensgrader:

  • Inuti ett mönster med variabel längd: Diagramkantvariabler binder till varje enskild kant längs den matchade sökvägen (kallas även "singleton degree of reference")
  • Utanför ett mönster med variabel längd: Diagramkantvariabler binder till sekvensen för alla kanter längs den matchade sökvägen (kallas även "gruppreferensgrad")

Exempel som visar båda kontexterna:

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

Utvärderingen av kantvariabeln e sker i två kontexter:

  • I meddelandetMATCH: Frågan finner kedjar av vänner-av-vänner-av-vänner var varje kamratskap var etablerad efter året 2000. Under mönstermatchning utvärderas gränsmönsterpredikatet e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") en gång för varje kandidatkant. I det här sammanhanget e är det bundet till ett referensvärde för en enda kant.

  • I -instruktionenRETURN: Här e är bunden till en (grupp) lista med gränsreferensvärden i den ordning de inträffar i den matchade kedjan. Resultatet av e[0] är det första gränsreferensvärdet i varje matchad kedja.

Variabellängdsmönsterkantvariabler i horisontell aggregering:

Kantvariabler begränsade av mönstermatchning av variabel längd är grupplistor utanför det variabellängdsmönstret och kan därför användas i horisontell 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

För mer information, se Aggregerade funktioner.

Obundna mönster med variabel längd

Använd en obegränsad kvantifierare när den maximala väglängden inte är känd:

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

Och + genvägar specificerar * noll-eller-fler och en-eller-fler-upprepningar:

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

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

Ett obegränsat mönster med standardkombinationen ALL WALK avvisas eftersom cykler kan ge oändligt många matchande vägar. Använd TRAIL, SIMPLE, eller ACYCLIC för att begränsa vägen genom kant- eller nodunkhet. Dessa lägen garanterar terminering, men en stor graf kan ändå ge ett stort antal vägar.

Viktigt!

För en väg begränsad av en obegränsad ANY SHORTEST WALK, är PATH_LENGTH(path) de enda stödda användningarna och, tillsammans med den, path IS NULL. Grafen materialiserar inte hela vägen i denna form. Använd en ändlig övre gräns eller specificera TRAIL, SIMPLE, eller ACYCLIC för att returnera eller på annat sätt använda vägen.