Supporto e compatibilità del grafico di Azure Cosmos DB per Gremlin con le funzionalità tinkerPop

SI APPLICA A: Gremlin

Azure Cosmos DB supporta il linguaggio di attraversamento di grafi di Apache Tinkerpop, noto come Gremlin. È possibile usare il linguaggio Gremlin per creare le entità dei grafi (vertici e archi), modificare proprietà all'interno di tali entità, eseguire query e attraversamenti ed eliminare entità.

Il motore Azure Cosmos DB Graph segue rigorosamente la specifica dei passaggi trasversali di Apache TinkerPop, ma esistono differenze nell'implementazione specifiche per Azure Cosmos DB. In questo articolo viene descritta una procedura dettagliata rapida di Gremlin ed enumera le funzionalità Gremlin supportate dall'API per Gremlin.

Librerie client compatibili

La tabella seguente illustra i driver Gremlin noti che è possibile usare in Azure Cosmos DB:

Download Source (Sorgente) Introduzione Versione supportata/Consigliata del connettore
.NET Gremlin.NET su GitHub Creare un'app Graph con .NET 3.4.13
Java JavaDoc Gremlin Creare un'app Graph con Java 3.4.13
Python Gremlin-Python in GitHub Creare un'app Graph con Python 3.4.13
Console Gremlin Documenti TinkerPop Creare un'app Graph con la console Gremlin 3.4.13
Node.js Gremlin-JavaScript in GitHub Creare un'app Graph con Node.js 3.4.13
PHP Gremlin-PHP su GitHub Creare un'app Graph con PHP 3.1.0
Go Lang Go Lang Questa libreria è creata da collaboratori esterni. Il team di Azure Cosmos DB non offre alcun supporto né gestisce la libreria.

Nota

Le versioni del driver client Gremlin per 3.5.*, 3.6.* hanno problemi di compatibilità noti, quindi è consigliabile usare le versioni del driver 3.4.* supportate più recenti elencate in precedenza. Questa tabella verrà aggiornata quando i problemi di compatibilità sono stati risolti per queste versioni più recenti del driver.

Graph oggetti supportato

TinkerPop è uno standard che copre un'ampia gamma di tecnologie a grafi. Pertanto, ha una terminologia standard usata per descrivere le funzionalità offerte da un provider di grafi. Azure Cosmos DB offre un database a grafi scrivibile, ad alta concorrenza, persistente, che può essere partizionato tra più server o cluster.

La tabella seguente elenca le funzionalità di TinkerPop implementate da Azure Cosmos DB:

Category Implementazione di Azure Cosmos DB Note
Funzionalità del grafo Offre persistenza e accesso simultaneo. Progettata per supportare le transazioni Metodi di calcolo possono essere implementati tramite il connettore Spark.
Funzionalità della variabile Supporta Boolean, Integer, Byte, Double, Float, Long, String Supporta i tipi primitivi, è compatibile con i tipi complessi tramite modello di dati
Funzionalità del vertice Supporta RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Supporta la creazione, la modifica e l'eliminazione di vertici
Funzionalità della proprietà del vertice StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Supporta la creazione, la modifica e l'eliminazione di proprietà di vertici
Funzionalità dell'arco AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Supporta la creazione, la modifica e l'eliminazione di archi
Funzionalità della proprietà dell'arco Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Supporta la creazione, la modifica e l'eliminazione di proprietà dell'arco

Formato wire Gremlin

Azure Cosmos DB usa il formato JSON per la restituzione di risultati dalle operazioni Gremlin. Azure Cosmos DB attualmente supporta il formato JSON. Ad esempio, il frammento di codice seguente mostra una rappresentazione JSON di un vertice restituito al client da 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
        }
      ]
    }
  }

Le proprietà usate dal formato JSON per i vertici sono descritte di seguito:

Proprietà Descrizione
id ID del vertice. Deve essere univoco (in combinazione con il valore di _partition se applicabile). Se non viene specificato alcun valore, viene automaticamente assegnato un GUID
label Etichetta del vertice. Questa proprietà viene usata per descrivere il tipo di entità.
type Usato per distinguere i vertici da documenti non a grafo
properties Contenitore delle proprietà definite dall'utente associate al vertice. Ogni proprietà può avere più valori.
_partition La chiave di partizione del vertice. Usata per il partizionamento Graph.
outE Questa proprietà contiene un elenco degli archi uscenti da un vertice. L'archiviazione delle informazioni di adiacenza con il vertice consente l'esecuzione rapida degli attraversamenti. Gli archi vengono raggruppati in base alle relative etichette.

