Supporto e compatibilità del grafo di Azure Cosmos DB per Gremlin con le funzionalità di 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 enumerare 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:
Scarica | Origine | Introduzione | Versione del connettore supportata/raccomandata |
---|---|---|---|
.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.* presentano problemi di compatibilità noti, pertanto è consigliabile usare le versioni del driver 3.4.* supportate più recenti elencate in precedenza. Questa tabella verrà aggiornata quando verranno risolti i problemi di compatibilità 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:
Categoria | 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 Azure Cosmos DB Graph esegue l'attraversamento in ampiezza, mentre quello di TinkerPop Gremlin è in profondità. Questo comportamento consente di ottenere prestazioni migliori in un sistema scalabile orizzontalmente come Azure Cosmos DB.
Funzionalità non supportate
Gremlin Bytecode è una specifica non dipendente da un linguaggio di programmazione per gli attraversamenti grafici. Azure Cosmos DB Graph non lo supporta ancora. Usare
GremlinClient.SubmitAsync()
e passare l'attraversamento come stringa di testo.property(set, 'xyz', 1)
La cardinalità set non è attualmente supportata. Utilizzare inveceproperty(list, 'xyz', 1)
. Per altre informazioni, vedere le proprietà dei vertici con TinkerPop.Il passaggio
match()
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.
L'ordinamento per proprietà di matrici
order().by(<array property>)
non è supportato. L'ordinamento è supportato solo per tipi primitivi.I tipi JSON non primitivi non sono supportati. Usare i tipi
string
,number
otrue
/false
. I valorinull
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
.V()
passaggi di attraversamento intermedio: 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
- Iniziare a creare un'applicazione Graph tramite SDK
- Altre informazioni sul supporto dei grafi in Azure Cosmos DB