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.
Important
Letar du efter en databaslösning för storskaliga scenarier med ett serviceavtal på 99,999% tillgänglighetsnivå (SLA), snabb autoskalning och automatisk redundans i flera regioner? Överväg Azure Cosmos DB för NoSQL.
Vill du implementera ett OLAP-diagram (Online Analytical Processing) eller migrera ett befintligt Apache Gremlin-program? Överväg Graph i Microsoft Fabric.
Azure Cosmos DB stöder Apache Tinkerpops diagramblädderingsspråk, som kallas Gremlin. Du kan använda Gremlin-språket för att skapa diagramentiteter (brytpunkter och kanter), ändra egenskaper inom de entiteterna, utföra frågor och bläddringar samt ta bort entiteter.
Azure Cosmos DB Graph-motorn följer noga Apache TinkerPop bläddrande stegspecifikation, men det finns skillnader i implementeringen som är specifika för Azure Cosmos DB. I den här artikeln ger vi en snabb genomgång av Gremlin och räknar upp De Gremlin-funktioner som stöds av API:et för Gremlin.
Kompatibla klientbibliotek
I följande tabell visas populära Gremlin-drivrutiner som du kan använda mot Azure Cosmos DB:
| Download | Source | Getting Started | Version av anslutningsprogram som stöds/rekommenderas |
|---|---|---|---|
| .NET | Gremlin.NET på GitHub | Skapa graf med .NET | 3.4.13 |
| Java | Gremlin JavaDoc | Skapa graf med Java | 3.4.13 |
| Python | Gremlin-Python på GitHub | Skapa graf med Python | 3.4.13 |
| Gremlin-konsol | TinkerPop-dokumentation | Skapa diagram med Gremlin-konsolen | 3.4.13 |
| Node.js | Gremlin-JavaScript på GitHub | Skapa diagram med Node.js | 3.4.13 |
| PHP | Gremlin-PHP på GitHub | Skapa diagram med PHP | 3.1.0 |
| Go Lang | Go Lang | Det här biblioteket skapas av externa deltagare. Azure Cosmos DB-teamet erbjuder inte någon support eller underhåll av biblioteket. |
Anmärkning
Gremlin-klientdrivrutinsversioner för 3.5.*, 3.6.* har kända kompatibilitetsproblem, så vi rekommenderar att du använder de senaste 3.4.* drivrutinsversionerna som stöds ovan. Den här tabellen uppdateras när kompatibilitetsproblem har åtgärdats för dessa nyare drivrutinsversioner.
Diagramobjekt som stöds
TinkerPop är en standard som omfattar en mängd olika diagramtekniker. Därför har den standardterminologi som beskriver vilka funktioner som tillhandahålls av en diagramprovider. Azure Cosmos DB ger en beständig, hög samtidighet, skrivbar grafdatabas som kan partitioneras över flera servrar eller kluster.
I följande tabell visas TinkerPop-funktionerna som implementeras av Azure Cosmos DB:
| Kategori | Azure Cosmos DB implementering | Notes |
|---|---|---|
| Diagramfunktioner | Ger beständighet och samtidig åtkomst. Designad att stödja transaktioner | Datormetoder kan implementeras via Spark-anslutningsappen. |
| Variabla funktioner | Stöder boolesk, heltal, byte, dubbel, flyttal, lång, sträng | Har stöd för primitiva typer, är kompatibel med komplexa typer via datamodellen |
| Vertexfunktioner | Stödjer RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty | Stöder att skapa, ändra och ta bort brytpunkter |
| Funktioner för brytpunktsegenskapen | StringIds, UserSuppliedIds, LäggTillEgenskap, TaBortEgenskap, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Stöder att skapa, ändra och ta bort brytpunktsegenskaper |
| Kantfunktioner | AddEdges, RemoveEdges, SträngIds, AnvändarlevereradeIds, AddProperty, RemoveProperty | Stöder att skapa, ändra och ta bort kanter |
| Kantegenskapsfunktioner | Egenskaper, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Stöder att skapa, ändra och ta bort kantegenskaper |
Gremlin-trådformat
Azure Cosmos DB använder JSON-formatet när du returnerar resultat från Gremlin-åtgärder. Azure Cosmos DB stöder för närvarande JSON-formatet. Följande kodfragment visar till exempel en JSON-representation av ett hörn returerat till klienten från Azure Cosmos DB:
{
"id": "a7111ba7-0ea1-43c9-b6b2-efc5e3aea4c0",
"label": "person",
"type": "vertex",
"outE": {
"knows": [
{
"id": "3ee53a60-c561-4c5e-9a9f-9c7924bc9aef",
"inV": "04779300-1c8e-489d-9493-50fd1325a658"
},
{
"id": "21984248-ee9e-43a8-a7f6-30642bc14609",
"inV": "a8e3e741-2ef7-4c01-b7c8-199f8e43e3bc"
}
]
},
"properties": {
"firstName": [
{
"value": "Thomas"
}
],
"lastName": [
{
"value": "Andersen"
}
],
"age": [
{
"value": 45
}
]
}
}
Egenskaperna som används av JSON-formatet för hörn beskrivs nedan:
| Fastighet | Description |
|---|---|
id |
ID för noden. Måste vara unikt (i kombination med värdet _partition om tillämpligt). Om inget värde anges levereras det automatiskt med ett GUID |
label |
Etiketten för brytpunkten. Den här egenskapen används för att beskriva entitetstypen. |
type |
Används för att särskilja brytpunkter från icke-diagramdokument |
properties |
En uppsättning användardefinierade egenskaper associerade med vertexen. Varje egenskap kan ha flera värden. |
_partition |
Partitionsnyckeln för noden. Används för grafpartitionering. |
outE |
Den här egenskapen innehåller en lista över utgående kanter från en nod. Lagring av angränsinformation med noder möjliggör snabb körning av traverseringar. Kanter grupperas baserat på deras etiketter. |
Varje egenskap kan lagra flera värden inom en matris.
| Fastighet | Description |
|---|---|
value |
Värdet på egenskapen |
Och kanten innehåller följande information för att underlätta navigeringen till andra delar av diagrammet.
| Fastighet | Description |
|---|---|
id |
ID för kanten. Måste vara unikt (i kombination med värdet _partition för om tillämpligt) |
label |
Etiketten för kantlinjen. Den här egenskapen är valfri och används för att beskriva relationstypen. |
inV |
Den här egenskapen innehåller en lista över inkommande hörn för en kant. Lagring av angränsningsinformation tillsammans med kanter möjliggör snabb genomförande av genomgångar. Noder grupperas baserat på deras etiketter. |
properties |
En uppsättning användardefinierade egenskaper associerade med kanten. |
Gremlin-steg
Nu ska vi titta på de Gremlin-steg som stöds av Azure Cosmos DB. En fullständig referens om Gremlin finns i TinkerPop-referens.
| steg | Description | TinkerPop 3.2-dokumentation |
|---|---|---|
addE |
Lägger till en kant mellan två brytpunkter | addE-steg |
addV |
Lägger till en brytpunkt i diagrammet | addV-steg |
and |
Ser till att alla bläddringar returnerar ett värde | och steg |
as |
En stegmodulator för att tilldela en variabel till utdata från ett steg | som steg |
by |
En stegmodulator som används med group och order |
steg för steg |
coalesce |
Returnerar den första bläddringen som returnerar ett resultat | sammanställningssteg |
constant |
Returnerar ett konstant värde. Används med coalesce |
konstant intervall |
count |
Returnerar antalet från traverseringen | antal steg |
dedup |
Returnerar värden med borttagna dubbletter | dedupliceringssteg |
drop |
Släpper värdena (brytpunkt/kant) | sänkningssteg |
executionProfile |
Skapar en beskrivning av alla åtgärder som genereras av det utförda Gremlin-steget |
executionProfile steg |
fold |
Fungerar som en barriär som beräknar totalen av resultat | vikningssteg |
group |
Grupperar värdena baserat på de angivna etiketterna | gruppsteg |
has |
Används för att filtrera egenskaper, brytpunkter och kanter. Stöder varianterna hasLabel, hasId, hasNot och has. |
har steg |
inject |
Inför värden i en dataström | injicera steg |
is |
Används för att utföra ett filter med ett booleskt uttryck | är ett steg |
limit |
Används för att begränsa antalet objekt i bläddringen | gränssteg |
local |
Lokal kapslar in en sektion av en traversering, liknande en underfråga | lokalt steg |
not |
Används för att skapa negationer av ett filter | inte trampa |
optional |
Returnerar resultatet av den angivna bläddringen om den ger upphov till ett resultat, annars returneras det anropande elementet | valfritt steg |
or |
Garanterar att minst en av bläddringarna returnerar ett värde | eller steg |
order |
Returnerar resultat i den angivna sorteringsordningen | ordersteg |
path |
Returnerar den fullständiga sökvägen för bläddringen | sökvägssteg |
project |
Projicerar egenskaperna som en karta | projektsteg |
properties |
Returnerar egenskaperna för de angivna etiketterna | egenskapssteg |
range |
Filtrerar till det angivna intervallet med värden | intervallsteg |
repeat |
Upprepar steget för det angivna antalet gånger. Används för upprepning | upprepa steg |
sample |
Används för att sampla resultat från traverseringen | exempelsteg |
select |
Används för att projicera resultat från genomgången | välj steg |
store |
Används för icke-blockerande aggregat från traverseringen | ** Lagringssteg |
TextP.startingWith(string) |
Strängfiltreringsfunktion. Den här funktionen används som ett predikat för has()-steget för att matcha en egenskap med början av en given sträng. |
TextP-predikat |
TextP.endingWith(string) |
Strängfiltreringsfunktion. Den här funktionen används som predikat i has()-steget för att matcha en egenskap med slutet av en specifik sträng |
TextP-predikat |
TextP.containing(string) |
Strängfiltreringsfunktion. Den här funktionen används som predikat för has()-steget för att matcha en egenskap med innehållet i en angiven sträng |
TextP-predikat |
TextP.notStartingWith(string) |
Strängfiltreringsfunktion. Den här funktionen används som ett predikat för has()-steget för att matcha en egenskap som inte börjar med en viss sträng |
TextP-predikat |
TextP.notEndingWith(string) |
Strängfiltreringsfunktion. Den här funktionen används som ett predikat för has()-steget att matcha en egenskap som inte har en given ändelse. |
TextP-predikat |
TextP.notContaining(string) |
Strängfiltreringsfunktion. Den här funktionen används som predikat för has()-steget för att matcha en egenskap som inte innehåller en viss sträng. |
TextP-predikat |
tree |
Samla vägar från en nod till ett träd | trädsteg |
unfold |
Rulla upp en iterator som ett steg | fäll ut steg |
union |
Sammanfoga resultat från flera bläddringar | föreningssteg |
V |
Inkluderar de steg som krävs för bläddringar mellan brytpunkter och kanter V, E, out, in, both, outE, inE, bothE, outV, inV, bothV och otherV för |
vertex-steg |
where |
Används för att filtrera resultat från traverseringen. Stöder operatorerna eq, neq, lt, lte, gt, gte och between |
där steg |
Den skrivoptimerade motorn som tillhandahålls av Azure Cosmos DB stöder automatisk indexering av alla egenskaper inom hörn och kanter som standard. Därför bearbetas frågor med filter, intervallfrågor, sortering eller sammanställning av alla egenskaper från index och hanteras effektivt. Mer information om hur indexering fungerar i Azure Cosmos DB finns i vår artikel om schema-agnostisk indexering.
Beteendeskillnader
- Azure Cosmos DB Graph-motorn kör bredden-först traversering medan TinkerPop Gremlin är djupet-först. Det här beteendet ger bättre prestanda i horisontellt skalbara system som Azure Cosmos DB.
Funktioner som inte stöds
Gremlin Bytecode är ett datorspråk med oberoende specifikation för diagrambläddringar. Azure Cosmos DB Graph stöder det inte än. Använd
GremlinClient.SubmitAsync()och skicka traverseringen som textsträng.property(set, 'xyz', 1)setkardinalitet stöds inte för närvarande. Användproperty(list, 'xyz', 1)i stället. Mer information finns i Nodens egenskaper med TinkerPop.match()steg är inte tillgänglig för närvarande. Det här steget innehåller deklarativa frågefunktioner.Objekt som egenskaper på hörn eller kanter stöds inte. Egenskaper kan bara vara primitiva typer eller matriser.
Sortering efter matrisegenskaper
order().by(<array property>)stöds inte. Sortering stöds endast av primitiva typer.Icke-primitiva JSON-typer stöds inte. Använd
string,numberellertrue/falsetyper.nullvärden stöds inte.GraphSONv3-serialiserare stöds inte för närvarande. Använd
GraphSONv2klasserna Serializer, Reader och Writer i anslutningskonfigurationen. Resultaten som returneras av Azure Cosmos DB för Gremlin har inte samma format som GraphSON-formatet.Lambda-uttryck och -funktioner stöds inte för närvarande. Detta inkluderar
.map{<expression>}funktionerna ,.by{<expression>}och.filter{<expression>}. Mer information om hur du skriver om dem med Gremlin-steg finns i En anteckning om Lambdas.Transaktioner stöds inte på grund av systemets distribuerade karaktär. Konfigurera lämplig konsekvensmodell för Gremlin-kontot för att "läsa dina egna skrivningar" och använd optimistisk samtidighet för att lösa motstridiga skrivningar.
Kända begränsningar
-
Indexanvändning för Gremlin-frågor med steg mitt i traverseringen
.V(): För närvarande används endast det första.V()anropet av en traversering av indexet för att lösa eventuella filter eller predikat som är kopplade till det. Efterföljande anrop kommer inte att konsultera indexet, vilket kan öka svarstiden och kostnaden för frågan.
Om vi antar standardindexering använder en vanlig Gremlin-fråga som börjar med .V() steget parametrar i de bifogade filtreringsstegen, till exempel .has() eller .where() för att optimera frågans kostnad och prestanda. Som exempel:
g.V().has('category', 'A')
Men när mer än ett .V() steg ingår i Gremlin-frågan kanske lösningen på data för frågan inte är optimal. Ta följande fråga som exempel:
g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')
Den här frågan returnerar två grupper med hörn baserat på deras egenskap med namnet category. I det här fallet använder endast det första anropet g.V().has('category', 'A') indexet för att lösa hörnen baserat på värdena för deras egenskaper.
En lösning för den här frågan är att använda subtraversala steg som .map() och union(). Detta exemplifieras nedan:
// Query workaround using .map()
g.V().has('category', 'A').as('a').map(__.V().has('category', 'B')).as('b').select('a','b')
// Query workaround using .union()
g.V().has('category', 'A').fold().union(unfold(), __.V().has('category', 'B'))
Du kan granska frågornas prestanda med hjälp av Gremlin-steget executionProfile() .