Vzory grafu GQL

Vzory grafu sú základnými stavebnými prvkami vašich dotazov GQL v grafe v službe Microsoft Fabric. Popisujú štruktúry, ktoré v grafe hľadáte, pomocou uzlov a okrajov intuitívnym vizuálnym spôsobom. Predstavte si vzory grafov ako šablóny, ktoré sa nástroj dotazov snaží prispôsobiť skutočným údajom v grafe.

Tento článok vysvetľuje pravidlá syntaxe a zloženia pre grafové vzory v GQL.

Dôležité

Tento článok výhradne používa príkladovú dátovú sadu grafov sociálnych sietí.

Jednoduché vzory prvkov

Jednoduché vzory prvkov pomáhajú zodpovedať jednotlivým uzlom a okrajom z grafu, ktoré spĺňajú konkrétne požiadavky. Tieto vzory tvoria základ pre zložitejšie zhody vzorov.

Jednoduché vzory uzla

Vzor uzla určuje označenia a vlastnosti, ktoré sa musia v uzle zhodovať:

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

Tento vzor zodpovedá všetkým uzlom, ktoré majúPlace označenia a City (označené operátorom & ) a ktorých name vlastnosť sa rovná "New York". Táto kombinácia povinných označení a vlastností sa nazýva výplň vzoru uzla.

Kľúčové koncepty:

  • Zhodné označenie: Používa sa & na vyžadovanie viacerých označení.
  • Filtrovanie vlastností: zadajte presné hodnoty, ktoré sa musia zhodovať s vlastnosťami.
  • Flexibilné ("kovariančné") zhodné: Zhodné uzly môžu mať viac označení a vlastností nad rámec tých zadaných.

Poznámka

Uzly môžu mať viacero označení, ale okrajové typy s viacerými označeniami zatiaľ nie sú podporované.

Jednoduché hrany vzory

Vzory okrajov sú zložitejšie ako vzory uzla. Nielenže špecifikujú výplň, ale tiež spájajú vzor pôvodného uzla s vzorom cieľového uzla. Vzory okrajov popisujú požiadavky na okraji aj v jeho koncových bodoch:

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

Smer -[...]-> šípky je dôležitý – určuje (:Person) ako vzor počiatočného uzla a (:Comment) ako vzor cieľového uzla. Porozumenie smeru okrajov je rozhodujúce pre správne dotazovanie grafu.

Ekvivalentný zrkadlený vzor:

Môžete prevrátiť šípku a vymeniť vzory uzla a vytvoriť ekvivalentný, zrkadlený vzor okraja:

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

Tento vzor nájde rovnaké vzťahy, ale z opačnej perspektívy.

Všetky smerované vzory okrajov

Keď smer hranu grafu nezáleží na dotaze, môžete ho nechať nezadané vytvorením vzoru každého smerovaného okraja:

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

Tento vzor zodpovedá rovnakým hranám ako (:Song)-[:inspired]->(:Movie) a (:Movie)-[:inspired]->(:Song) kombinovane, bez ohľadu na to, ktorý uzol je pôvodom a ktorý je cieľom (tento príklad nie je z typu grafu sociálnej siete).

Odkazy na vzory okrajov grafu

Jazyk GQL poskytuje pohodlné skratky pre bežné okrajové vzory, aby boli dotazy stručnejšie:

  • ()->() je skratka pre ()-[]->() (smerovaný okraj s ľubovoľným označením)
  • ()<-() je skratka pre ()<-[]-() (smerovaný okraj v opačnom poradí s ľubovoľným označením)
  • ()-() je skratka pre ()-[]-() (ľubovoľný smerovaný okraj s ľubovoľným označením)

Tieto skratky môžu byť užitočné, keď vám záleží na pripojení, ale nie na konkrétnom type grafu.

Výrazy označenia

Vzory môžu vyjadriť zložité požiadavky na označenia zhodných uzlov a okrajov.

Príklad:

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

Vypočíta počet isLocatedIn okrajov, ktoré sa pripájajú Person uzly alebo Organizationuzly -ale-not-Company (ktoré sú vždy University uzly v schéme sociálnej siete) alebo CityCountry uzly.

Syntax:

Syntax Význam
A&B Označenia musia obsahovať A aj B.
A\|B Označenia musia obsahovať aspoň jednu z A alebo B.
!A Označenia musia vylúčiť A.

Okrem toho môžete pomocou zátvorky ovládať poradie vyhodnocovania výrazov označenia. Predvolene ! má najvyššiu prioritu a & má vyššiu prioritu ako |. Preto !A&B|C|!D je rovnaký ako ((!A)&B)|C|(!D).

Premenné väzby

Premenné vám umožňujú odkazovať na zhodné prvky grafu v iných častiach dotazu. Informácie o tom, ako naviazať a používať premenné, sú nevyhnutné na vytváranie výkonných dotazov.

