Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
GQL (Graph Query Language) är det ISO-standardiserade frågespråket för grafdatabaser. Använd GQL för att fråga, analysera och arbeta effektivt med grafdata med graf i Microsoft Fabric.
Samma ISO-arbetsgrupp som standardiserar SQL utvecklar GQL. Därför delar GQL många begrepp med SQL, inklusive uttryck, predikat och datatyper. Om du har SQL-erfarenhet kan du använda mycket av den kunskapen på GQL.
Den här artikeln är den kompletta guiden till GQL i graf. Den förklarar hur språket hänger ihop och länkar till fokuserade referenser för fullständiga syntax- och typografidetaljer. Den omfattar:
- Grundläggande begrepp: Diagramdatastrukturer, mönster och frågegrunder
-
Väsentliga påståenden:
MATCH,FILTER,LET, ,ORDER BYWHEN,LIMIT, ochRETURN - Datatyper och uttryck: Värdetyper, operatorer och inbyggda funktioner
- Avancerade tekniker: Komposition för flera instruktioner, variabelomfång och aggregeringsstrategier
Anmärkning
Den officiella internationella standarden för GQL är ISO/IEC 39075 Information Technology – Databasspråk – GQL.
Om du söker uppgiftsinriktad vägledning istället för en språklig genomgång, se instruktionsguiderna:
- Skriva vanliga GQL-frågor – grannar, bläddrering med flera hopp, delade anslutningar och entitetskontroller
- Filtrera och aggregera grafdata – FUNKTIONERNA FILTER, WHERE, GROUP BY och aggregate
- Skriv diagrammönsterfrågor – mönster för flera hopp, sökvägslägen, återanvändning av variabler och VALFRI MATCHNING
- Optimera GQL-frågeprestanda – filtreringsstrategi, bläddringsgränser och rekommendationer för viktiga begränsningar
Använd de fokuserade referensartiklarna när du behöver fullständig information:
| Information behövs | Definitiv artikel |
|---|---|
| En snabbsyntax | Snabbreferens för GQL |
| Syntax för nod, kant, väg och mönsterkomposition | GQL-grafmönster |
| Operatorer, predikat och funktioner | GQL-uttryck, predikat och funktioner |
| Bokstavlig syntax, värdebeteende och typkonverteringar | GQL-värden och värdetyper |
| Graftypdefinitioner och begränsningar | GQL-graftyper |
| Nuvarande ISO GQL-funktionstäckning | GQL-standardkonformans |
| Nuvarande Fabric-specifika begränsningar och begränsningar | Aktuella begränsningar |
Förutsättningar
Kontrollera att du är bekant med de här begreppen innan du börjar:
- Basic understanding of databases – Erfarenhet av alla databassystem som relationssystem (SQL), NoSQL eller diagram är till hjälp.
- Diagrambegrepp – Förstå noder, kanter och relationer i anslutna data.
- Frågegrunder – Kunskap om grundläggande frågebegrepp som filtrering, sortering och aggregering.
Rekommenderad bakgrund:
- Erfarenhet av SQL- eller openCypher-språk gör det enklare att lära sig GQL-syntax (de är GQL:s rötter).
- Kunskaper om datamodellering hjälper till med diagramschemadesign.
- Förstå ditt specifika användningsfall för grafdata.
Vad du behöver:
- Åtkomst till en grafarbetsyta med frågefunktioner.
- Exempel på data eller vilja att arbeta med våra sociala nätverksexempel.
- Grundläggande textredigerare för att skriva frågor.
Tips/Råd
Om du inte har använt grafdatabaser tidigare börjar du med översikten över diagramdatamodeller innan du fortsätter med den här guiden.
Vad gör GQL speciellt
GQL är specifikt utformad för grafdata, så dess syntax uttrycker direkt hur entiteter är sammankopplade. Där SQL vanligtvis uttrycker relationer genom joins mellan tabeller använder GQL grafmönster som liknar diagram över datan.
Till exempel hittar följande sökning par av personer som känner varandra och båda är födda före 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önstret (person:Person)-[:knows]-(friend:Person) visar relationsstrukturen som matchar. Variabler binder de två personerna så att frågan kan filtrera och returnera deras egenskaper.
Grunderna i GQL
Dessa begrepp utgör grunden för GQL:
- Grafer innehåller noder och kanter med etiketter och egenskaper.
- Graftyper definierar formellt nodtyper, kanttyper och begränsningar som tillåts i en graf.
-
Frågor använder satser som
MATCH,FILTER, ochRETURNför att bearbeta data och producera resultat. - Mönster beskriver grafstrukturerna för att matcha.
- Uttryck beräknar, transformerar och jämför värden.
- Predikat är booleska uttryck som används för att testa villkor.
- Värdetyper definierar vilka typer av värden som frågor kan bearbeta och grafegenskaper kan lagra.
Förstå grafdata
För att arbeta med GQL behöver du förstå den märkta egenskapsgrafstrukturen som språket frågar i.
Noder och kanter: byggstenarna
En märkt egenskapsgraf innehåller två typer av grafelement:
- Noder representerar vanligtvis enheter, såsom personer, organisationer, inlägg eller produkter.
- Kanter representerar kopplingar mellan noder, såsom att en person känner en annan person eller arbetar på ett företag.
Varje grafelement har en intern identitet, en eller flera etiketter och en uppsättning egenskaper. Etiketter klassificerar element, såsom Person eller knows. Egenskaper är namn-värde-par, såsom firstName: 'Alice' eller birthday: 19730108u. I Graph har en kant alltid exakt en etikett.
Varje kant kopplar exakt två noder: ett ursprung och ett mål. Kantriktning är en del av grafens struktur. Till exempel kan en workAt kant koppla ett Person ursprung till ett Company mål.
Anmärkning
Graph stöder för närvarande inte att skapa oriktade kanter. Du kan fråga en befintlig riktad kant i båda riktningarna genom att använda ett valfritt riktat kantmönster såsom -[:knows]-.
Grafer är välformade: varje kant förbinder två noder som finns i samma graf.
Diagrammodeller och graftyper
En Fabric-grafmodell definierar nodtyper, kanttyper, egenskaper, källmappningar och nycklar som finns tillgängliga i en graf. Den specificerar vilka källtabellsrader som blir noder och kanter och hur dessa element hänger ihop. För vägledning om modellering, se Design ett grafschema.
GQL-standarden använder en graftyp för att formellt beskriva tillåtna nodtyper, kanttyper, egenskaper och begränsningar. Graftyper är språknivåns motsvarighet till strukturen som representeras av en Fabric-grafmodell, men Graph accepterar för närvarande inte GQL-graftypdeklarationer direkt. För formell syntax och begrepp, se GQL-graftyper.
Exempelgraf som används i denna guide
Exempel använder exempeldataset från sociala nätverk, som inkluderar personer, platser, organisationer, meddelanden, taggar och de kanter som kopplar ihop dem.
Exempelgrafen kopplar samman dessa områden:
- Folk känner andra, jobbar på företag och studerar på universitet.
- Städer, länder eller regioner och kontinenter bildar en geografisk hierarki.
- Forum innehåller inlägg, och folk skapar inlägg och kommentarer.
- Taggar kategoriserar innehåll och representerar människors intressen.
För den kompletta exempelstrukturen, se exemplet med sociala nätverksscheman. För allmänna grafbegrepp, se Märkta egenskapsgrafer.
Dina första GQL-frågor
Nu när du förstår grunderna i grafer ska vi se hur du frågar efter grafdata med hjälp av GQL. De här exemplen bygger från enkelt till komplext och visar hur GQL:s metod gör graffrågor intuitiva och kraftfulla.
Börja enkelt: hitta alla personer
Börja med den mest grundläggande frågan som möjligt. Leta reda på namnen (förnamn, efternamn) för alla personer:Person i diagrammet.
MATCH (p:Person)
RETURN p.firstName, p.lastName
Den här frågan körs på följande sätt:
-
MATCHhittar alla noder med etikettenPerson. -
RETURNvisar deras för- och efternamn.
Lägg till filtrering: hitta specifika personer
Hitta nu personer med specifika egenskaper. I det här fallet hittar du alla som heter Alice och visar sina namn och födelsedagar.
MATCH (p:Person)
FILTER p.firstName = 'Alice'
RETURN p.firstName, p.lastName, p.birthday
Den här frågan körs på följande sätt:
-
MATCHhittar alla noder (p) märkta Person. -
FILTERnoder (p) vars förnamn är Alice. -
RETURNvisar deras förnamn, efternamn och födelsedag.
Grundläggande frågestruktur
Grundläggande GQL-frågor följer alla ett konsekvent mönster: en sekvens med instruktioner som fungerar tillsammans för att hitta, filtrera och returnera data.
De flesta frågor börjar med MATCH för att hitta mönster i grafen och slutar med RETURN för att specificera utdatan.
Här är en enkel sökning som hittar par av personer som känner varandra och delar samma födelsedag, och sedan returnerar det totala antalet vänpar.
MATCH (n:Person)-[:knows]-(m:Person)
FILTER n.birthday = m.birthday
RETURN count(*) AS same_age_friends
Den här frågan körs på följande sätt:
-
MATCHhittar alla par medPersonnoder som känner varandra. -
FILTERbehåller bara de par där båda personerna har samma födelsedag. -
RETURNräknar hur många sådana vänpar som finns.
Tips/Råd
Du kan också filtrera direkt i ett mönster genom att lägga till en WHERE klausul. Till exempel MATCH (n:Person WHERE n.birthday < 19900101) matchar endast Person noder med ett birthday värde före 1990.
GQL har stöd för linjekommentarer i C-stil // , linjekommentarer i SQL-format -- och blockkommentarer i C-format /* */ .
Vanliga uttalanden
-
MATCH: Identifierar grafmönstret att söka efter—det är här du definierar strukturen för den data du är intresserad av. -
LET: Tilldelar nya variabler eller beräknade värden baserat på matchad data—lägger till härledda kolumner till resultatet. -
FOR: Expanderar en lista till rader, med en valfri nollbaserad offset eller enbaserad ordinal position. -
CALL: Kör en inline-underfråga för varje inmatningsrad och lägger till kolumnerna som returneras av delfrågan. -
FILTER: Minskar resultaten genom att tillämpa villkor—tar bort rader som inte uppfyller kriterierna. -
ORDER BY: Sorterar den filtrerade datan—hjälper till att organisera utdata baserat på ett eller flera fält. -
OFFSETochLIMIT: Begränsa antalet rader som returneras—användbart för paginering eller top-k-frågor. -
RETURN: Specificerar slutresultatet—definierar vilken data som ska ingå i resultatuppsättningen och utför aggregering. -
NEXT: Startar ett nytt frågesteg genom att använda kolumnerna som returnerades från föregående steg.
Så här fungerar instruktioner tillsammans
GQL-satser bildar en pipeline där varje sats bearbetar utdata från den föregående. Denna sekventiella exekvering gör frågor lätta att läsa och felsöka eftersom exekveringsordningen matchar läsordningen.
Viktiga punkter:
- Satser exekveras effektivt sekventiellt.
- Varje sats transformerar data och skickar den vidare till nästa.
- Den här processen skapar ett tydligt och förutsägbart dataflöde som förenklar komplexa frågor.
-
NEXTStarter en ny frågefas. Endast kolumner som projiceras av föregåendeRETURNuttalande är tillgängliga i nästa steg. -
UNION,UNION DISTINCT, ochUNION ALLkombinerar resultaten av kompletta frågeblock.
Anmärkning
Satser har en definierad logisk ordning. Skriv frågor enligt detta dataflöde istället för att förlita dig på en särskild fysisk exekveringsstrategi.
Exempel på instruktionssammansättning
Följande GQL-sökning hittar de första 10 personerna som arbetar på företag med "Air" i namnet, sorterar dem efter fullständigt namn och returnerar deras fullständiga namn tillsammans med företagets namn.
-- 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
Den här frågan körs på följande sätt:
-
MATCHHittar personer som jobbar på företag. -
LETskapar fullständiga namn genom att kombinera för- och efternamn. -
FILTERbehåller endast anställda i företag med "Air" i företagets namn. -
ORDER BYsorterar efter fullständigt namn. -
LIMITtar de första 10 resultaten. -
RETURNreturnerar fullständiga namn och företagsnamn.
Variabler ansluter dina data
Variabler, till exempel p, coch fullName i föregående exempel, innehåller data mellan uttryck. När du återanvänder ett variabelnamn ser GQL automatiskt till att det refererar till samma data, vilket skapar kraftfulla kopplingsvillkor. Variabler kallas ibland även för bindningsvariabler.
Du kan kategorisera variabler på olika sätt:
Efter bindningskälla:
- Mönstervariabler – bundna av matchande grafmönster
- Vanliga variabler – bundna av andra språkkonstruktioner
Mönstervariabeltyper:
-
Elementvariabler – binda till referensvärden för grafelement
- Nodvariabler – binda till enskilda noder
- Kantvariabler – binda till enskilda kanter
- Sökvägsvariabler – binda till sökvägsvärden som representerar matchade sökvägar
Efter referensexamen:
- Singleton-variabler – binda till enskilda elementreferensvärden från mönster
- Gruppvariabler – bind till listor med elementreferensvärden från mönster med variabel längd. För detaljer, se Aggregerade funktioner.
Körningsresultat och resultat
När du kör en fråga får du tillbaka ett körningsresultat som består av:
-
Ett resultat, normalt en resultattabell med data från ditt
RETURNuttalande. - Statusinformation som visar om frågan lyckades eller inte.
Resultattabeller
Resultattabellen – om den finns – är det faktiska resultatet av frågekörningen.
En resultattabell innehåller information om namnet och typen av dess kolumner, en önskad kolumnnamnssekvens som ska användas för att visa resultat, om tabellen är ordnad och själva de faktiska raderna.
Anmärkning
Om körningen misslyckas ingår ingen resultattabell i körningsresultatet.
Utelämnade resultat
GQL definierar också ett utelämnat resultat för satser som aldrig producerar rader, oberoende av data eller utvärderingsresultat. Ett utelämnat resultat har statuskod 00001för lyckad komplettering .
Ett utelämnat resultat skiljer sig från en tom resultattabell. En tom tabell innebär att en radproducerande fråga utvärderades men inte producerade några rader. Query API kan representera ett utelämnat resultat med resultattypen NOTHING.
Grafreserver utelämnade resultat för framtida data definition language (DDL) och data manipulation language (DML) statement-stöd. Aktuella frågesatser ger tabellresultat, inklusive tomma tabeller.
Statusinformation
Under frågekörningen identifierar processen olika anmärkningsvärda villkor, till exempel fel eller varningar. Varje villkor registreras av ett statusobjekt i statusinformationen för körningsresultatet.
Statusinformationen består av ett primärt statusobjekt och en (eventuellt tom) lista över andra statusobjekt. Det primära statusobjektet finns alltid och anger om frågekörningen lyckades eller misslyckades.
Varje statusobjekt innehåller en femteckens alfanumerisk kod och en beskrivning av det registrerade tillståndet.
Query API använder följande primära statuskoder:
| API-statuskod | Meaning |
|---|---|
00000 |
Lyckad slutförande med minst en rad. |
00001 |
Lyckad slutförande med utelämnat resultat. Reserverat för framtida DDL- och DML-stöd. |
01000 |
En varning eller informationsvillkor. |
02000 |
Inga rader är för närvarande tillgängliga från en radproducerande fråga. |
42000 |
Ett användarkorrigerbart fel. |
50000 |
Ett system- eller icke-klassificerat fel. |
API:et bevarar den kanoniska GQLSTATUS som rapporteras av frågemotorn i _graphaneGqlStatus medlemmen i diagnosposten. Till exempel använder numeriskt överflöd kanonisk GQLSTATUS 22003, medan division med noll använder 22012; båda representeras av 42000 i det publika status.code fältet.
Viktigt!
I applikationskod, använd status.code för bred framgång och felhantering. Använd den kanoniska GQLSTATUS-diagnostiken när du behöver särskilja ett specifikt frågevillkor. Testa inte beskrivningstexten eftersom den kan variera.
Dessutom kan statusobjekt innehålla ett underliggande orsaksstatusobjekt och en diagnostikpost med ytterligare information som kännetecknar det registrerade villkoret.
Viktiga begrepp och instruktioner
Det här avsnittet beskriver de grundläggande byggstenar som du behöver för att skriva effektiva GQL-frågor. Varje koncept bygger på praktiska frågeskrivningsfärdigheter.
Grafmönster: hitta struktur
Ett grafmönster beskriver noder, kanter och vägar som ska matchas. Bind variabler när senare satser behöver referera till matchade element:
MATCH (person:Person)-[employment:workAt]->(company:Company)
RETURN person.firstName, company.name, employment.workFrom
Placera ett predikat i linje när det definierar vilken nod eller kant som kan delta i mönstret:
MATCH (person:Person WHERE person.firstName = 'Alice')
-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName
Återanvänd en variabel för att kräva två mönsterpositioner för att binda samma element.
Separera mönster med kommatecken för att skapa större grafstrukturer. Använd en kvantifierare som {1,4} för att upprepa ett kantmönster och matcha banor med variabel längd.
Väglägen styr återanvändning av element inom en väg:
| Sökvägsläge | Behavior |
|---|---|
WALK |
Tillåter upprepade noder och kanter. Det här läget är standard. |
TRAIL |
Förhindrar upprepade kanter. |
SIMPLE |
Förhindrar upprepade noder utom en gemensam första och sista nod. |
ACYCLIC |
Förhindrar alla upprepade noder. |
Ett sökvägsprefix styr vilka matchande vägar som returneras.
ALL används som standard.
ANY SHORTEST returnerar en kortaste väg för varje käll-destinationspar:
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 begränsar vägens behörighet innan vägval.
Operationer på satsnivå MATCH ... WHERE och senare FILTER är postfilter.
Denna skillnad kan förändra ANY SHORTEST resultat.
För definitiv semantik för nod, kant, väg, sammansättning, kvantifikator och predikatplacering, se GQL-grafmönster. För nuvarande vägbegränsningar, se Nuvarande begränsningar.
Kärninstruktioner
GQL innehåller specifika instruktionstyper som fungerar tillsammans för att bearbeta grafdata steg för steg. Det är viktigt att förstå dessa instruktioner för att skapa effektiva frågor.
MATCH uttalande
Syntax:
MATCH <graph pattern>, <graph pattern>, ... [ WHERE <predicate> ]
-instruktionen MATCH tar indata och hittar diagrammönster. Den kopplar indatavariabler med mönstervariabler och utdata som alla matchade kombinationer.
Indata- och 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å instruktionsnivå med hjälp av WHERE:
-- Filter pattern matches
MATCH (p:Person)-[:workAt]->(c:Company) WHERE p.lastName = c.name
Du kan efterfiltrera alla matchningar med hjälp WHEREav . Den här metoden undviker en separat FILTER instruktion. Med ett sökvägsprefix som ANY SHORTEST, gäller satsnivån WHERE efter valet av väg. Inline-predikat begränsar istället vilka vägar som är valbara. För mer information, se Place-predikaten före eller efter val av väg.
Koppla med hjälp av indatavariabler:
När MATCH är inte den första instruktionen kopplas indata till mönstermatchningar:
...
-- Input: table with 'targetCompany' column
-- Implicit join: targetCompany (equality join)
-- Output: table with (targetCompany, p, r) columns
MATCH (p:Person)-[r:workAt]->(targetCompany)
Viktigt!
Graf stöder grundläggande och fullständig linjär satskomposition, inklusive NEXT. Du kan också kombinera frågeblock med UNION, UNION DISTINCT, och UNION ALL. , EXCEPTINTERSECT, och OTHERWISE mängdoperationerna stöds ännu inte. Mer information finns i artikeln om aktuella begränsningar.
Nyckelanslutningsbeteenden:
Så MATCH här hanterar du dataanslutning:
- Variabeljämlikhet: Indatavariabler kopplas till mönstervariabler med hjälp av likhetsmatchning
-
Inre koppling: Indatarader utan mönstermatchningar ignoreras. Används
OPTIONAL MATCHför vänster-yttre kopplingsbeteende. -
Filtreringsordning: Filter på satsnivå
WHEREefter mönstermatchning och vägval klart - Mönstersammansättning: Delade variabler begränsar mönster till samma element. Osammanhängande mönster bildar en kartesisk produkt.
Viktigt!
Ett osammanhängande mönster är giltigt, men dess kartesiska produkt kan skapa många rader. Använd delade variabler när mönstren ska hänvisa till samma grafelement.
Joina mönster med delade 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 uttalande
Syntax:
OPTIONAL MATCH <graph pattern> [ WHERE <predicate> ]
OPTIONAL MATCH fungerar som MATCH men använder vänster-yttre kopplingssemantik. Om mönstret inte hittar någon matchning för en indatarad behåller frågan raden med NULL värden för omatchade variabler i stället för att ta bort den.
Example:
-- 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 inte arbetar på något företag visas fortfarande i resultatet med NULL för company_name.
Tips/Råd
Använd OPTIONAL MATCH när du vill inkludera entiteter som kanske inte har en viss relation, som liknar en SQL LEFT JOIN.
LET uttalande
Syntax:
LET <variable> = <expression>, <variable> = <expression>, ...
-instruktionen LET skapar beräknade variabler och aktiverar datatransformering i din frågepipeline.
Grundläggande variabelskapande:
MATCH (p:Person)
LET fullName = p.firstName || ' ' || p.lastName
RETURN *
LIMIT 1000
Komplexa beräkningar:
MATCH (p:Person)
LET adjustedAge = 2000 - (p.birthday / 10000),
fullProfile = p.firstName || ' ' || p.lastName || ' (' || p.gender || ')'
RETURN *
LIMIT 1000
Viktiga beteenden:
- Frågemotorn utvärderar uttryck för varje indatarad.
- Resultatet blir nya kolumner i utdatatabellen.
- Variabler kan bara referera till befintliga variabler från tidigare instruktioner.
- Flera tilldelningar i ett och samma
LETsats använder samma inmatningsomfång, så en tilldelning kan inte referera till en annan tilldelning från det uttalandet.
FOR uttalande
Syntax:
FOR <variable> IN <list_expression>
[ WITH OFFSET <offset_variable> | WITH ORDINALITY <ordinality_variable> ]
Satsen FOR expanderar en lista till rader. För varje indatarad skickar den en utdatarad för varje listelement och binder det elementet till den angivna variabeln. Andra variabler från inmatningsraden finns kvar.
Använd WITH OFFSET för att binda ett nollbaserat index, eller använd WITH ORDINALITY för att binda en enbaserad position.
LET cities = ['Seattle', 'London', 'Tokyo']
FOR city IN cities WITH ORDINALITY position
RETURN city, position
Denna fråga returnerar en rad för varje stad. Värdena position är 1, 2, och 3. Om du ersätter WITH ORDINALITY position med WITH OFFSET position, är 0värdena , 1, och 2.
Källuttrycket måste utvärderas till en lista. Ett icke-listvärde gör att frågan misslyckas.
CALL uttalande
Använd CALL för att köra en inline-delfråga för varje inmatad rad:
CALL {
<query statements>
RETURN <columns>
}
Variabler som redan är inom räckvidd är implicit tillgängliga inom delfrågan. Av de variabler som skapas i delfrågan blir endast kolumner från dess slutformulering RETURN tillgängliga utanför den. Variabler som skapas i underförfrågan men inte returneras förblir lokala.
Följande korrelerade delfråga beräknar en arbetsgivarantal för varje 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 fungerar som en beroende inre förening. Den producerar en utdatarad för varje rad som returneras av delfrågan. Om delförfrågan inte returnerar några rader returneras inte motsvarande yttre rad. Om den returnerar flera rader visas den yttre raden en gång för varje delfrågerad.
Föregående count(*) exempel returnerar alltid en delfrågerad eftersom det använder en ogrupperad aggregerad. En person utan matchande arbetsgivare har därför en employerCount av 0.
Använd OPTIONAL CALL som en beroende vänsterförening. När delfrågan inte returnerar några rader bevarar den en yttre rad och sätter de returnerade delfrågekolumnerna till NULL. När delfrågan returnerar flera rader producerar den en utdatarad för varje underfrågerad.
MATCH (p:Person)
OPTIONAL CALL {
MATCH (p)-[:workAt]->(company:Company)
RETURN company.name AS companyName
}
RETURN p.firstName, p.lastName, companyName
Du kan nesta inline-subfrågor CALL . En nästlad delfråga kan referera till variabler från sina omslutande frågeomfång.
Viktigt!
Avsluta varje inline-kropp CALL med RETURN. Graph stöder inte namngivna proceduranrop eller explicita variabelimportlistor såsom CALL (p) { ... }.
FILTER uttalande
Syntax:
FILTER [ WHERE ] <predicate>
-instruktionen FILTER ger exakt kontroll över vilka data som fortsätter via din frågepipeline.
Grundläggande filtrering:
MATCH (p:Person)
FILTER p.birthday < 19980101 AND p.gender = 'female'
RETURN *
Komplexa logiska villkor:
MATCH (p:Person)
FILTER (p.gender = 'male' AND p.birthday < 19940101)
OR (p.gender = 'female' AND p.birthday < 19990101)
OR p.browserUsed = 'Edge'
RETURN *
Null-medvetna filtreringsmönster:
Använd dessa mönster för att hantera null-värden på ett säkert sätt:
-
Sök efter värden:
p.firstName IS NOT NULL– har ett förnamn -
Verifiera data:
p.id > 0– giltigt ID -
Hantera saknade data:
NOT coalesce(p.locationIP, '10.x.x.x') STARTS WITH '10.x.x.x'– ansluter inte från det lokala nätverket -
Kombinera villkor: Använd
AND/ORmed explicita null-kontroller för komplex logik
Försiktighet
Kom ihåg att villkor som omfattar null-värden returnerar UNKNOWN, vilket filtrerar bort dessa rader. Använd explicita IS NULL kontroller när du behöver null-inkluderande logik.
ORDER BY uttalande
Syntax:
ORDER BY <expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ],
<expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ], ...
Sortering på flera nivåer med beräknade uttryck:
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)
Null-hantering i sortering:
MATCH (p:Person)
RETURN p.firstName, p.birthday
ORDER BY p.birthday DESC NULLS LAST, p.firstName ASC
Information om sorteringsbeteende:
Förstå hur ORDER BY fungerar:
- Frågemotorn utvärderar uttryck för varje rad och sedan fastställer resultaten radordningen.
- Flera sorteringsnycklar skapar hierarkisk ordning (primär, sekundär, tertiär och så vidare).
-
NULLS FIRSTplacerar nollvärden före icke-nullvärden.NULLS LASTplacerar dem efter icke-nullvärden. - Nullplacering är oberoende av sorteringsriktning. Om du inte specificerar nullordning
NULLS LASTär standarden för bådeASCochDESC. -
ASC(stigande) är standardordningen och du måste uttryckligen angeDESC(fallande). - Du kan sortera efter beräknade värden, inte bara lagrade egenskaper.
| Sorteringsspecifikation | Resulterande ordning |
|---|---|
ASC eller ASC NULLS LAST |
Icke-nollvärden i stigande ordning, följt av nollvärden. |
ASC NULLS FIRST |
Nollvärden, följt av icke-nullvärden i stigande ordning. |
DESC eller DESC NULLS LAST |
Icke-nollvärden i fallande ordning, följt av nollvärden. |
DESC NULLS FIRST |
Nollvärden, följt av icke-nullvärden i fallande ordning. |
Försiktighet
Endast följande instruktion omedelbart kan se den sorteringsordning som ORDER BY upprättas.
ORDER BY Följt av RETURN * ger därför inte ett ordnat resultat.
Jämföra:
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 */
Den här skillnaden får omedelbara konsekvenser för "Top-k"-frågor: LIMIT måste alltid följa instruktionen ORDER BY som upprättar den avsedda sorteringsordningen.
OFFSET- och LIMIT-satser
Syntax:
OFFSET <offset> [ LIMIT <limit> ]
| LIMIT <limit>
Vanliga mönster:
-- Basic top-N query
MATCH (p:Person)
RETURN *
ORDER BY p.id DESC
LIMIT 10 -- Top 10 by ID
Viktigt!
För förutsägbara sidnumreringsresultat använder ORDER BY du alltid före OFFSET och LIMIT för att säkerställa konsekvent radordning mellan frågor.
RETURN: grundläggande resultatprojektion
Syntax:
RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
[ ORDER BY <expression> [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]
Instruktionen RETURN genererar frågans slutliga utdata genom att ange vilka data som visas i resultattabellen.
Grundläggande utdata:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName || ' ' || p.lastName AS name,
p.birthday,
c.name
Använda alias för tydlighetens skull:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName AS first_name,
p.lastName AS last_name,
c.name AS company_name
Kombinera med sortering och 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
Duplicerad hantering med HJÄLP 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
Kombinera med sammansättning:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT p) AS employee_count
RETURN med GROUP BY: grupperad resultatprojektion
Syntax:
RETURN [ DISTINCT ] <expression> [ AS <alias> ], <expression> [ AS <alias> ], ...
GROUP BY <variable>, <variable>, ...
[ ORDER BY <expression> [ ASC | DESC ], <expression> [ ASC | DESC ], ... ]
[ OFFSET <offset> ]
[ LIMIT <limit> ]
Använd GROUP BY för att gruppera rader efter delade värden och beräkningsaggregeringsfunktioner i varje grupp.
Grundläggande gruppering med sammansättning:
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 flera kolumner:
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
Anmärkning
För horisontell aggregering över mönster med variabel längd, se Aggregerade funktioner.
Värden och värdetyper
GQL-värden inkluderar booleska, sträng-, numeriska, temporal-, list-, nod-, kant-, väg-, null- och nothing-värden. Typer kan nullifieras om du inte specificerar NOT NULL.
Egenskaper använder en stödd delmängd av hela frågevärdessystemet.
RETURN 42 AS integerValue,
'Alice' AS stringValue,
TRUE AS booleanValue,
[1, 2, 3] AS listValue
Jämförelser med null utvärderar till UNKNOWN; använd IS NULL och IS NOT NULL för nolltester. Numeriska operationer kan tillämpa implicita omvandlingar mellan kompatibla numeriska typer.
Anmärkning
Inte alla GQL-värdetyper stöds i varje grafkontext. För aktuella egenskaps- och frågebegränsningar, se Datatyper.
För literal syntax, jämförelsebeteende, typkonverteringar och typhierarkin, se GQL-värden och värdetyper.
Expressions
Uttryck beräknar, jämför, aggregör och transformerar värden. Vanliga former inkluderar egenskapsreferenser, aritmetiska och logiska operatorer, predikat, funktionsanrop, enkla CASE uttryck och delfrågor:
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 använder trevärd logik: Booleska uttryck kan utvärdera till TRUE, FALSE, eller UNKNOWN. A FILTER behåller endast rader för vilka dess predikat är TRUE.
Aggregera funktioner såsom COUNT, SUM, AVG, , MINoch MAX sammanfatta rader. Listpredikat såsom ALL, ANY, , NONEoch SINGLE utvärdera ett predikat för listelement. Procedurformsunderfrågor EXISTS testar om en nästlad fråga returnerar en rad.
För fullständig operator-, predikat-, agregations- och funktionsbeteende, se GQL-uttryck, predikat och funktioner. För exempel på uppgiftsorienterad filtrering och gruppering, se Filter och aggregera grafdata.
Avancerade frågetekniker
Det här avsnittet beskriver avancerade mönster och tekniker för att skapa komplexa, effektiva graffrågor. Dessa mönster går utöver grundläggande instruktionsanvändning för att hjälpa dig att skapa kraftfulla analysfrågor.
Komplex sammansättning för flera delstater
Viktigt!
Graph stöder grundläggande och fullständig linjär instruktionssammansättning. , EXCEPTINTERSECT, och OTHERWISE mängdoperationerna stöds ännu inte. Mer information finns i artikeln om aktuella begränsningar.
Det är viktigt att förstå hur du skapar komplexa frågor effektivt för avancerade graffrågor.
UNION och UNION ALL
Använd UNION, UNION DISTINCT, eller UNION ALL för att kombinera resultat från två eller flera linjära frågeblock:
<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 är ekvivalent med UNION DISTINCT; båda tar bort dubbletter rader.
UNION ALL behåller alla rader, inklusive dubbletter.
Varje frågeblock måste returnera samma uppsättning kolumnnamn. Kolumnordningen kan skilja sig mellan block, och datatyperna måste vara kompatibla.
NEXT
Använd NEXT för att köra ett annat frågesteg mot tabellen som returneras av föregående steg:
<query stage>
RETURN <columns>
NEXT
<query stage>
Följande fråga hittar anställda och deras företag, och använder sedan de returnerade medarbetarnoderna i en annan mönstermatchning:
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
Endast kolumner som returneras av föregående steg är i omfattning efter NEXT. Du kan använda flera NEXT separatorer för att bygga en längre sekvens av frågesteg.
Båda stegen kan innehålla en union av frågeblock. En union utvärderas inom sitt steg innan stegets utdata passerar gränsen NEXT . Om , , och C representerar frågeblock, grupperas A UNION B NEXT C som (A UNION B) NEXT C, medan A NEXT B UNION C grupper som A NEXT (B UNION C). BA
Villkorsstyrda instruktioner
Använd en villkorlig sats för att routa varje inkommande rad till den första grenen vars predikat utvärderar till 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 }> ]
För att routa rader från ett föregående frågesteg, returnera de nödvändiga kolumnerna och använd NEXT före den villkorliga satsen:
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
Varje WHEN predikat måste vara booleskt. Frågemotorn utvärderar predikaten i ordning för varje inmatad rad. Ett predikat som utvärderar till FALSE eller UNKNOWN inte väljer sin gren. Efter att ett predikat utvärderar till TRUE, utvärderas inte senare predikat och ovalda grenkroppar. Om inget predikat utvärderar till TRUE och det inte finns något ELSE, returneras inte indataraden.
Predikat och grenkroppar kan referera till kolumner från föregående steg. En gren kan vara ett linjärt uttalande eller en nästlad procedur innesluten i klammer. Använd en nästlad procedur när en gren behöver flera steg eller satser så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
Varje avdelning har sitt eget lokala område. Syskongrenar ser inte variabler skapade av en annan gren, utan endast kolumner från den valda grenens slutliga RETURN fortsättning efter villkorssatsen. Varje gren måste returnera samma kolumnnamn, och motsvarande resultattyper måste vara kompatibla. Frågemotorn tvingar kompatibla typer till en gemensam utdatatyp. En returnerad grenkolumn kan använda samma namn som en inkommande kolumn; grenvärdet ersätter det inkommande värdet i den villkorliga utdatan.
Villkorliga satser skiljer sig från CASE uttryck. Graph stöder enkla CASE <expression> WHEN <value>, men inte sökta CASE WHEN <predicate> uttryck. För mer information, se Villkorsuttryck.
Variabelomfång och avancerad flödeskontroll
Variabler ansluter data mellan frågeinstruktioner och aktiverar komplexa diagramblädderingar. Genom att förstå regler för avancerat omfång kan du skriva avancerade frågor med flera instruktioner.
Mönster för variabelbindning och omfång
-- 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 återanvändning för kopplingar mellan uttryck
-- 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 *
Viktiga omfångsregler och begränsningar
-- ✅ 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 komplexa frågor
-- 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
Försiktighet
Variabler i samma instruktion kan inte referera till varandra, förutom i grafmönster. Använd separata instruktioner för att skapa beroende variabler.
Aggregerade rader och vägelement
GQL stöder två aggregeringskontexter:
-
Vertikal aggregering sammanfattar indatarader, valfritt uppdelade efter
GROUP BYvariabler. - Horisontell aggregering sammanfattar en grupplista begränsad av ett kantmönster med variabel längd inom en matchad väg.
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
För grupperade frågor, aggregatespecifika filter, samlingsaggregeringar och villkorlig routing, se Filter och aggregerad grafdata. För fullständiga regler för aggregerade resultat, se Aggregerade funktioner.
Hantera nollpunkter och frågefel
Använd explicita nolltester när saknade värden behöver olika hantering:
MATCH (person:Person)
FILTER person.browserUsed IS NULL
RETURN person.firstName
En jämförelse med null utvärderar till UNKNOWN, vilket a FILTER inte behåller.
Använd coalesce() när du behöver ett reservvärde.
Frågeresultat inkluderar statusinformation för framgång, varningar, datafria tillstånd, användarkorrigerbara fel och systemfel. Använd den publika statuskoden för bred kontrollflöde och den kanoniska GQLSTATUS-diagnostiken för ett specifikt tillstånd. Se Execution outcomes and results samt GQL-statuskodsreferensen.
Reserverade ord
GQL reserverar vissa nyckelord som du inte kan använda som identifierare som variabler, egenskapsnamn eller etikettnamn. Se referensen för reserverade GQL-ord för den fullständiga listan.
Om du behöver använda reserverade ord som identifierare kan du undvika dem med backticks: `match`, `return`.
Använd den här namngivningskonventionen för att undvika reserverade ord:
- För enordsidentifierare lägger du till ett understreck:
:Product_ - För identifierare med flera ord använder du camelCase eller PascalCase:
:MyEntity,:hasAttribute,textColor
Nästa steg
- Följ snabbstart - eller GQL-handledningen för en praktisk introduktion.
- Använd Write common GQL-frågor för färdiganpassade grafuppgifter.
- Använd GQL-grafmönster, GQL-uttryck, predikat och funktioner, samt GQL-värden och värdetyper för detaljerad referens.
- Använd Design ett grafschema för det stödda Fabric-modelleringsarbetsflödet.