Delen via


GQL-grafiekpatronen

Opmerking

Deze functie is momenteel beschikbaar als openbare preview-versie. Deze preview wordt geleverd zonder een service level agreement en wordt niet aanbevolen voor productieworkloads. Bepaalde functies worden mogelijk niet ondersteund of hebben mogelijk beperkte mogelijkheden. Voor meer informatie, zie Aanvullende Gebruiksvoorwaarden voor Microsoft Azure Previews.

Grafiekpatronen zijn kernbouwstenen van uw GQL-query's. 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.

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:

(: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 specificatie 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

Grafiekmodellen met meerdere elementlabels worden nog niet ondersteund (bekend probleem).

Eenvoudige randpatronen

Edge-patronen zijn complexer dan knooppuntpatronen. Ze geven niet alleen een filler op, maar verbinden ook een bronknooppuntpatroon met een doelknooppuntpatroon. 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: het bepaalt (:Person) het bronknooppuntpatroon en (:Comment) als het doelknooppuntpatroon. 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 welk knooppunt de bron is en wat het doel is (dit voorbeeld is niet van het grafiektype sociaal netwerk).

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.

Example:

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.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

Aanbeveling

Het gebruik van patroonpredicaten wanneer de voorwaarden zeer selectief zijn, kan de grootte van tussenliggende resultaten verminderen.

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.

Wedstrijdsporen

In complexe patronen is het vaak ongewenst om meerdere keren dezelfde rand te doorlopen. Edge-hergebruik wordt belangrijk wanneer de werkelijke grafiek cycli bevat die kunnen leiden tot oneindige of te lange paden. Grafiek in Microsoft Fabric biedt ondersteuning voor de TRAIL overeenkomstmodus om het hergebruik van randen af te handelen.

Als u een padpatroon voorvoegt met het trefwoord TRAIL , worden alle overeenkomsten verwijderd die dezelfde rand meerdere keren binden:

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

Door te gebruiken TRAIL, produceert het patroon alleen overeenkomsten waarin alle randen verschillen. Dus, zelfs als c = a het pad een cyclus vormt in een bepaalde overeenkomst, e3 bindt nooit aan dezelfde rand als e1.

De TRAIL modus is essentieel voor het voorkomen van oneindige lussen en ervoor zorgen dat uw query's zinvolle, niet-overlopende paden retourneren.

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

Belangrijk

Patronen met de lengte van afhankelijke variabelen ondersteunen momenteel alleen een maximale bovengrens van 8. Zie het artikel over huidige beperkingen.

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 zijn 0. In dit geval worden er geen randen vergeleken en komt het hele patroon alleen overeen als en alleen als de twee eindpuntknooppuntpatronen overeenkomen met hetzelfde knooppunt.

Voorbeeld:

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

Dit patroon matcht paren van verschillende personen die elkaar kennen , maar ook dezelfde persoon als beide p1 en p2 - zelfs als die persoon zichzelf niet "kent".

Als er geen ondergrens is opgegeven, wordt deze over het algemeen ingesteld op 0 (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 opmerkingen waarbij mensen die elkaar kennen verschillende opmerkingen leuk vonden en die opmerkingen zijn verbonden via antwoordketens van elk 1-5 niveaus.

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 MATCH verklaring: 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 randpatroonpredicaat e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") eenmaal geëvalueerd voor elke kandidaatrand. In deze context e is het gebonden aan één edge-verwijzingswaarde.

  • In de RETURN instructie: Hier e is gebonden aan een (groep) lijst met randreferentiewaarden in de volgorde waarin ze voorkomen in de overeenkomende keten. Het resultaat is e[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

Zie de sectie over horizontale aggregatie voor meer details.