Premenné prvku väzby

Vzory uzlov aj okrajov môžu naviazať zhodné uzly a okraje na premenné pre neskoršie odkazovanie.

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

V tomto vzore p sa viaže na zodpovedajúce Person uzly, w zodpovedajúce workAt okraje a c zodpovedajúce Company uzly.

Opätovné použitie premennej pre štrukturálne obmedzenia:

Opätovné opätovné využívanie rovnakej premennej vzorom viackrát vyjadruje obmedzenie štruktúry zhôd. Každý výskyt rovnakej premennej musí vždy naviazať na rovnaký prvok grafu v platnej zhode. Premenlivé opätovné použitie je výkonné na vyjadrenie zložitých štrukturálnych požiadaviek.

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

Vzor nájde uzlyPerson, x ktoré sa navzájom poznajú a fungujú na rovnakom ymieste , ktoré je viazané na premennú Companyc . Opätovné použitie zaisťuje, že obaja c ľudia pracujú v tej istej spoločnosti.

Vzorové predikáty s premennými prvku:

Premenné prvku väzby umožňujú zadať uzly a okrajové vzorové predikáty. Namiesto toho, aby ste zadali výplň s presnými hodnotami vlastností, ako je { name: "New York, USA" }napríklad výplň, môžete určiť predikát, ktorý sa vyhodnotí pre každý prvok kandidáta. Vzor sa zhoduje len vtedy, ak sa predikát vyhodnotí ako TRUE:

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

Okraj vzor nájde ľudí, ktorí sa poznali od januára 1, 2000, pomocou pružnej podmienky, skôr než presná zhoda.

Poznámka

Premenné vzorov okrajov sú vždy naviazané na jednotlivý okraj v predikáte okrajového vzoru, a to aj pri použití vzorov s premenlivou dĺžkou. Môže to pomôcť tým, že nebudete musieť na unnestovať premenné zoznamu skupín okrajov, aby ste mohli vykonať post-filter. Pozrite si tému Naviazať premenné vzoru s premenlivou dĺžkou.

Pokročilé techniky predikátov vzorov:

Vzorové predikáty poskytujú výkonné možnosti vnoreného filtrovania, ktoré dokážu zlepšiť čitateľnosť dotazov:

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

Prepitné

Použitím vzorových predikátov, ak sú podmienky vysoko selektívne, sa môže znížiť veľkosť medzikrokových výsledkov.

Premenné cesty väzby

Tiež môžete naviazať zladenú cestu k premennej cesty na ďalšie spracovanie alebo vrátiť používateľovi úplnú štruktúru cesty:

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

p Tu je viazaná na hodnotu cesty predstavujúcu úplnú zladenú štruktúru cesty vrátane referenčných hodnôt pre všetky uzly a okraje v danom poradí.

Viazané cesty môžu byť buď vrátené používateľovi, alebo ďalej spracované pomocou funkcií ako NODES alebo 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

Vytváranie vzorov

Dotazy z reálneho sveta často vyžadujú zložitejšie vzory ako jednoduché štruktúry uzla s okrajmi uzla. GQL poskytuje niekoľko spôsobov, ako vytvárať vzory pre sofistikované prechádzanie grafov.

Vytváranie vzorov ciest

Vzory cesty možno zostaviť zreťazením jednoduchých uzál a vzorov okrajov, aby sa vytvorili dlhšie prechádzanie.

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

Vzor prechádza od osoby prostredníctvom ich sociálnych a profesionálnych pripojení, aby zistil, kde sa nachádza spoločnosť jej kolegu.

Konštrukcia posuvnej vzorky: Vzory ciest môžete vytvárať aj prírastkovo, vďaka čomu sa zložité vzory ľahšie čítajú a pochopia:

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

Tento prístup rozdeľuje rovnaké prechádzanie na logické kroky, vďaka čomu je jednoduchšie porozumieť a ladiť.

Tvorba nelineárnych vzorov

Výsledný tvar vzoru nemusí byť lineárna cesta. Môžete sa zhodovať so zložitejšími štruktúrami, ako sú vzory v tvare hviezdy, ktoré vyžarujú z centrálneho uzla:

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

Vzor nájde osobu spolu s jej vzdelávaním, zamestnaním a obsahovými preferenciami naraz – komplexný dotaz na profil.

Priradiť stopy

V zložitých vzoroch je často nežiaduce prechádzať rovnakým okrajom viackrát. Opätovné použitie cez Microsoft Edge je dôležité vtedy, keď skutočný graf obsahuje cykly, ktoré môžu viesť k nekonečným alebo príliš dlhým cestám. Na spracovanie krajného opätovného použitia podporuje graf režim zhody TRAIL .

Predponou vzor cesty pomocou kľúčového slova TRAIL sa zahodí všetky zhody, ktoré viackrát viažu rovnaký okraj:

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

