Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Notat
Denne funktion er i øjeblikket tilgængelig som offentlig prøveversion. Denne prøveversion leveres uden en serviceniveauaftale og anbefales ikke til produktionsarbejdsbelastninger. Visse funktioner understøttes muligvis ikke eller kan have begrænsede funktioner. Du kan finde flere oplysninger under Supplerende vilkår for anvendelse af Microsoft Azure Previews.
Grafmønstre er kernekomponenter i dine GQL-forespørgsler. 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.
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:
(: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 specifikation af påkrævede mærkater 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
Grafmodeller med flere elementetiketter understøttes endnu ikke (kendt problem).
Enkle kantmønstre
Kantmønstre er mere komplekse end nodemønstre. De angiver ikke kun et fyldstof, men forbinder også et kildenodemønster med et destinationsnodemø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)
Pileretningen -[...]-> er vigtig – den bestemmer (:Person) som kildenodemønsteret og (:Comment) som destinationsnodemø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 kilden, og hvilken destination der er destinationen (dette eksempel er ikke fra graftypen for det sociale netværk).
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.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
Brug af mønster prædikater, når betingelserne er meget selektive, kan reducere størrelsen af mellemliggende resultater.
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.
Søg efter spor
I komplekse mønstre er det ofte uønsket at krydse den samme kant flere gange. Genbrug af kant bliver vigtig, når den faktiske graf indeholder cyklusser, der kan føre til uendelige eller alt for lange stier. Grafen i Microsoft Fabric understøtter matchtilstanden for at håndtere genbrug af TRAIL kant.
Hvis du præfikser et stimønster med nøgleordet TRAIL , kasseres alle match, der binder den samme kant flere gange:
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
Ved hjælp af TRAILopretter mønsteret kun match, hvor alle kanter er forskellige.
c = a Selvom stien danner en cyklus i et givet match, e3 bindes den derfor aldrig til den samme kant som e1.
Tilstanden TRAIL er vigtig for at forhindre uendelige løkker og sikre, at dine forespørgsler returnerer meningsfulde, ikke-redundante stier.
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
Vigtigt
Afgrænsede mønstre med variabel længde understøtter i øjeblikket kun en øvre grænse på 8. Se artiklen om aktuelle begrænsninger.
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 0. I dette tilfælde matches ingen kanter, og hele mønsteret stemmer kun overens, hvis og kun hvis de to slutpunktsnodemønstre stemmer overens med den samme node.
Eksempel:
(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)
Dette mønster matcher par af forskellige personer, der kender hinanden , men matcher også den samme person som begge p1 og p2 – selvom personen ikke "kender" sig selv.
Når der ikke er angivet en nedre grænse, er den som regel som standard 0 (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ønsteret finder par med kommentarer, hvor personer, der kender hinanden, synes godt om forskellige kommentarer, og disse kommentarer er forbundet via svarkæder på 1-5 niveauer hver.
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ætningen
MATCH: 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ædikatete.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")for kantmønster én gang for hver kandidatkant. Er i denne kontekstebundet til en enkelt kantreferenceværdi.I sætningen
RETURN: Her er bundet til en (gruppe) liste over kantreferenceværdier i den rækkefølge,ede forekommer i den tilsvarende kæde. Resultatet afe[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
Se afsnittet om horisontal aggregering for yderligere detaljer.