Ogni proprietà può archiviare più valori all'interno di una matrice.

Proprietà Descrizione
value Valore della proprietà

E l'arco contiene le informazioni seguenti per spostarsi in altre parti del grafo.

Proprietà Descrizione
id ID dell'arco. Deve essere univoco (in combinazione con il valore di _partition se applicabile).
label Etichetta dell'arco. Questa proprietà è facoltativa e viene usata per descrivere il tipo di relazione.
inV Questa proprietà contiene un elenco di vertici per un bordo. L'archiviazione delle informazioni di adiacenza con il bordo consente l'esecuzione rapida degli attraversamenti. I vertici vengono raggruppati in base alle relative etichette.
properties Contenitore delle proprietà definite dall'utente associate all'arco.

Step di Gremlin

Verranno ora esaminati gli step di Gremlin supportati da Azure Cosmos DB. Per informazioni complete su Gremlin, vedere TinkerPop reference (Riferimento a TinkerPop).

step Descrizione Documentazione TinkerPop 3.2
addE Aggiunge un arco tra due vertici addE step
addV Aggiunge un vertice al grafo addV step
and Assicura che tutti gli attraversamenti restituiscono un valore and step
as Modulatore di step per assegnare una variabile all'output di uno step as step
by Modulatore di step usato con group e order by step
coalesce Restituisce il primo attraversamento che restituisce un risultato coalesce step
constant Restituisce un valore costante. Usato con coalesce constant step
count Restituisce il conteggio risultante dall'attraversamento count step
dedup Restituisce i valori con i duplicati rimossi dedup step
drop Elimina i valori (vertice/arco) drop step
executionProfile Crea una descrizione di tutte le operazioni generate dallo step di Gremlin eseguito executionProfile step
fold Si comporta come una barriera che calcola l'aggregazione di risultati fold step
group Raggruppa i valori in base alle etichette specificate group step
has Usato per filtrare proprietà, vertici e archi. Supporta hasLabel, hasId, hasNot e le varianti has. has step
inject Inserisce i valori in un flusso inject step
is Usato per eseguire un filtro con un'espressione booleana is step
limit Usato per limitare il numero di elementi nell'attraversamento limit step
local Esegue il wrapping di una sezione di attraversamento, simile a una sottoquery local step
not Usato per produrre la negazione di un filtro not step
optional Restituisce il risultato dell'attraversamento specificato se fornisce un risultato, in caso contrario restituisce l'elemento chiamante optional step
or Garantisce che almeno uno degli attraversamenti restituisca un valore or step
order Restituisce i risultati nell'ordinamento specificato order step
path Restituisce il percorso completo dell'attraversamento path step
project Proietta le proprietà come Mappa project step
properties Restituisce le proprietà per le etichette specificate properties step
range Filtra per l'intervallo di valori specificato range step
repeat Ripete lo step per il numero di volte specificato. Usato per eseguire i cicli repeat step
sample Usato per campionare i risultati dell'attraversamento sample step
select Usato per proiettare i risultati dell'attraversamento select step
store Usato per le aggregazioni non bloccanti risultanti dall'attraversamento store step
TextP.startingWith(string) Funzione di filtraggio di stringhe. Viene usata come predicato relativo allo step has() per consentire di trovare una corrispondenza con una proprietà che inizia con una determinata stringa Predicati TextP
TextP.endingWith(string) Funzione di filtraggio di stringhe. Viene usata come predicato relativo allo step has() per consentire di trovare una corrispondenza con una proprietà che termina con una determinata stringa Predicati TextP
TextP.containing(string) Funzione di filtraggio di stringhe. Viene usata come predicato relativo allo step has() per consentire di trovare una corrispondenza con una proprietà che contiene una determinata stringa Predicati TextP
TextP.notStartingWith(string) Funzione di filtraggio di stringhe. Viene usata come predicato relativo allo step has() per consentire di trovare una corrispondenza con una proprietà che non inizia con una determinata stringa Predicati TextP
TextP.notEndingWith(string) Funzione di filtraggio di stringhe. Viene usata come predicato relativo allo step has() per consentire di trovare una corrispondenza con una proprietà che non termina con una determinata stringa Predicati TextP
TextP.notContaining(string) Funzione di filtraggio di stringhe. Viene usata come predicato relativo allo step has() per consentire di trovare una corrispondenza con una proprietà che non contiene una determinata stringa Predicati TextP
tree Aggrega i percorsi da un vertice a una struttura ad albero tree step
unfold Srotola un iteratore come step unfold step
union Unisce i risultati di più attraversamenti union step
V Include gli step necessari per gli attraversamenti tra vertici e archi V, E, out, in, both, outE, inE, bothE, outV, inV, bothV, e otherV per vertex steps
where Usato per filtrare i risultati dell'attraversamento. Supporta eq, neq, lt, lte, gt, gte e gli operatori between where step