Pomocou vzoru TRAILsa vytvorí len zhoda, v ktorej sa líšia všetky okraje. Preto aj v c = a prípade, že cesta vytvorí cyklus v danej zhode, e3 nikdy sa viaže na rovnaký okraj ako e1.

Režim TRAIL je nevyhnutný na to, aby sa zabránilo nekonečným slučkám, a aby dotazy vracali zmysluplné a nepreddávené cesty.

Používanie vzorov s premenlivou dĺžkou

Vzory s premenlivou dĺžkou sú výkonné konštrukcie, ktoré vám umožňujú nájsť cesty s rôznymi dĺžkami bez písania opakujúcich sa špecifikácií vzorov. Sú nevyhnutné na prechádzanie hierarchiami, sociálnymi sieťami a inými štruktúrami, kde nie je optimálna dĺžka cesty vopred známa.

Ohraničené vzory s premenlivou dĺžkou

Dôležité

Ohraničené vzory s premenlivou dĺžkou aktuálne podporujú len maximálnu hornú hranicu 8. Pozrite si článok o aktuálnych obmedzeniach.

Množstvo bežných dotazov v grafe vyžaduje viackrát opakovanie rovnakého hranu. Namiesto písania podrobných vzorov, ako sú:

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

Môžete použiť stručnejšiu syntax s premenlivou dĺžkou:

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

Hodnota {3} určuje, že -[:knows]-> sa má vzor okraja zopakovať presne trikrát.

Flexibilné rozsahy opakovania: Ak potrebujete väčšiu flexibilitu, môžete určiť dolnú väzbu aj hornú hranicu opakovania:

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

Tento vzor nájde priamych priateľov, priateľov-z-priatelia a priatelia-z-priatelia-z-priatelia všetci v jednom dotaze.

Poznámka

Dolná hranica môže byť 0tiež . V tomto prípade sa nezhodujú žiadne okraje a celý vzor sa zhoduje iba vtedy a len vtedy, ak sa vzory uzla koncového bodu zhodujú s rovnakým uzlom.

Príklad:

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

Tento vzorec spája páry rôznych osôb, ktoré sa poznajú , ale zároveň zhoduje tú istú osobu s oboma p1 a – p2 aj keď tá osoba sama seba "nepozná".

Ak nie je zadaná žiadna dolná hranica, vo všeobecnosti sa vo všeobecnosti nastaví na 0 (nula).

Komplexné kompozície s premenlivou dĺžkou: Vzory s premenlivou dĺžkou môžu byť súčasťou väčších, zložitejších vzorov, ako je uvedené v nasledujúcom dotaze:

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

Vzor nájde páry komentárov, kde sa ľudia, ktorí sa navzájom poznajú, páčia rôzne komentáre, a tieto komentáre sú prepojené prostredníctvom odpovedí reťazcov 1 až 5 úrovní každý.

Naviazať premenné vzoru s premenlivou dĺžkou

Keď naviažete vzor okraja s premenlivou dĺžkou, hodnota a typ premennej okraja sa menia v závislosti od referenčného kontextu. Pochopenie tohto správania je rozhodujúce pre správne spracovanie zhody s premenlivou dĺžkou:

Dva stupne odkazu:

  • Vnútri vzoru s premenlivou dĺžkou: Premenné okrajov grafu sa viažu na každý jednotlivý okraj pozdĺž zladenej cesty (označuje sa aj ako "singleton degree of reference")
  • Mimo vzor s premenlivou dĺžkou: Premenné okrajov grafu sa viažu na postupnosť všetkých okrajov pozdĺž zhodnej cesty (nazýva sa aj "skupinový stupeň odkazu")

Príklad použitia oboch kontextov:

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

Vyhodnotenie okrajovej premennej e prebieha v dvoch kontextoch:

  • MATCH Vo vyhlásení: Dotaz nájde reťazce priateľov-z-priatelia-z-priatelia, kde každé priateľstvo bolo zriadené od roku 2000. Počas zhody vzorov sa predikát e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") okrajov vyhodnotí raz pre každý okraj kandidáta. V tomto kontexte e je naviazaná na referenčnú hodnotu s jedným okrajom.

  • V príkazeRETURN: Tu e sa viaže na zoznam (skupiny) referenčných hodnôt okrajov v poradí, v akom sa vyskytujú v zhodnom reťazci. Výsledkom e[0] je prvá referenčná hodnota okraja v každej zhodnej reťazci.

Premenné hran vzoru s premennou dĺžkou v horizontálnej agregácii:

Hranové premenné viazané porovnávaním vzorov s premenlivou dĺžkou sú skupinové zoznamy mimo vzoru s premennou dĺžkou, a preto môžu byť použité v horizontálnej agregácii.

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

Ďalšie informácie nájdete v téme Vodorovná agregácia.