Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
GQL (Graph Query Language) er det ISO-standardiserte spørringsspråket for grafdatabaser. Bruk GQL til å spørre, analysere og arbeide med grafdata effektivt med graf i Microsoft Fabric.
Den samme ISO-arbeidsgruppen som standardiserer SQL utvikler GQL. Som et resultat deler GQL mange konsepter med SQL, inkludert uttrykk, predikater og datatyper. Hvis du har SQL-erfaring, kan du bruke mye av denne kunnskapen på GQL.
Denne artikkelen er den komplette guiden til GQL i graf. Den forklarer hvordan språket henger sammen og lenker til fokuserte referanser for fullstendige syntaks- og typedetaljer. Den dekker:
- Kjernekonsepter: Diagramdatastrukturer, mønstre og grunnleggende spørringer
-
Essensielle utsagn:
MATCH,FILTER,LET, ,WHEN,ORDER BY,LIMIT, ogRETURN - Datatyper og uttrykk: Verdityper, operatorer og innebygde funksjoner
- Avanserte teknikker: Komposisjon med flere setninger, variabel omfang og aggregasjonsstrategier
Note
Den offisielle internasjonale standarden for GQL er ISO/IEC 39075 Information Technology - Database Languages - GQL.
Hvis du er ute etter oppgaveorientert veiledning i stedet for en språkgjennomgang, se veiledningene for hvordan du gjør det:
- Skriv vanlige GQL-spørringer – naboer, traversering med flere hopp, delte tilkoblinger og enhetseksistenskontroller
- Filtrer og aggreger grafdata – FILTER, WHERE, GROUP BY og mengdefunksjoner
- Skrive diagrammønsterspørringer – flerhoppmønstre, banemoduser, gjenbruk av variabel og VALGFRI SAMMENLIGNE
- Optimaliser GQL-spørringsytelse – filtreringsstrategi, traverseringsgrenser og viktige begrensningsanbefalinger
Bruk fokuserte referanseartikler når du trenger fullstendige detaljer:
| Nødvendig informasjon | Definitiv artikkel |
|---|---|
| Syntaks i et blikk | GQL hurtigreferanse |
| Node-, kant-, sti- og mønsterkomposisjonssyntaks | GQL-grafmønstre |
| Operatorer, predikater og funksjoner | GQL-uttrykk, predikater og funksjoner |
| Bokstavelig syntaks, verdiatferd og typekonverteringer | GQL-verdier og verdityper |
| Graftypedefinisjoner og begrensninger | GQL-graftyper |
| Nåværende ISO GQL-funksjonsdekning | GQL-standardkonformitet |
| Nåværende Fabric-spesifikke restriksjoner og grenser | Nåværende begrensninger |
Forutsetninger
Før du begynner, må du kontrollere at du er kjent med disse konseptene:
- Basic understanding of databases – Erfaring med alle databasesystem som relasjons (SQL), NoSQL eller graf er nyttig.
- Grafkonsepter – Forståelse av noder, kanter og relasjoner i tilkoblede data.
- Grunnleggende spørringer – Kunnskap om grunnleggende spørringskonsepter som filtrering, sortering og aggregasjon.
Anbefalt bakgrunn:
- Erfaring med SQL- eller openCypher-språk gjør det enklere å lære GQL-syntaks (de er GQLs røtter).
- Kjennskap til datamodellering hjelper med diagramskjemautforming.
- Forståelse av det spesifikke brukstilfellet for grafdata.
Det du trenger:
- Tilgang til et diagramarbeidsområde med spørringsfunksjoner.
- Eksempeldata eller vilje til å arbeide med eksempler på sosiale nettverk.
- Grunnleggende tekstredigeringsprogram for å skrive spørringer.
Tips
Hvis du ikke har brukt grafdatabaser før du fortsetter med denne veiledningen, begynner du med oversikten over grafdatamodeller .
Hva gjør GQL spesielt
GQL er spesielt designet for grafdata, så syntaksen uttrykker direkte hvordan entiteter er koblet sammen. Der SQL vanligvis uttrykker relasjoner gjennom joins mellom tabeller, bruker GQL grafmønstre som ligner diagrammer av dataene.
For eksempel finner følgende søk par av personer som kjenner hverandre og begge er født før 1999:
MATCH (person:Person)-[:knows]-(friend:Person)
WHERE person.birthday < 19990101
AND friend.birthday < 19990101
RETURN person.firstName || ' ' || person.lastName AS person_name,
friend.firstName || ' ' || friend.lastName AS friend_name
Mønsteret (person:Person)-[:knows]-(friend:Person) viser relasjonsstrukturen som matcher. Variabler binder de to personene slik at spørringen kan filtrere og returnere egenskapene deres.
GQL grunnleggende
Disse konseptene danner grunnlaget for GQL:
- Grafer inneholder noder og kanter med etiketter og egenskaper.
- Graftyper definerer formelt nodetyper, kanttyper og begrensninger som er tillatt i en graf.
-
Spørringer bruker setninger som
MATCH,FILTER, ogRETURNfor å behandle data og produsere resultater. - Mønstre beskriver grafstrukturene slik at de matcher.
- Uttrykk beregner, transformerer og sammenligner verdier.
- Predikater er boolske uttrykk som brukes til å teste betingelser.
- Verdityper definerer hvilke typer verdier spørringer kan behandle og grafegenskaper kan lagre.
Forstå grafdata
For å jobbe med GQL må du forstå den merkede egenskapsgrafstrukturen som språket spør om.
Noder og kanter: byggesteinene
En merket egenskapsgraf inneholder to typer grafelementer:
- Noder representerer vanligvis enheter, som personer, organisasjoner, innlegg eller produkter.
- Kanter representerer forbindelser mellom noder, for eksempel at en person kjenner en annen person eller jobber i et selskap.
Hvert grafelement har en intern identitet, én eller flere etiketter, og et sett med egenskaper. Etiketter klassifiserer elementer som Person eller knows. Egenskaper er navn-verdi-par, som firstName: 'Alice' eller birthday: 19730108u. I graf har en kant alltid nøyaktig én etikett.
Hver kant forbinder nøyaktig to noder: et opprinnelsespunkt og et mål. Kantretningen er en del av grafstrukturen. For eksempel kan en workAt kant koble et Person origo til et Company mål.
Note
Graph støtter for øyeblikket ikke å lage urettede kanter. Du kan spørre en eksisterende rettet kant i begge retninger ved å bruke et vilkårlig rettet kantmønster som -[:knows]-.
Grafer er veldannede: hver kant forbinder to noder som finnes i samme graf.
Grafmodeller og graftyper
En Fabric-grafmodell definerer nodetyper, kanttyper, egenskaper, kildekartlegginger og nøkler som er tilgjengelige i en graf. Den spesifiserer hvilke rader i kildetabellen som blir noder og kanter, og hvordan disse elementene kobles sammen. For veiledning om modellering, se Design et grafskjema.
GQL-standarden bruker en graftype for formelt å beskrive tillatte nodetyper, kanttyper, egenskaper og begrensninger. Graftyper er språknivåmotstykket til strukturen representert av en Fabric-grafmodell, men Graph aksepterer for øyeblikket ikke GQL-graftypeerklæringer direkte. For formell syntaks og konsepter, se GQL-graftyper.
Eksempelgraf brukt i denne guiden
Eksempler bruker eksempeldatasett for sosiale nettverk, som inkluderer personer, steder, organisasjoner, meldinger, tagger og kantene som knytter dem sammen.
Eksempelgrafen kobler sammen disse områdene:
- Folk kjenner andre, jobber i selskaper og studerer ved universiteter.
- Byer, land eller regioner, og kontinenter danner et geografisk hierarki.
- Forum inneholder innlegg, og folk lager innlegg og kommentarer.
- Tagger kategoriserer innhold og representerer folks interesser.
For den komplette eksempelstrukturen, se eksempelet på sosialt nettverksskjema. For generelle grafkonsepter, se Merkede egenskapsgrafer.
Dine første GQL-spørringer
Nå som du forstår grunnleggende grafer, kan vi se hvordan du spør etter grafdata ved hjelp av GQL. Disse eksemplene bygger fra enkelt til komplekst, og viser deg hvordan GQLs tilnærming gjør grafspørringer intuitive og kraftige.
Start enkelt: finn alle personer
Begynn med den mest grunnleggende spørringen som er mulig. Finn navnene (fornavn, etternavn) for alle personene (:Persone) i grafen.
MATCH (p:Person)
RETURN p.firstName, p.lastName
Denne spørringen kjører som følger:
-
MATCHfinner alle noder merketPerson. -
RETURNviser for- og etternavn.
Legg til filtrering: finn bestemte personer
Finn nå personer med spesifikke egenskaper. I dette tilfellet finner du alle som heter Alice og viser navn og fødselsdager.
MATCH (p:Person)
FILTER p.firstName = 'Alice'
RETURN p.firstName, p.lastName, p.birthday
Denne spørringen kjører som følger:
-
MATCHfinner alle noder (p) merket person. -
FILTERnoder (p) hvis fornavn er Alice. -
RETURNviser fornavnet, etternavnet og fødselsdagen.
Grunnleggende spørringsstruktur
Grunnleggende GQL-spørringer følger alle et konsekvent mønster: en sekvens av setninger som arbeider sammen for å finne, filtrere og returnere data.
De fleste spørringer starter med MATCH å finne mønstre i grafen og avsluttes med RETURN for å spesifisere resultatet.
Her er et enkelt søk som finner par av personer som kjenner hverandre og har samme bursdag, og deretter returnerer det totale antallet vennepar.
MATCH (n:Person)-[:knows]-(m:Person)
FILTER n.birthday = m.birthday
RETURN count(*) AS same_age_friends
Denne spørringen kjører som følger:
-
MATCHfinner alle parenePersonmed noder som kjenner hverandre. -
FILTERbeholder bare parene der begge har samme fødselsdag. -
RETURNteller hvor mange slike vennepar som finnes.
Tips
Du kan også filtrere direkte i et mønster ved å legge til en WHERE klausul. For eksempel MATCH (n:Person WHERE n.birthday < 19900101) matcher kun Person noder med en birthday verdi før 1990.
GQL støtter linjekommentarer i C-stil // , linjekommentarer i SQL-stil -- og blokkeringskommentarer i C-stil /* */ .
Vanlige utsagn
-
MATCH: Identifiserer grafmønsteret du skal søke etter—her definerer du strukturen til dataene du er interessert i. -
LET: Tildeler nye variabler eller beregnede verdier basert på matchede data—legger til avledede kolonner til resultatet. -
FOR: Utvider en liste til rader, med en valgfri nullbasert offset eller en-basert ordinal posisjon. -
CALL: Kjører en inline underspørring for hver inndata-rad og legger til kolonnene som returneres av underspørringen. -
FILTER: Snevrer inn resultatene ved å bruke betingelser—fjerner rader som ikke oppfyller kriteriene. -
ORDER BY: Sorterer de filtrerte dataene – hjelper til med å organisere utdataene basert på ett eller flere felt. -
OFFSETogLIMIT: Begrens antall rader som returneres—nyttig for paginering eller top-k spørringer. -
RETURN: Spesifiserer den endelige utdataen—definerer hvilke data som skal inkluderes i resultatsettet og utfører aggregering. -
NEXT: Starter et nytt spørringsstadium ved å bruke kolonnene returnert fra forrige fase.
Slik fungerer setninger sammen
GQL-setninger danner en pipeline, hvor hver setning behandler utdataene fra den forrige. Denne sekvensielle utførelsen gjør spørringer enkle å lese og feilsøke fordi utførelsesrekkefølgen samsvarer med leserekkefølgen.
Nøkkelpunkter:
- Setninger utføres effektivt sekvensielt.
- Hver setning transformerer data og sender dem videre til neste.
- Denne prosessen oppretter en klar, forutsigbar dataflyt som forenkler komplekse spørringer.
-
NEXTStarter en ny spørringsfase. Kun kolonner projisert av den foregåendeRETURNsetningen er tilgjengelige i neste fase. -
UNION,UNION DISTINCT, ogUNION ALLkombinerer resultatene av komplette spørringsblokker.
Note
Utsagn har en definert logisk rekkefølge. Skriv spørringer i henhold til denne dataflyten i stedet for å stole på en bestemt fysisk utførelsesstrategi.
Eksempel på setningssammensetning
Følgende GQL-søk finner de første 10 personene som jobber i selskaper med "Air" i navnet, sorterer dem etter fullt navn, og returnerer deres fulle navn sammen med navnet på selskapene sine.
-- Data flows: Match → Let → Filter → Order → Limit → Return
MATCH (p:Person)-[:workAt]->(c:Company) -- Input: unit table, Output: (p, c) table
LET fullName = p.firstName || ' ' || p.lastName -- Input: (p, c) table, Output: (p, c, fullName) table
FILTER c.name CONTAINS 'Air' -- Input: (p, c, fullName) table, Output: filtered table
ORDER BY fullName -- Input: filtered table, Output: sorted table
LIMIT 10 -- Input: sorted table, Output: top 10 rows table
RETURN fullName, c.name AS companyName -- Input: top 10 rows table
-- Output: projected (fullName, companyName) result table
Denne spørringen kjører som følger:
-
MATCHFinner folk som jobber i selskaper. -
LEToppretter fullstendige navn ved å kombinere fornavn og familienavn. -
FILTERbeholder kun ansatte i selskaper med "Air" i firmanavnet. -
ORDER BYsorterer etter fullt navn. -
LIMITtar de første 10 resultatene. -
RETURNreturnerer fulle navn og firmanavn.
Variabler kobler sammen dataene dine
Variabler, for eksempel p, cog fullName i de forrige eksemplene, overfører data mellom setninger. Når du bruker et variabelnavn på nytt, sikrer GQL automatisk at det refererer til de samme dataene, noe som skaper kraftige sammenføyningsbetingelser. Variabler kalles noen ganger også bindingsvariabler.
Du kan kategorisere variabler på forskjellige måter:
Ved bindingskilde:
- Mønstervariabler – bundet av samsvarende grafmønstre
- Vanlige variabler – bundet av andre språkkonstruksjoner
Mønstervariabeltyper:
-
Elementvariabler – binde til referanseverdier for grafelement
- Nodevariabler – binde til individuelle noder
- Edge-variabler – binde til individuelle kanter
- Banevariabler – binde til baneverdier som representerer samsvarende baner
Etter referansegrad:
- Singleton-variabler – binde til individuelle elementreferanseverdier fra mønstre
- Gruppevariabler – bind til lister med elementreferanseverdier fra mønstre med variabel lengde. For detaljer, se Aggregerte funksjoner.
Resultater og resultater for kjøring
Når du kjører en spørring, får du tilbake et utførelsesresultat som består av:
-
Et resultat, vanligvis en resultattabell med dataene fra uttalelsen din
RETURN. - Statusinformasjon som viser om spørringen var vellykket eller ikke.
Resultattabeller
Resultattabellen – hvis den finnes – er det faktiske resultatet av kjøring av spørring.
En resultattabell inneholder informasjon om navnet og typen til kolonnene, en foretrukket kolonnenavnsekvens som skal brukes til å vise resultater, om tabellen er bestilt og selve radene.
Note
Hvis kjøring mislykkes, inkluderes ingen resultattabell i utførelsesresultatet.
Utelatte resultater
GQL definerer også et utelatt resultat for setninger som aldri produserer rader, uavhengig av dataene eller evalueringsresultatet. Et utelatt resultat har statuskode 00001for vellykket fullføring .
Et utelatt resultat skiller seg fra en tom resultattabell. En tom tabell betyr at en radproduserende spørring ble evaluert, men ikke produserte noen rader. Query API kan representere et utelatt resultat med resultattype NOTHING.
Grafreserver utelatte resultater for fremtidig støtte for datadefinisjonsspråk (DDL) og datamanipulasjonsspråk (DML) setningsstøtte. Nåværende spørringssetninger gir tabellresultater, inkludert tomme tabeller.
Statusinformasjon
Under kjøring av spørring oppdager prosessen ulike bemerkelsesverdige betingelser, for eksempel feil eller advarsler. Hver betingelse registreres av et statusobjekt i statusinformasjonen for utførelsesresultatet.
Statusinformasjonen består av et primærstatusobjekt og en (muligens tom) liste over andre statusobjekter. Det primære statusobjektet finnes alltid, og angir om spørringskjøringen var vellykket eller mislykket.
Hvert statusobjekt inkluderer en femtegns alfanumerisk kode og en beskrivelse av den registrerte tilstanden.
Query API bruker følgende primære statuskoder:
| API-statuskode | Betydning |
|---|---|
00000 |
Vellykket fullføring med minst én rad. |
00001 |
Vellykket fullføring med utelatt resultat. Reservert for fremtidig DDL- og DML-støtte. |
01000 |
En advarsel eller informasjonsbetingelse. |
02000 |
Ingen rader er for øyeblikket tilgjengelige fra en radproduserende spørring. |
42000 |
En brukerkorrigerbar spørringsfeil. |
50000 |
En system- eller uklassifisert feil. |
API-et bevarer den kanoniske GQL-statusen rapportert av spørringsmotoren i _graphaneGqlStatus medlemmet av diagnoseposten. For eksempel bruker numerisk overløp kanonisk GQLSTATUS 22003, mens divisjon med null bruker 22012; begge representeres av 42000 i det offentlige status.code feltet.
Viktig!
I applikasjonskode, bruk status.code for bred suksess og feilhåndtering. Bruk den kanoniske GQLSTATUS-diagnosen når du trenger å skille en spesifikk forespørselsbetingelse. Ikke test beskrivelsesteksten fordi den kan variere.
I tillegg kan statusobjekter inneholde et underliggende årsaksstatusobjekt og en diagnosepost med ytterligere informasjon som karakteriserer den registrerte betingelsen.
Viktige konsepter og setninger
Denne delen dekker kjernebyggeblokkene du trenger for å skrive effektive GQL-spørringer. Hvert konsept bygger mot praktiske ferdigheter for spørringsskriving.
Grafmønstre: finn struktur
Et grafmønster beskriver nodene, kantene og stiene som skal matches. Bind variabler når senere utsagn må referere til matchede elementer:
MATCH (person:Person)-[employment:workAt]->(company:Company)
RETURN person.firstName, company.name, employment.workFrom
Plasser et predikat i linje når det definerer hvilken node eller kant som kan delta i mønsteret:
MATCH (person:Person WHERE person.firstName = 'Alice')
-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName
Gjenbruk en variabel for å kreve to mønsterposisjoner for å binde det samme elementet.
Separer mønstre med kommaer for å lage større grafstrukturer. Bruk en kvantifikator for {1,4} eksempel for å gjenta et kantmønster og matche baner med variabel lengde.
Stimoduser kontrollerer gjenbruk av elementer innenfor en sti:
| Banemodus | Virkemåte |
|---|---|
WALK |
Tillater gjentatte noder og kanter. Denne modusen er standard. |
TRAIL |
Forhindrer gjentatte kanter. |
SIMPLE |
Forhindrer gjentatte noder bortsett fra en delt første og siste node. |
ACYCLIC |
Forhindrer alle gjentatte noder. |
Et stisøkeprefiks styrer hvilke matchende stier som returneres.
ALL er standarden.
ANY SHORTEST returnerer én korteste vei for hvert kilde-destinasjonspar:
MATCH path = ANY SHORTEST
(source:Person WHERE source.id = 123u)-[:knows]->{1,4}(target:Person)
RETURN target.id, path_length(path) AS hopCount
Inline-predikater begrenser sti-egnethet før stivalg.
Setningsnivå- MATCH ... WHERE og senere FILTER operasjoner er postfiltre.
Dette skillet kan endre ANY SHORTEST resultatene.
For definitiv semantikk for node-, kant-, bane-, sammensetnings-, kvantifikator- og predikatplasserings-, se GQL-grafmønstre. For gjeldende stibegrensninger, se Nåværende begrensninger.
Kjernesetninger
GQL inneholder bestemte setningstyper som arbeider sammen for å behandle grafdataene trinn for trinn. Det er viktig å forstå disse setningene for å bygge effektive spørringer.
MATCH uttalelse
Syntaks:
MATCH <graph pattern>, <graph pattern>, ... [ WHERE <predicate> ]
Setningen MATCH tar inndata og finner grafmønstre. Den slår sammen inndatavariabler med mønstervariabler og utdata som alle samsvarer med kombinasjoner.
Inndata- og utdatavariabler:
-- Input: unit table (no columns, one row)
-- Pattern variables: p, c
-- Output: table with (p, c) columns for each person-company match
MATCH (p:Person)-[:workAt]->(c:Company)
Filtrering på setningsnivå ved hjelp av WHERE:
-- Filter pattern matches
MATCH (p:Person)-[:workAt]->(c:Company) WHERE p.lastName = c.name
Du kan filtrere alle treff etter filtrering ved hjelp WHEREav . Denne fremgangsmåten unngår en egen FILTER setning. Med et sti-søk-prefiks som ANY SHORTEST, gjelder setningsnivået WHERE etter valg av sti. Inline-predikater begrenser i stedet hvilke stier som er kvalifisert for valg. For mer informasjon, se Plasser-predikater før eller etter valg av sti.
Sammenføyning ved hjelp av inndatavariabler:
Når MATCH det ikke er den første setningen, kobles inndata sammen med mønstersamsvar:
...
-- Input: table with 'targetCompany' column
-- Implicit join: targetCompany (equality join)
-- Output: table with (targetCompany, p, r) columns
MATCH (p:Person)-[r:workAt]->(targetCompany)
Viktig!
Graf støtter grunnleggende og full lineær setningskomposisjon, inkludert NEXT. Du kan også kombinere spørringsblokker med UNION, UNION DISTINCT, og UNION ALL. , EXCEPTINTERSECT, og OTHERWISE set-operasjonene støttes ennå ikke. Hvis du vil ha mer informasjon, kan du se artikkelen om gjeldende begrensninger.
Virkemåter for nøkkelkobling:
Slik MATCH håndterer du datakobling:
- Variabel likhet: Inndatavariabler kobles sammen med mønstervariabler ved hjelp av likhetssamsvar
-
Indre sammenføyning: Inndatarader uten mønstersamsvar forkastes. Brukes
OPTIONAL MATCHtil venstre-ytre sammenføyningsvirkemåte. -
Filtreringsrekkefølge: Setningsnivå-filtre
WHEREetter mønstergjenkjenning og stivalg fullført - Mønsterkomposisjon: Delte variabler begrenser mønstre til samme element. Usammenhengende mønstre danner et kartesisk produkt.
Viktig!
Et frakoblet mønster er gyldig, men dets kartesiske produkt kan lage mange rader. Bruk delte variabler når mønstrene skal referere til de samme grafelementene.
Koble sammen mønstre med delte variabler:
-- Shared variable 'p' joins the two patterns
-- Output: people with both workplace and residence data
MATCH (p:Person)-[:workAt]->(c:Company),
(p)-[:isLocatedIn]->(city:City)
OPTIONAL MATCH uttalelse
Syntaks:
OPTIONAL MATCH <graph pattern> [ WHERE <predicate> ]
OPTIONAL MATCH fungerer som MATCH , men bruker venstre-ytre-bli semantikk. Hvis mønsteret ikke finner noen treff for en inndatarad, beholder spørringen raden med NULL verdier for uovertruffen variabler i stedet for å forkaste den.
Eksempel:
-- Find all people and, if available, their workplace
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company_name
Personer som ikke jobber i noen bedrift, vises fremdele i resultatene med NULL for company_name.
Tips
Bruk OPTIONAL MATCH når du vil inkludere enheter som kanskje ikke har en bestemt relasjon, på samme måte som en SQL LEFT JOIN.
LET uttalelse
Syntaks:
LET <variable> = <expression>, <variable> = <expression>, ...
Setningen LET oppretter beregnede variabler og muliggjør datatransformasjon i spørringssamlebåndet.
Grunnleggende oppretting av variabel:
MATCH (p:Person)
LET fullName = p.firstName || ' ' || p.lastName
RETURN *
LIMIT 1000
Komplekse beregninger:
MATCH (p:Person)
LET adjustedAge = 2000 - (p.birthday / 10000),
fullProfile = p.firstName || ' ' || p.lastName || ' (' || p.gender || ')'
RETURN *
LIMIT 1000
Viktige virkemåter:
- Spørringsmotoren evaluerer uttrykk for hver inndatarad.
- Resultatene blir nye kolonner i utdatatabellen.
- Variabler kan bare referere til eksisterende variabler fra tidligere setninger.
- Flere tildelinger i én
LETsetning bruker samme inndataomfang, så en tildeling kan ikke referere til en annen tildeling fra den setningen.
FOR uttalelse
Syntaks:
FOR <variable> IN <list_expression>
[ WITH OFFSET <offset_variable> | WITH ORDINALITY <ordinality_variable> ]
Uttalelsen FOR utvider en liste til rader. For hver inputrad sender den ut én outputrad for hvert listeelement og binder dette elementet til den spesifiserte variabelen. Andre variabler fra inngangsraden forblir tilgjengelige.
Bruk WITH OFFSET for å binde en nullbasert indeks, eller bruk WITH ORDINALITY for å binde en en-basert posisjon.
LET cities = ['Seattle', 'London', 'Tokyo']
FOR city IN cities WITH ORDINALITY position
RETURN city, position
Denne spørringen returnerer én rad for hver by. Verdiene position er 1, 2, og 3. Hvis du erstatter WITH ORDINALITY position med WITH OFFSET position, er 0verdiene , 1, og 2.
Kildeuttrykket må evalueres til en liste. En ikke-listeverdi får spørringen til å feile.
CALL uttalelse
Bruk CALL til å kjøre en inline underspørring for hver inndatarad:
CALL {
<query statements>
RETURN <columns>
}
Variabler som allerede er innenfor omfanget er implisitt tilgjengelige inne i delspørringen. Av variablene som opprettes inne i underspørringen, er det kun kolonner fra dens endelige RETURN setning som blir tilgjengelige utenfor den. Variabler opprettet i underspørringen, men ikke returnert, forblir lokale.
Følgende korrelerte delspørsel beregner arbeidsgiverantallet for hver person:
MATCH (p:Person)
CALL {
MATCH (p)-[:workAt]->(company:Company)
RETURN count(*) AS employerCount
}
RETURN p.firstName, p.lastName, employerCount
ORDER BY employerCount DESC
En vanlig CALL oppfører seg som en avhengig indre join. Den produserer én utdatarad for hver rad som returneres av delspørringen. Hvis delspørringen ikke returnerer noen rader, returneres ikke den tilsvarende ytre raden. Hvis den returnerer flere rader, vises den ytre raden én gang for hver underspørringsrad.
Det foregående count(*) eksempelet returnerer alltid én underspørringsrad fordi det bruker en ugruppert aggregering. En person uten matchende arbeidsgiver har derfor en employerCount av 0.
Bruk OPTIONAL CALL som en avhengig venstre-join. Når delspørringen returnerer ingen rader, bevarer den én ytre rad og setter de returnerte underspørringskolonnene til NULL. Når underspørringen returnerer flere rader, produserer den én utdatarad for hver underspørringsrad.
MATCH (p:Person)
OPTIONAL CALL {
MATCH (p)-[:workAt]->(company:Company)
RETURN company.name AS companyName
}
RETURN p.firstName, p.lastName, companyName
Du kan legge inn inline-underforespørsler CALL . En nestret underspørring kan referere til variabler fra sine omsluttende spørringsomfang.
Viktig!
Avslutt hver inline-kropp CALL med RETURN. Graph støtter ikke navngitte prosedyrekall eller eksplisitte variabelimportlister som CALL (p) { ... }.
FILTER uttalelse
Syntaks:
FILTER [ WHERE ] <predicate>
Erklæringen FILTER gir nøyaktig kontroll over hvilke data som går gjennom spørringssamlebåndet.
Grunnleggende filtrering:
MATCH (p:Person)
FILTER p.birthday < 19980101 AND p.gender = 'female'
RETURN *
Komplekse logiske betingelser:
MATCH (p:Person)
FILTER (p.gender = 'male' AND p.birthday < 19940101)
OR (p.gender = 'female' AND p.birthday < 19990101)
OR p.browserUsed = 'Edge'
RETURN *
Nullavhengige filtreringsmønstre:
Bruk disse mønstrene til å håndtere nullverdier på en trygg måte:
-
Se etter verdier:
p.firstName IS NOT NULL- har et fornavn -
Valider data:
p.id > 0– gyldig ID -
Håndtere manglende data:
NOT coalesce(p.locationIP, '10.x.x.x') STARTS WITH '10.x.x.x'– ble ikke koblet til fra lokalt nettverk -
Kombiner betingelser: Bruk
AND/ORmed eksplisitte nullkontroller for kompleks logikk
Forsiktig!
Husk at betingelser som involverer nullverdier returnerer UNKNOWN, som filtrerer ut disse radene. Bruk eksplisitte IS NULL kontroller når du trenger null-inkluderende logikk.
ORDER BY uttalelse
Syntaks:
ORDER BY <expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ],
<expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ], ...
Sortering på flere nivåer med beregnede uttrykk:
MATCH (p:Person)
RETURN *
ORDER BY p.firstName DESC, -- Primary: by first name (Z-A)
p.birthday ASC, -- Secondary: by age (oldest first)
p.id DESC -- Tertiary: by ID (highest first)
Nullhåndtering i sortering:
MATCH (p:Person)
RETURN p.firstName, p.birthday
ORDER BY p.birthday DESC NULLS LAST, p.firstName ASC
Detaljer for sorteringsvirkemåte:
Forstå hvordan ORDER BY fungerer:
- Spørringsmotoren evaluerer uttrykk for hver rad, og resultatene bestemmer radrekkefølgen.
- Flere sorteringstaster oppretter hierarkisk rekkefølge (primær, sekundær, tertiær og så videre).
-
NULLS FIRSTplasserer nullverdier før ikke-nullverdier.NULLS LASTplasserer dem etter ikke-nullverdier. - Nullplassering er uavhengig av sorteringsretning. Hvis du ikke spesifiserer nullorden,
NULLS LASTer standard for bådeASCogDESC. -
ASC(stigende) er standardrekkefølgen, og du må eksplisitt angiDESC(synkende). - Du kan sortere etter beregnede verdier, ikke bare lagrede egenskaper.
| Sorteringsspesifikasjon | Resulterende rekkefølge |
|---|---|
ASC Eller ASC NULLS LAST |
Ikke-nullverdier i stigende rekkefølge, etterfulgt av nullverdier. |
ASC NULLS FIRST |
Nullverdier, etterfulgt av ikke-nullverdier i stigende rekkefølge. |
DESC Eller DESC NULLS LAST |
Ikke-nullverdier i synkende rekkefølge, etterfulgt av nullverdier. |
DESC NULLS FIRST |
Nullverdier, etterfulgt av ikke-nullverdier i synkende rekkefølge. |
Forsiktig!
Bare den umiddelbart følgende setningen kan se sorteringsrekkefølgen som ORDER BY etableres.
Derfor, ORDER BY etterfulgt av RETURN * , gir ikke et bestilt resultat.
Sammenligne:
MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
ORDER BY r.creationDate DESC
/* intermediary result _IS_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
/* final result _IS_ _NOT_ guaranteed to be ordered here */
med:
MATCH (a:Person)-[r:knows]->(b:Person)
LET aName = a.firstName || ' ' || a.lastName
LET bName = b.firstName || ' ' || b.lastName
/* intermediary result _IS_ _NOT_ guaranteed to be ordered here */
RETURN aName, bName, r.creationDate AS since
ORDER BY r.creationDate DESC
/* final result _IS_ guaranteed to be ordered here */
Denne forskjellen har umiddelbare konsekvenser for «Top-k»-spørringer: LIMIT må alltid følge setningen ORDER BY som etablerer den tiltenkte sorteringsrekkefølgen.
OFFSET og LIMIT setninger
Syntaks:
OFFSET <offset> [ LIMIT <limit> ]
| LIMIT <limit>
Vanlige mønstre:
-- Basic top-N query
MATCH (p:Person)
RETURN *
ORDER BY p.id DESC
LIMIT 10 -- Top 10 by ID
Viktig!
Bruk alltid ORDER BY før OFFSET og LIMIT for å sikre konsekvent radrekkefølge på tvers av spørringer for forutsigbare pagineringsresultater.
RETURN: grunnleggende resultatprojeksjon
Syntaks:
RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
[ ORDER BY <expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]
Setningen RETURN produserer spørringens endelige utdata ved å angi hvilke data som vises i resultattabellen.
Grunnleggende utdata:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name,
p.birthday,
c.name
Bruke aliaser for klarhet:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS first_name,
p.lastName AS last_name,
c.name AS company_name
Kombiner med sortering og topp-k:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name,
p.birthday AS birth_year,
c.name AS company
ORDER BY birth_year ASC
LIMIT 10
Dupliser håndtering ved hjelp av DISTINCT:
-- Remove duplicate combinations
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN DISTINCT p.gender, p.browserUsed, p.birthday AS birth_year
ORDER BY p.gender, p.browserUsed, birth_year
Kombiner med aggregasjon:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT p) AS employee_count
RETURN med GROUP BY: gruppert resultatprojeksjon
Syntaks:
RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
GROUP BY <variable>, <variable>, ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]
Brukes GROUP BY til å gruppere rader etter delte verdier og beregne mengdefunksjoner i hver gruppe.
Grunnleggende gruppering med aggregasjon:
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId,
companyName,
count(*) AS employeeCount,
avg(p.birthday) AS avg_birth_year
GROUP BY companyId, companyName
ORDER BY employeeCount DESC
Gruppering med flere kolonner:
MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
browser,
count(*) AS person_count,
avg(p.birthday) AS avg_birth_year,
min(p.creationDate) AS first_joined,
max(p.id) AS highest_id
GROUP BY gender, browser
ORDER BY avg_birth_year DESC
LIMIT 10
Note
For horisontal aggregering over mønstre med variabel lengde, se Aggregerte funksjoner.
Verdier og verdityper
GQL-verdier inkluderer boolske, streng-, numerisk-, temporal-, liste-, node-, kant-, sti-, null- og ingenting-verdier. Typer kan nulles med mindre du spesifiserer NOT NULL.
Eiendommer bruker et støttet delsett av det fullstendige spørringsverdisystemet.
RETURN 42 AS integerValue,
'Alice' AS stringValue,
TRUE AS booleanValue,
[1, 2, 3] AS listValue
Sammenligninger med null evaluerer til UNKNOWN; bruk IS NULL og IS NOT NULL for nulltester. Numeriske operasjoner kan anvende implisitte konverteringer mellom kompatible numeriske typer.
Note
Ikke alle GQL-verdityper støttes i alle grafkontekster. For nåværende egenskaps- og spørringsbegrensninger, se Datatyper.
For bokstavelig syntaks, sammenligningsatferd, typekonverteringer og typehierarkiet, se GQL-verdier og verdityper.
Uttrykk
Uttrykk beregner, sammenligner, aggregerer og transformerer verdier. Vanlige former inkluderer egenskapsreferanser, aritmetiske og logiske operatorer, predikater, funksjonskall, enkle CASE uttrykk og delforespørsler:
MATCH (person:Person)
FILTER person.birthday < 19900101
RETURN person.firstName,
CASE person.gender
WHEN 'female' THEN 'F'
WHEN 'male' THEN 'M'
ELSE 'Other'
END AS genderCode
GQL bruker treverdilogikk: Booleske uttrykk kan evaluere til TRUE, FALSE, eller UNKNOWN. A FILTER beholder kun rader hvor predikatet TRUEer .
Aggreger funksjoner som COUNT, SUM, AVG, , MINog MAX oppsummerer rader. Liste predikater som ALL, ANY, , NONEog SINGLE evaluere et predikat for listeelementer. Prosedyreform-underspørringer EXISTS tester om en nestelt spørring returnerer en rad.
For fullstendig operator-, predikat-, aggregat- og funksjonsatferd, se GQL-uttrykk, predikater og funksjoner. For eksempler på oppgaveorientert filtrering og gruppering, se Filter og aggregere grafdata.
Avanserte spørringsteknikker
Denne delen dekker avanserte mønstre og teknikker for å bygge komplekse, effektive grafspørringer. Disse mønstrene går utover grunnleggende uttrykksbruk for å hjelpe deg med å skrive kraftige analytiske spørringer.
Kompleks sammensetning med flere setninger
Viktig!
Graph støtter grunnleggende og fullstendig lineær setningssammensetning. , EXCEPTINTERSECT, og OTHERWISE set-operasjonene støttes ennå ikke. Hvis du vil ha mer informasjon, kan du se artikkelen om gjeldende begrensninger.
Å forstå hvordan du oppretter komplekse spørringer effektivt er avgjørende for avansert grafspørring.
UNION Og UNION ALL
Bruk UNION, UNION DISTINCT, eller UNION ALL for å kombinere resultater fra to eller flere lineære spørringsblokker:
<query block>
UNION [ DISTINCT | ALL ]
<query block>
-- Combine results from two separate pattern matches
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS name, c.name AS affiliation
UNION DISTINCT
MATCH (p:Person)-[:studyAt]->(u:University)
RETURN p.firstName AS name, u.name AS affiliation
Bare UNION tilsvarer UNION DISTINCT; begge fjerner dupliserte rader.
UNION ALL beholder alle rader, inkludert duplikater.
Hver spørringsblokk må returnere det samme settet med kolonnenavn. Kolonnerekkefølgen kan variere mellom blokker, og datatypene må være kompatible.
NEXT
Bruk NEXT til å kjøre et nytt spørringstrinn mot tabellen som returneres av forrige trinn:
<query stage>
RETURN <columns>
NEXT
<query stage>
Følgende spørring finner ansatte og deres selskaper, og bruker deretter de returnerte ansattnodene i et annet mønstermatch:
MATCH (person:Person)-[:workAt]->(company:Company)
RETURN person, company.name AS companyName
NEXT
MATCH (person)-[:isLocatedIn]->(city:City)
RETURN person.firstName AS employee, companyName, city.name AS city
Kun kolonner returnert av det foregående stadiet er i omfanget etter NEXT. Du kan bruke flere NEXT separatorer for å bygge en lengre sekvens av spørringstrinn.
Begge trinn kan inneholde en union av spørringsblokker. En union evalueres innenfor sitt trinn før trinnets utgang krysser grensen NEXT . Hvis A, B, og C representerer spørringsblokker, grupperes A UNION B NEXT C som (A UNION B) NEXT C, mens A NEXT B UNION C grupper som A NEXT (B UNION C).
Betingelsessetninger
Bruk en betinget setning for å rute hver innkommende rad til den første grenen hvis predikat evaluerer til TRUE:
WHEN <predicate> THEN <linear query statement or { query statements }>
[ WHEN <predicate> THEN <linear query statement or { query statements }> ... ]
[ ELSE <linear query statement or { query statements }> ]
For å rute rader fra et foregående spørringsstadium, returner de nødvendige kolonnene og bruk NEXT før den betingede setningen:
MATCH (p:Person)
RETURN p.firstName AS name, p.birthday AS birthday
NEXT
WHEN birthday < 19800101u THEN
RETURN name, 'Before 1980' AS era
WHEN birthday < 20000101u THEN
RETURN name, '1980-1999' AS era
ELSE
RETURN name, '2000 or later' AS era
Hvert WHEN predikat må være boolsk. Spørringsmotoren evaluerer predikatene i rekkefølge for hver inndatarad. Et predikat som evaluerer til FALSE eller UNKNOWN ikke velger sin gren. Etter at et predikat evaluerer til TRUE, vurderes ikke senere predikater og uvalgte greinlegemer. Hvis ingen predikat evaluerer til TRUE og det ikke finnes noe ELSE, returneres ikke inndataraden.
Predikater og grenlegemer kan referere til kolonner fra det foregående stadiet. En gren kan være én lineær setning, eller en nestet prosedyre innelukket i klammer. Bruk en nestet prosedyre når en gren trenger flere trinn eller setninger som CALL:
MATCH (p:Person)
RETURN p, p.firstName AS name
NEXT
WHEN p.gender = 'female' THEN {
CALL {
MATCH (p)-[:knows]->(friend:Person)
RETURN count(*) AS friendCount
}
RETURN name, friendCount
}
ELSE
RETURN name, 0u AS friendCount
Hver gren har sitt eget lokale omfang. Søskengrener ser ikke variabler opprettet av en annen gren, og kun kolonner fra den valgte grenens endelige RETURN fortsettelse etter den betingede setningen. Hver gren må returnere de samme kolonnenavnene, og tilsvarende resultattyper må være kompatible. Spørringsmotoren tvinger kompatible typer til en felles utdatatype. En returnert grenkolonne kan bruke samme navn som en innkommende kolonne; grenverdien erstatter den innkommende verdien i den betingede utdataen.
Betingede setninger er forskjellige fra CASE uttrykk. Graph støtter enkle CASE <expression> WHEN <value>, men ikke søkte CASE WHEN <predicate> uttrykk. For mer informasjon, se Betingede uttrykk.
Variabel omfang og avansert flytkontroll
Variabler kobler sammen data på tvers av spørringssetninger og aktiverer komplekse graf-traverseringer. Ved å forstå avanserte omfangsregler kan du skrive avanserte spørringer med flere setninger.
Variable bindings- og omfangsmønstre
-- Variables flow forward through subsequent statements
MATCH (p:Person) -- Bind p
LET fullName = p.firstName || ' ' || p.lastName -- Bind concatenation of p.firstName and p.lastName as fullName
FILTER fullName CONTAINS 'Smith' -- Filter for fullNames with “Smith” substring (p is still bound)
RETURN p.id, fullName -- Only return p.id and fullName (p is dropped from scope)
Variabel gjenbruk for sammenføyninger på tvers av setninger
-- Multi-statement joins using variable reuse
MATCH (p:Person)-[:workAt]->(:Company) -- Find people with jobs
MATCH (p)-[:isLocatedIn]->(:City) -- Same p: people with both job and residence
MATCH (p)-[:knows]->(friend:Person) -- Same p: their social connections
RETURN *
Kritiske omfangsregler og begrensninger
-- ✅ Backward references work
MATCH (p:Person)
LET adult = p.birthday < 20061231 -- Can reference p from previous statement
RETURN *
-- ❌ Forward references don't work
LET adult = p.birthday < 20061231 -- Error: p not yet defined
MATCH (p:Person)
RETURN *
-- ❌ Variables in same LET statement can't reference each other
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName,
greeting = 'Hello, ' || name -- Error: name not visible yet
RETURN *
-- ✅ Use separate statements for dependent variables
MATCH (p:Person)
LET name = p.firstName || ' ' || p.lastName
LET greeting = 'Hello, ' || name -- Works: name now available
RETURN *
Variabel synlighet i komplekse spørringer
-- Variables remain visible until overridden or query ends
MATCH (p:Person) -- p available from here
LET gender = p.gender -- gender available from here
MATCH (p)-[:knows]->(e:Person) -- p still refers to original person
-- e is a new variable for the friend
RETURN p.firstName AS manager, e.firstName AS friend, gender
Forsiktig!
Variabler i samme setning kan ikke referere til hverandre, bortsett fra i grafmønstre. Bruk separate setninger for oppretting av avhengig variabel.
Aggregerte rader og sti-elementer
GQL støtter to aggregeringskontekster:
-
Vertikal aggregering oppsummerer inngangsrader, eventuelt delt opp etter
GROUP BYvariabler. - Horisontal aggregering oppsummerer en gruppeliste avgrenset av et kantmønster med variabel lengde innenfor én matchet sti.
MATCH (person:Person)-[:workAt]->(company:Company)
LET companyId = company.id, companyName = company.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
MATCH (:Person)-[connections:knows]->{1,4}(:Person)
RETURN count(connections) AS pathLength
For grupperte spørringer, aggregatspesifikke filtre, samlingsaggregater og betinget ruting, se Filter og aggregert grafdata. For fullstendige aggregerte resultatregler, se Aggregerte funksjoner.
Håndter nullpunkter og spørringsfeil
Bruk eksplisitte nulltester når manglende verdier trenger særskilt håndtering:
MATCH (person:Person)
FILTER person.browserUsed IS NULL
RETURN person.firstName
En sammenligning med null evaluerer til UNKNOWN, som a FILTER ikke beholder.
Bruk coalesce() når du trenger en reserveverdi.
Spørringsresultater inkluderer statusinformasjon for suksess, advarsler, datafrie tilstander, brukerkorrigerbare feil og systemfeil. Bruk den offentlige statuskoden for bred kontrollflyt og den kanoniske GQLSTATUS-diagnostikken for en spesifikk tilstand. Se Execution outcomes and results og GQL-statuskodereferansen.
Reserverte ord
GQL forbeholder seg bestemte nøkkelord som du ikke kan bruke som identifikatorer som variabler, egenskapsnavn eller etikettnavn. Se referansen for reserverte ord for GQL for den fullstendige listen.
Hvis du trenger å bruke reserverte ord som identifikatorer, kan du unnslippe dem med backticks: `match`, `return`.
Hvis du vil unngå å fjerne reserverte ord, kan du bruke denne navnekonvensjonen:
- For enkeltordidentifikatorer tilføyer du et understrekingstegn:
:Product_ - Bruk camelCase eller PascalCase for flerordsidentifikatorer:
:MyEntity, ,:hasAttributetextColor
Neste trinn
- Følg quickstart- eller GQL-veiledningen for en praktisk introduksjon.
- Bruk Write vanlige GQL-spørringer for klar-til-å tilpasse grafoppgaver.
- Bruk GQL-grafmønstre, GQL-uttrykk, predikater og funksjoner, samt GQL-verdier og verdityper for detaljert referanse.
- Bruk Design et grafskjema for den støttede Fabric-modelleringsarbeidsflyten.