Il motore ottimizzato per la scrittura fornito da Azure Cosmos DB supporta l'indicizzazione automatica di tutte le proprietà comprese all'interno di vertici e archi per impostazione predefinita. Pertanto, query con filtri, query di intervallo, ordinamento o aggregazioni in qualsiasi proprietà vengono elaborati dall'indice e serviti in modo efficiente. Per altre informazioni sul funzionamento dell'indicizzazione in Azure Cosmos DB, vedere il documento sull'indicizzazione senza schema.

Differenze di comportamento

  • Il motore Graph di Azure Cosmos DB esegue l'attraversamento in ampiezza mentre TinkerPop Gremlin è depth-first. Questo comportamento consente di ottenere prestazioni migliori in un sistema scalabile orizzontalmente come Azure Cosmos DB.

Funzionalità non supportate

  • Gremlin Bytecode è una specifica indipendente dal linguaggio di programmazione per gli attraversamenti del grafo. Azure Cosmos DB Graph non lo supporta ancora. Usare GremlinClient.SubmitAsync() e passare l'attraversamento come stringa di testo.

  • La cardinalità set property(set, 'xyz', 1) non è attualmente supportata. In alternativa, utilizzare property(list, 'xyz', 1). Per altre informazioni, vedere le proprietà dei vertici con TinkerPop.

  • Il match() passaggio non è attualmente disponibile. Questo passaggio fornisce funzionalità di query dichiarative.

  • Gli oggetti come proprietà su vertici o archi non sono supportati. Le proprietà possono essere solo tipi primitivi o matrici.

  • Ordinamento in base alle proprietàorder().by(<array property>) della matrice non è supportato. L'ordinamento è supportato solo per tipi primitivi.

  • I tipi JSON non primitivi non sono supportati. Usare i tipi string, number o true/false. I valori null non sono supportati.

  • Il serializzatore GraphSONv3 non è attualmente supportato. Usare le classi Serializer, Reader e Writer di GraphSONv2 nella configurazione della connessione. I risultati restituiti da Azure Cosmos DB per Gremlin non hanno lo stesso formato del formato GraphSON.

  • Le espressioni e le funzioni lambda non sono attualmente supportate. Sono incluse le funzioni .map{<expression>}, .by{<expression>} e .filter{<expression>}. Per altre informazioni, anche su come riscriverle usando i passaggi di Gremlin, vedere le note sulle espressioni lambda.

  • Le transazioni non sono supportate a causa della natura distribuita del sistema. Configurare il modello di coerenza appropriato nell'account Gremlin per ottenere garanzie "read your own writes" e usare la concorrenza ottimistica per risolvere le scritture in conflitto.

Limitazioni note

  • Utilizzo degli indici per le query Gremlin con passaggi di attraversamento intermedio .V() : Attualmente, solo la prima chiamata .V() di un attraversamento userà l'indice per risolvere eventuali filtri o predicati collegati. Le chiamate successive non consulteranno l'indice, il che potrebbe aumentare la latenza e il costo della query.

Presupponendo l'indicizzazione predefinita, una tipica query di lettura di Gremlin che inizia con il passaggio .V() userà i parametri nei passaggi di filtro collegati, come .has() o .where(), per ottimizzare il costo e le prestazioni della query. Ad esempio:

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

Tuttavia, quando nella query Gremlin vengono inclusi più passaggi .V(), la risoluzione dei dati per la query potrebbe non essere ottimale. Prendere come esempio la query seguente:

g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')

Questa query restituirà due gruppi di vertici in base alla relativa proprietà denominata category. In questo caso, solo la prima chiamata g.V().has('category', 'A') userà l'indice per risolvere i vertici in base ai valori delle relative proprietà.

Una soluzione alternativa per questa query consiste nell'usare passaggi di sottoattraversamento, ad esempio .map() e union(). Questo scenario è esemplificato di seguito:

// 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'))

Per esaminare le prestazioni delle query, è possibile usare il passaggio executionProfile() di Gremlin.

Passaggi successivi