Azure Cosmos DB Gremlin Graph-stöd och kompatibilitet med TinkerPop-funktioner

GÄLLER för: Gremlin-API

Azure Cosmos DB har stöd för Apache Tinkerpops diagramtramssprå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 noggrant specifikationen för Apache TinkerPop-bluggsteg, 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 Gremlin-API:et.

Kompatibla klientbibliotek

Följande tabell visar populära Gremlin-drivrutiner som du kan använda mot Azure Cosmos DB:

Ladda ned Källa Komma igång Version av anslutningsappen som stöds
.NET Gremlin.NET på GitHub Skapa diagram med .NET 3.4.6
Java Gremlin JavaDoc Skapa diagram med Java 3.2.0+
Node.js Gremlin-JavaScript på GitHub Skapa diagram med Node.js 3.3.4+
Python Gremlin-Python på GitHub Skapa diagram med Python 3.2.7
PHP Gremlin-PHP på GitHub Skapa diagram med PHP 3.1.0
Go Lang Go Lang Det här biblioteket har skapats av externa deltagare. Teamet Azure Cosmos DB inte erbjuder någon support eller underhåller biblioteket.
Gremlin-konsol TinkerPop-dokument Skapa diagram med Gremlin-konsolen 3.2.0 +

Objekt som Graph stöd

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 tillhandahåller en beständig, skrivbar diagramdatabas med hög samtidighet som kan partitioneras över flera servrar eller kluster.

Följande tabell visar den TinkerPop-funktioner som implementeras av Azure Cosmos DB:

Kategori Azure Cosmos DB-implementering Kommentarer
Diagramfunktioner Ger beständighet och ConcurrentAccess. Designad att stödja transaktioner Datormetoder kan implementeras via Spark-anslutningsappen.
Variabla funktioner Stöder boolesk, heltal, byte, dubbel, flyttal, heltal, lång, sträng Har stöd för primitiva typer, är kompatibel med komplexa typer via datamodellen
Brytpunktsfunktioner Stöder RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Stöder att skapa, ändra och ta bort brytpunkter
Funktioner för brytpunktsegenskapen StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Stöder att skapa, ändra och ta bort brytpunktsegenskaper
Kantfunktioner AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Stöder att skapa, ändra och ta bort kanter
Kantegenskapsfunktioner Properties, 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 som returneras 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:

