Dela via


GQL-grafmönster

Anmärkning

Den här funktionen är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och rekommenderas inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Diagrammönster är viktiga byggstenar i dina GQL-frågor. 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.

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:

(: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 specifikationen av obligatoriska etiketter och egenskaper kallas för fyllnadsmönstret för noden.

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

Grafmodeller med flera elementetiketter stöds ännu inte (känt problem).

Enkla kantmönster

Kantmönster är mer komplexa än nodmönster. De anger inte bara ett fyllmedel utan ansluter också ett källnodmö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 källnodmö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)

Det här mönstret matchar samma kanter som (:Song)-[:inspired]->(:Movie) och (:Movie)-[:inspired]->(:Song) kombineras, oavsett vilken nod som är källan och vilken som är målet (det här exemplet kommer inte från graftypen för sociala nätverk).

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

Om du använder mönsterpredikat när villkoren är mycket selektiva kan du minska storleken på mellanliggande resultat.

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.

Matcha spår

I komplexa mönster är det ofta oönskat att korsa samma kant flera gånger. Återanvändning av kanter blir viktigt när det faktiska diagrammet innehåller cykler som kan leda till oändliga eller alltför långa sökvägar. Grafen i Microsoft Fabric stöder matchningsläget för att hantera återanvändning av TRAIL kanter.

Om du prefixar ett sökvägsmönster med nyckelordet TRAIL ignoreras alla matchningar som binder samma kant flera gånger:

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

Med hjälp av TRAILskapar mönstret endast matchningar där alla kanter är olika. Även om c = a sökvägen utgör en cykel i en viss matchning e3 binder den därför aldrig till samma kant som e1.

Läget TRAIL är viktigt för att förhindra oändliga loopar och se till att dina frågor returnerar meningsfulla, icke-tillfälliga sökvägar.

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

Viktigt!

Begränsade mönster med variabellängd stöder för närvarande endast en maximal övre gräns på 8. Se artikeln om aktuella begränsningar.

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 nedre gränsen kan också vara 0. I det här fallet matchas inga kanter och hela mönstret matchar bara om och bara om de två slutpunktsnodmönstren matchar samma nod.

Exempel:

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

Detta mönster matchar par av olika personer som känner varandra men matchar också samma person som båda p1 och p2 – även om den personen inte "känner" sig själv.

När ingen lägre gräns har angetts är standardvärdet 0 (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 med kommentarer där personer som känner varandra gillade olika kommentarer, och dessa kommentarer är anslutna via svarskedjor på 1-5 nivåer vardera.

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

Se avsnittet om horisontell aggregering för ytterligare detaljer.