Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Grafiekpatronen zijn belangrijke bouwstenen van uw GQL-query's in grafiek in Microsoft Fabric. Ze beschrijven de structuren die u zoekt in de grafiek met behulp van knooppunten en randen op een intuïtieve, visuele manier. U kunt grafiekpatronen beschouwen als sjablonen die door de query-engine worden vergeleken met de werkelijke gegevens in uw grafiek.
In dit artikel worden de syntaxis- en samenstellingsregels voor grafiekpatronen in GQL uitgelegd.
Belangrijk
Dit artikel gebruikt uitsluitend de voorbeeldgrafiekdataset van sociale netwerken.
Eenvoudige elementpatronen
Met eenvoudige elementpatronen kunt u afzonderlijke knooppunten en randen uit uw grafiek vergelijken die voldoen aan specifieke vereisten. Deze patronen vormen de basis voor complexere patroonkoppelingen.
Eenvoudige knooppuntpatronen
Een knooppuntpatroon geeft de labels en eigenschappen op die een knooppunt moet overeenkomen:
(:Place&City { name: "New York" })
Dit patroon komt overeen met alle knooppunten met zowel de als Place de City labels (aangegeven door de operator) en waarvan & de name eigenschap gelijk is "New York"aan. Deze combinatie van vereiste labels en eigenschappen wordt de opvulfunctie van het knooppuntpatroon genoemd.
Sleutelbegrippen:
-
Labels die overeenkomen: gebruik
&dit om meerdere labels te vereisen. - Eigenschapsfiltering: geef exacte waarden op die overeenkomen met eigenschappen.
- Flexibele overeenkomsten ('covariant'): overeenkomende knooppunten kunnen meer labels en eigenschappen hebben dan de opgegeven labels.
Opmerking
Knooppunten kunnen meerdere labels hebben, maar randtypen met meerdere labels worden nog niet ondersteund.
Eenvoudige randpatronen
Edge-patronen zijn complexer dan knooppuntpatronen. Ze specificeren niet alleen een filler, maar verbinden ook een origin-nodepatroon met een doel-node patroon. Edge-patronen beschrijven vereisten voor zowel de rand als de eindpunten:
(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)
De pijlrichting -[...]-> is belangrijk—deze bepaalt (:Person) als het patroon van de oorsprong van de knoop en (:Comment) als het patroon van de doelknop. Inzicht in de richting van de rand is cruciaal voor het correct uitvoeren van query's op uw grafiek.
Equivalent gespiegeld patroon:
U kunt de pijl spiegelen en de knooppuntpatronen wisselen om het equivalente gespiegelde randpatroon te maken:
(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)
Met dit patroon worden dezelfde relaties gevonden, maar vanuit het tegenovergestelde perspectief.
Omgeleide randpatronen
Wanneer de richting van een grafiekrand niet van belang is voor uw query, kunt u deze ongewijzigd laten door een omgeleid randpatroon te maken:
(:Song)-[:inspired]-(:Movie)
Dit patroon komt overeen met dezelfde randen als (:Song)-[:inspired]->(:Movie) en (:Movie)-[:inspired]->(:Song) gecombineerd, ongeacht welke knoop de oorsprong is en welke het doel is (dit voorbeeld komt niet uit het type sociale netwerkgrafiek).
Snelkoppelingen voor grafiekrandpatronen
GQL biedt handige sneltoetsen voor algemene randpatronen om uw query's beknopter te maken:
-
()->()staat voor()-[]->()(omgeleide rand met elk label) -
()<-()staat voor()<-[]-()(omgeleide rand in omgekeerd met elk label) -
()-()staat voor()-[]-()(elke omgeleide rand met elk label)
Deze sneltoetsen kunnen handig zijn als u zich zorgen maakt over connectiviteit, maar niet over het specifieke type grafiekrand.
Labelexpressies
Patronen kunnen complexe vereisten uitdrukken op de labels van overeenkomende knooppunten en randen.
Voorbeeld:
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
Hiermee wordt het aantal isLocatedIn randen geteld waarmee Person knooppunten of Organization-maar-niet-knooppuntenCompany (die altijd University knooppunten in het schema van het sociale netwerk zijn) met City of Country knooppunten worden geteld.
Syntaxis:
| Syntaxis | Meaning |
|---|---|
A&B |
Labels moeten zowel A als B bevatten. |
A|B |
Labels moeten ten minste één van A of B bevatten. |
!A |
Labels moeten A uitsluiten. |
Gebruik bovendien haakjes om de volgorde van de evaluatie van labelexpressies te bepalen. Heeft standaard ! de hoogste prioriteit en & heeft een hogere prioriteit dan |. Daarom !A&B|C|!D is hetzelfde als ((!A)&B)|C|(!D).
Bindingsvariabelen
Met variabelen kunt u verwijzen naar overeenkomende grafiekelementen in andere delen van uw query. Informatie over het binden en gebruiken van variabelen is essentieel voor het bouwen van krachtige query's.
Variabelen voor bindingselementen
Zowel knooppunt- als randpatronen kunnen overeenkomende knooppunten en randen binden aan variabelen voor later gebruik.
(p:Person)-[w:workAt]->(c:Company)
In dit patroon p is gekoppeld aan overeenkomende Person knooppunten, w aan overeenkomende randen en workAt aan overeenkomende cCompany knooppunten.
Variabel hergebruik voor structurele beperkingen:
Als u dezelfde variabele in een patroon meerdere keren opnieuw gebruikt, wordt een beperking voor de structuur van overeenkomsten weergegeven. Elk exemplaar van dezelfde variabele moet altijd worden gekoppeld aan hetzelfde grafiekelement in een geldige overeenkomst. Variabel hergebruik is krachtig voor het uitdrukken van complexe structurele vereisten.
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
Het patroon vindt knooppunten Person en x die elkaar kennen en op hetzelfde werk ywerken, dat is gebonden aan de variabeleCompany.c Het hergebruik van c zorgt ervoor dat beide personen in hetzelfde bedrijf werken.
Patroonpredicaten met elementvariabelen:
Met variabelen voor bindingselementen kunt u knooppunt- en randpatroonpredicaten opgeven. In plaats van alleen een filler met exacte eigenschapswaarden op te geven, kan { name: "New York, USA" }een filler een predicaat opgeven dat voor elk kandidaat-element wordt geëvalueerd. Het patroon komt alleen overeen als het predicaat resulteert in TRUE:
(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)
Het randpatroon vindt mensen die elkaar kennen sinds 1 januari 2000, met behulp van een flexibele voorwaarde in plaats van een exacte overeenkomst.
Opmerking
Edge-patroonvariabelen binden altijd aan de afzonderlijke rand in het randpatroonpredicaat, zelfs wanneer u patronen met een variabele lengte gebruikt. Dit kan helpen bij het niet hoeven van onnestste randgroepslijstvariabelen om een postfilter uit te voeren. Zie Randvariabelen voor het patroon Van bindingsvariabelen met een variabele lengte.
Geavanceerde patroonpredicaattechnieken:
Patroonpredicaten bieden krachtige inlinefiltermogelijkheden waarmee de leesbaarheid van query's kan worden verbeterd:
-- 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
Aanbeveling
Houd een predicaat binnen het patroon wanneer het beschrijft welke node of edge aan de match kan deelnemen.
Bindingpadvariabelen
U kunt ook een overeenkomend pad koppelen aan een padvariabele voor verdere verwerking of de volledige padstructuur retourneren aan de gebruiker:
p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
p Hier is gebonden aan een padwaarde die de volledige overeenkomende padstructuur vertegenwoordigt, inclusief referentiewaarden voor alle knooppunten en randen in de opgegeven volgorde.
Gebonden paden kunnen ofwel aan de gebruiker worden teruggegeven of verder worden verwerkt met functies zoals NODES of 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
Patronen opstellen
Query's in de praktijk vereisen vaak complexere patronen dan eenvoudige structuren voor node-edge-knooppunten. GQL biedt verschillende manieren om patronen op te stellen voor geavanceerde grafiekkruisingen.
Padpatronen opstellen
Padpatronen kunnen worden samengesteld door eenvoudige knooppunt- en randpatronen samen te vouwen om langere doorkruisingen te maken.
(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Het patroon gaat door van een persoon via hun sociale en professionele verbindingen om te vinden waar het bedrijf van hun collega zich bevindt.
Stukgewijze patroonconstructie: U kunt ook stapsgewijs padpatronen maken, waardoor complexe patronen gemakkelijker te lezen en te begrijpen zijn:
(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
Met deze aanpak wordt dezelfde doorkruising opgesplitst in logische stappen, waardoor u deze gemakkelijker kunt begrijpen en fouten kunt opsporen.
Niet-lineaire patronen opstellen
De resulterende vorm van een patroon hoeft geen lineair pad te zijn. U kunt complexere structuren vergelijken, zoals stervormige patronen die uit een centraal knooppunt uitstralen:
(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)
Het patroon vindt een persoon samen met hun voorkeuren voor onderwijs, werkgelegenheid en inhoud allemaal tegelijk: een uitgebreide profielquery.
Patronen in hetzelfde MATCH systeem hoeven geen variabele te delen. Losstaande patronen vormen een Cartesiaans product van hun matches. Hergebruik een variabele wanneer de patronen hetzelfde graafelement moeten binden en alleen gekoppelde combinaties moeten overblijven.
Hergebruik van controleelementen
GQL beheert herhaalde knooppunten en randen op twee niveaus:
- Een matchmodus geldt voor het volledige graafpatroon, inclusief komma-gescheiden paden.
- Een padmodus geldt voor één pad.
De standaard matchmodus is REPEATABLE ELEMENTS. Het maakt het mogelijk dat dezelfde elementbinding plaatsvindt in verschillende delen van het grafiekpatroon, afhankelijk van de padmodus van elk pad. Je kunt het expliciet opschrijven:
REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
Gebruik DIFFERENT EDGES of zijn synoniem DIFFERENT RELATIONSHIPS om randuniciteit te vereisen over het volledige graafpatroon. Deze matchmodus verandert ook elk WALK pad in het patroon naar TRAIL gedrag.
DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
De volgende padmodi regelen herhaalde elementen binnen elk pad:
| Padmodus | Hergebruik van elementen |
|---|---|
WALK |
Knooppunten en randen kunnen zich herhalen. |
TRAIL |
Randen kunnen zich niet herhalen, maar knooppunten kunnen zich wel herhalen. |
SIMPLE |
Nodes kunnen niet herhalen, behalve dat de eerste en laatste node hetzelfde kunnen zijn. Randen kunnen zich niet herhalen. |
ACYCLIC |
Nodes kunnen zich niet herhalen, inclusief de eerste en laatste node. Randen kunnen zich niet herhalen. |
WALK is de standaard padmodus. Een pad wordt voorvoegd met een andere modus wanneer je striktere elementuniciteit nodig hebt:
Voor SIMPLE en ACYCLICvolgt randuniciteit uit knoopuniciteit. Een SIMPLE pad kan sluiten door terug te keren naar zijn eerste knooppunt, maar het kan nog steeds geen rand hergebruiken.
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
Het TRAIL patroon levert alleen overeenkomsten op waarin e1, e2, en e3 verschillend zijn. Knooppunten kunnen zich nog steeds herhalen, dus het pad kan een cyclus vormen zonder een rand opnieuw te gebruiken.
Controleer welke paden worden teruggegeven
Een padzoekprefix bepaalt welke paden een padpatroon teruggeeft. Het standaardvoorvoegsel ALL geeft elk pad terug dat overeenkomt met de padmodus en het patroon. Je kunt expliciet schrijven ALL :
ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)
Gebruik ANY SHORTEST om één kortste matchingpad terug te geven voor elk bron-bestemmingspaar uit elke invoerrij:
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
Als meerdere paden de kortste lengte overlappen, levert de query er één terug, maar welk gekoppeld pad wordt teruggegeven is niet deterministisch. Een ondergrens van nul kan een zero-hop pad teruggeven van een bronknoop naar zichzelf.
ALL SHORTEST En ANY padzoekopdrachten worden niet ondersteund.
Plaatspredicaten vóór of na padselectie
Predicaatplaatsing bepaalt of een voorwaarde geschikte paden definieert of paden filtert nadat het padzoekprefix deze heeft geselecteerd:
- Een inline
WHEREin een knoop- of randpatroon maakt deel uit van het patroon. Het beperkt welke paden vóórALLofANY SHORTESTworden toegepast in aanmerking komen. - Een statement-niveau
WHEREna het volledigeMATCHpatroon is een postfilter. Het filtert rijen nadat het padzoekprefix paden heeft geselecteerd. - Een volgende
FILTERinstructie filtert ook rijen na padselectie.
Dit onderscheid is vooral belangrijk bij ANY SHORTEST. In het volgende patroon zijn alleen knows randen die op of na de opgegeven datum zijn aangemaakt, in aanmerking wanneer de query een kortste pad kiest:
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
Het verplaatsen van de randconditie naar een postfilter verandert de betekenis. De query selecteert eerst een kortste pad zonder die voorwaarde. Vervolgens verwijdert het het geselecteerde pad als een rand niet aan de voorwaarde voldoet; het selecteert in plaats daarvan geen langer pad:
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
Belangrijk
Voor sommige ANY SHORTEST queryvormen kan Graph momenteel een statement-level MATCH ... WHERE voorwaarde toepassen vóór padselectie. Totdat deze beperking is opgelost, gebruik inline predicaten voor padgeschiktheid en een aparte FILTER instructie voor postselectie-filtering. Zie Huidige beperkingen voor meer informatie.
Patronen met variabele lengte gebruiken
Patronen met variabele lengte zijn krachtige constructies waarmee u paden van verschillende lengtes kunt vinden zonder terugkerende patroonspecificaties te schrijven. Ze zijn essentieel voor het doorkruisen van hiërarchieën, sociale netwerken en andere structuren waarbij de optimale padlengte niet van tevoren bekend is.
Patronen met de lengte van afhankelijke variabelen
Veel veelvoorkomende grafiekquery's vereisen meerdere keren hetzelfde randpatroon te herhalen. In plaats van uitgebreide patronen te schrijven, zoals:
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
U kunt de beknoptere syntaxis voor de lengte van variabelen gebruiken:
(:Person)-[:knows]->{3}(:Person)
Hiermee {3} geeft u op dat het -[:knows]-> randpatroon precies drie keer moet worden herhaald.
Flexibele herhalingsbereiken: Voor meer flexibiliteit kunt u zowel een ondergrens als een bovengrens opgeven voor de herhaling:
(:Person)-[:knows]->{1, 3}(:Person)
Dit patroon vindt directe vrienden, vrienden-van-vrienden en vrienden-van-vrienden-van-vrienden allemaal in één query.
Opmerking
De ondergrens kan ook nul zijn. Een zero-hop match bevat geen randen en vereist dat beide knooppuntpatronen dezelfde knoop overeenkomen.
Example:
(p1:Person)-[:knows]->{0,1}(p2:Person)
Dit patroon komt bij elke persoon overeen als zowel p1 als p2 bij nul hops, en komt overeen met verbonden paren bij één hop.
Wanneer er geen ondergrens in is opgegeven {,n}, staat deze standaard op nul.
Complexe samenstellingen van variabele lengte: Patronen met variabele lengte kunnen deel uitmaken van grotere, complexere patronen, zoals in de volgende query:
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
Het patroon vindt paren van reacties waarbij mensen die elkaar kennen verschillende reacties likten en een bericht m aan elke reactie wordt verbonden door een ketting van één tot drie replyOf randen.
Randvariabelen voor patroonlengte binden
Wanneer u een randpatroon met variabele lengte koppelt, verandert de waarde en het type van de randvariabele, afhankelijk van de referentiecontext. Inzicht in dit gedrag is van cruciaal belang voor het correct verwerken van overeenkomsten met de lengte van variabelen:
Twee referentiegraden:
- Binnen een patroon met variabele lengte: Grafiekrandvariabelen binden zich aan elke afzonderlijke rand langs het overeenkomende pad (ook wel 'singleton degree of reference' genoemd)
- Buiten een patroon met variabele lengte: Grafiekrandvariabelen binden zich aan de reeks van alle randen langs het overeenkomende pad (ook wel 'groepsreferentiegraad' genoemd)
Voorbeeld waarin beide contexten worden gedemonstreerd:
MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100
De evaluatie van de randvariabele e vindt plaats in twee contexten:
In de
MATCHverklaring: De query vindt ketens van vrienden-van-vrienden-van-vrienden waar elke vriendschap werd opgericht sinds het jaar 2000. Tijdens het vergelijken van patronen wordt het randpatroonpredicaate.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")eenmaal geëvalueerd voor elke kandidaatrand. In deze contexteis het gebonden aan één edge-verwijzingswaarde.In de
RETURNinstructie: Hiereis gebonden aan een (groep) lijst met randreferentiewaarden in de volgorde waarin ze voorkomen in de overeenkomende keten. Het resultaat ise[0]de eerste edge-referentiewaarde in elke overeenkomende keten.
Variabele patroonrandvariabelen in horizontale aggregatie:
Randvariabelen die begrensd zijn door patroonmatching van variabele lengte zijn groepslijsten buiten het variabele-lengte patroon en kunnen daarom worden gebruikt in horizontale aggregatie.
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
Voor meer informatie, zie Aggregate functions.
Niet-gebonden patronen voor variabele lengte
Gebruik een onbegrensde kwantor wanneer de maximale padlengte niet bekend is:
-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)
De * en + snelkoppelingen specificeren nul-of-meer en één-of-meer herhalingen:
-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)
-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)
Een onbegrensd patroon met de standaardcombinatie ALL WALK wordt afgewezen omdat cycli oneindig veel matchingpaden kunnen opleveren. Gebruik TRAIL, SIMPLE, of ACYCLIC om het pad te begrensen via rand- of knooppunt-uniciteit. Deze modi garanderen beëindiging, maar een grote graaf kan nog steeds een groot aantal paden opleveren.
Belangrijk
Voor een pad begrensd door een onbegrensd ANY SHORTEST WALK, zijn PATH_LENGTH(path) de enige ondersteunde toepassingen en, naast dit, path IS NULL. Een grafiek materialiseert het volledige pad niet in deze vorm. Gebruik een eindige bovengrens of specificeer TRAIL, SIMPLE, of ACYCLIC om het pad terug te geven of anderszins te gebruiken.