Egenskap Beskrivning
id ID för brytpunkten. Måste vara unikt (i kombination med värdet för _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 brytpunkten. Varje egenskap kan ha flera värden.
_partition Partitionsnyckeln för brytpunkten. Används för grafpartitionering.
outE Den här egenskapen innehåller en lista över utkanterna från ett hörn. Lagring av angränsande information med brytpunkter för snabbare körning av bläddring. Kanter grupperas baserat på deras etiketter.

Varje egenskap kan lagra flera värden inom en matris.

Egenskap Beskrivning
value Värdet på egenskapen

Och kanten innehåller följande information för att underlätta navigeringen till andra delar av diagrammet.

Egenskap Beskrivning
id ID för kanten. Måste vara unikt (i kombination med värdet för _partition om tillämpligt)
label Etiketten för kanten. Den här egenskapen är valfri och används för att beskriva relationstypen.
inV Den här egenskapen innehåller en lista över i hörn för en kant. Lagring av angränsningsinformation med kanter tillåter snabb körning av bläddringar. Brytpunkter 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 Beskrivning TinkerPop 3.2-dokumentation
addE Lägger till en kant mellan två brytpunkter addE step
addV Lägger till en brytpunkt i diagrammet addV step
and Ser till att alla bläddringar returnerar ett värde and step
as Ett stegmodulator för att tilldela en variabel till utdata från ett steg as step
by En stegmodulator som används med group och order by step
coalesce Returnerar den första bläddringen som returnerar ett resultat coalesce step
constant Returnerar ett konstant värde. Används med coalesce constant step
count Returnerar antalet från bläddringen count step
dedup Returnerar värden med borttagna dubbletter dedup step
drop Släpper värdena (brytpunkt/kant) drop step
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 sammanställningen av resultat fold step
group Grupperar värdena baserat på de angivna etiketterna group step
has Används för att filtrera egenskaper, brytpunkter och kanter. Stöder varianterna hasLabel, hasId, hasNot och has. has step
inject Matar in värden i en dataström inject step
is Används för att utföra ett filter med ett booleskt uttryck is step
limit Används för att begränsa antalet objekt i bläddringen limit step
local Bäddar in ett avsnitt av en bläddring lokalt, liknar en underfråga local step
not Används för att skapa negationer av ett filter not step
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 or step
order Returnerar resultat i den angivna sorteringsordningen order step
path Returnerar den fullständiga sökvägen för bläddringen path step
project Projicerar egenskaperna som en karta project step
properties Returnerar egenskaperna för de angivna etiketterna properties step
range Filtrerar till det angivna intervallet med värden range step
repeat Upprepar steget för det angivna antalet gånger. Används för upprepning repeat step
sample Används för exempelresultat för bläddringen sample step
select Används för att projicera resultat från bläddringen select step
store Används för icke-blockerande sammanställningar från bläddringen store step
TextP.startingWith(string) Funktionen för strängfiltrering. Den här funktionen används som predikat för att has() steget ska matcha en egenskap med början av en viss sträng Predikat för TextP
TextP.endingWith(string) Funktionen för strängfiltrering. Den här funktionen används som predikat för steget has() för att matcha en egenskap med slutet på en viss sträng Predikat för TextP
TextP.containing(string) Funktionen för strängfiltrering. Den här funktionen används som predikat för steget has() för att matcha en egenskap med innehållet i en viss sträng Predikat för TextP
TextP.notStartingWith(string) Funktionen för strängfiltrering. Den här funktionen används som predikat för steget has() för att matcha en egenskap som inte börjar med en viss sträng Predikat för TextP
TextP.notEndingWith(string) Funktionen för strängfiltrering. Den här funktionen används som predikat för steget has() för att matcha en egenskap som inte slutar med en viss sträng Predikat för TextP
TextP.notContaining(string) Funktionen för strängfiltrering. Den här funktionen används som predikat för steget has() för att matcha en egenskap som inte innehåller en viss sträng Predikat för TextP
tree Sammanställ sökvägar från en brytpunkt i ett träd tree step
unfold Rulla upp en iterator som ett steg unfold step
union Sammanfoga resultat från flera bläddringar union step
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 steps
where Används för att filtrera resultat från bläddringen. Stöder operatorerna eq, neq, lt, lte, gt, gte och between where step

Den skrivoptimerade motorn som tillhandahålls av Azure Cosmos DB stöder automatisk indexering av alla egenskaperna i brytpunkter 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 DV finns i vårt papper om schemaoberoende indexering.

Beteendeskillnader

  • Azure Cosmos DB Graph-motorn bläddrar först med bredden medan TinkerPop Gremlin är djup först. Det här beteendet ger bättre prestanda i vågrätt skalbara system som Cosmos DB.

Funktioner som inte stöds

  • Gremlin Bytecode är ett datorspråk med oberoende specifikation för diagrambläddringar. Cosmos DB Graph har inte stöd för det ännu. Använd GremlinClient.SubmitAsync() och skicka traverseringen som textsträng.

  • property(set, 'xyz', 1) ange kardinalitet stöds inte i dag. Använd property(list, 'xyz', 1) i stället. Mer information finns i Hörnegenskaper med TinkerPop.

  • Steget match() är inte tillgängligt för närvarande. Det här steget innehåller funktioner för deklarativ frågefunktion.

  • Objekt som egenskaper på hörn eller kanter stöds inte. Egenskaper kan bara vara primitiva typer eller matriser.

  • Sortera 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 typerna , eller number true / false . null -värden stöds inte.

  • GraphSONv3-serialiserare stöds inte för närvarande. Använd GraphSONv2 klasserna Serialiserare, Läsare och Skrivare i anslutningskonfigurationen. Resultatet som returneras av Azure Cosmos DB Gremlin-API:et har inte samma format som GraphSON-formatet.

  • Lambda-uttryck och funktioner stöds inte för närvarande. Detta inkluderar .map{<expression>} funktionerna , och .by{<expression>} .filter{<expression>} . Mer information och hur du skriver om dem med hjälp av Gremlin-steg finns i En anteckning om Lambdas.

  • Transaktioner stöds inte på grund av systemets distribuerade natur. Konfigurera lämplig konsekvensmodell på 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 .V() Gremlin-frågor med medelstora traverseringssteg: För närvarande använder bara det första anropet av en traversering indexet för att lösa eventuella filter eller predikat som är kopplade till .V() det. Efterföljande anrop kommer inte att läsa indexet, vilket kan öka frågans svarstid och kostnad.

Om standardindexering används skulle en typisk läsaNde Gremlin-fråga som börjar med steget använda parametrar i de kopplade filtreringsstegen, till exempel eller för att optimera frågans .V() .has() kostnad och .where() prestanda. Exempel:

g.V().has('category', 'A')

Men när fler än .V() ett 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 som kallas category . I det här fallet använder bara det första anropet indexet för att matcha g.V().has('category', 'A') hörnen baserat på värdena för deras egenskaper.

En lösning för den här frågan är att använda underordnade steg som .map() och union() . Detta visas 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() .

Nästa steg