Supporto Gremlin Graph di Azure Cosmos DBAzure Cosmos DB Gremlin graph support

Azure Cosmos DB supporta il linguaggio di attraversamento di grafi Gremlin di Apache Tinkerpop, ovvero un'API Graph per la creazione di entità di grafi e l'esecuzione di operazioni di query sui grafi.Azure Cosmos DB supports Apache Tinkerpop's graph traversal language, Gremlin, which is a Graph API for creating graph entities, and performing graph query operations. È 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à.You can use the Gremlin language to create graph entities (vertices and edges), modify properties within those entities, perform queries and traversals, and delete entities.

Azure Cosmos DB offre funzionalità di livello aziendale per database a grafi.Azure Cosmos DB brings enterprise-ready features to graph databases. Questo include distribuzione globale, scalabilità indipendente di archiviazione e velocità effettiva, latenze stimabili in pochissimi millisecondi, indicizzazione automatica, contratti di servizio e disponibilità di lettura per gli account database che si estendono sue due o più aree Azure.This includes global distribution, independent scaling of storage and throughput, predictable single-digit millisecond latencies, automatic indexing, SLAs, read availability for database accounts spanning two or more Azure regions. Poiché Azure Cosmos DB supporta TinkerPop/Gremlin, è possibile eseguire facilmente la migrazione di applicazioni scritte usando un altro database a grafi senza dover apportare modifiche al codice.Because Azure Cosmos DB supports TinkerPop/Gremlin, you can easily migrate applications written using another graph database without having to make code changes. In più, grazie al supporto Gremlin, Azure Cosmos DB si integra facilmente con framework di analisi abilitati per TinkerPop come Apache Spark GraphX.Additionally, by virtue of Gremlin support, Azure Cosmos DB seamlessly integrates with TinkerPop-enabled analytics frameworks like Apache Spark GraphX.

Questo articolo illustra una procedura dettagliata di Gremlin ed enumera le funzionalità e gli step di Gremlin supportati nella versione di anteprima del supporto API Graph.In this article, we provide a quick walkthrough of Gremlin, and enumerate the Gremlin features and steps that are supported in the preview of Graph API support.

Esempio di GremlinGremlin by example

Verrà ora usato un grafo di esempio per comprendere come le query possono essere espresse in Gremlin.Let's use a sample graph to understand how queries can be expressed in Gremlin. La figura seguente illustra un'applicazione aziendale che gestisce i dati su utenti, interessi e dispositivi sotto forma di grafo.The following figure shows a business application that manages data about users, interests, and devices in the form of a graph.

Database di esempio che mostra persone, dispositivi e interessi

Questo grafo presenta i seguenti tipi di vertici (denominati "label" in Gremlin):This graph has the following vertex types (called "label" in Gremlin):

  • Persone: il grafo presenta tre persone, Robin, Thomas e BenPeople: the graph has three people, Robin, Thomas, and Ben
  • Interessi: i loro interessi, in questo esempio, il gioco del footballInterests: their interests, in this example, the game of Football
  • Dispositivi: i dispositivi usati dagli utentiDevices: the devices that people use
  • Sistemi operativi: i sistemi operativi eseguiti dai dispositiviOperating Systems: the operating systems that the devices run on

Si rappresentano le relazioni tra queste entità tramite i seguenti tipi/etichette di archi:We represent the relationships between these entities via the following edge types/labels:

  • Conosce: ad esempio, "Thomas conosce Robin"Knows: For example, "Thomas knows Robin"
  • Interessato: per rappresentare gli interessi delle persone nel nostro grafo, ad esempio, "Ben è interessato al football"Interested: To represent the interests of the people in our graph, for example, "Ben is interested in Football"
  • RunsOS: il portatile esegue il sistema operativo Windows OSRunsOS: Laptop runs the Windows OS
  • Usa: per rappresentare quale dispositivo viene usato da una persona.Uses: To represent which device a person uses. Ad esempio, Robin usa un telefono Motorola con numero di serie 77For example, Robin uses a Motorola phone with serial number 77

Verranno ora eseguite alcune operazioni su questo grafo tramite la console Gremlin.Let's run some operations against this graph using the Gremlin Console. È anche possibile eseguire queste operazioni usando i driver Gremlin nella piattaforma di propria scelta (Java, Node.js, Python o .NET).You can also perform these operations using Gremlin drivers in the platform of your choice (Java, Node.js, Python, or .NET). Prima di esaminare cosa è supportato in Azure Cosmos DB, verranno esaminati alcuni esempi per acquisire familiarità con la sintassi.Before we look at what's supported in Azure Cosmos DB, let's look at a few examples to get familiar with the syntax.

Verrà dapprima esaminato CRUD.First let's look at CRUD. L'istruzione Gremlin seguente inserisce il vertice "Thomas" nel grafo:The following Gremlin statement inserts the "Thomas" vertex into the graph:

:> g.addV('person').property('id', 'thomas.1').property('firstName', 'Thomas').property('lastName', 'Andersen').property('age', 44)

Successivamente, l'istruzione Gremlin seguente inserisce un arco "conosce" tra Thomas e Robin.Next, the following Gremlin statement inserts a "knows" edge between Thomas and Robin.

:> g.V('thomas.1').addE('knows').to(g.V('robin.1'))

La query seguente restituisce i vertici "persona" secondo l'ordine decrescente dei relativi nomi:The following query returns the "person" vertices in descending order of their first names:

:> g.V().hasLabel('person').order().by('firstName', decr)

I grafi sono eccellenti quando è necessario rispondere a domande come "Quali sistemi operativi usano gli amici di Thomas?".Where graphs shine is when you need to answer questions like "What operating systems do friends of Thomas use?". È possibile eseguire questo semplice attraversamento Gremlin per ottenere informazioni dal grafo:You can run this simple Gremlin traversal to get that information from the graph:

:> g.V('thomas.1').out('knows').out('uses').out('runsos').group().by('name').by(count())

Ora verrà esaminato cosa Azure Cosmos DB offre agli sviluppatori di Gremlin.Now let's look at what Azure Cosmos DB provides for Gremlin developers.

Funzionalità di GremlinGremlin features

TinkerPop è uno standard che copre un'ampia gamma di tecnologie a grafi.TinkerPop is a standard that covers a wide range of graph technologies. Pertanto, ha una terminologia standard usata per descrivere le funzionalità offerte da un provider di grafi.Therefore, it has standard terminology to describe what features are provided by a graph provider. Azure Cosmos DB offre un database a grafi scrivibile, ad alta concorrenza, persistente, che può essere partizionato tra più server o cluster.Azure Cosmos DB provides a persistent, high concurrency, writeable graph database that can be partitioned across multiple servers or clusters.

La tabella seguente elenca le funzionalità di TinkerPop implementate da Azure Cosmos DB:The following table lists the TinkerPop features that are implemented by Azure Cosmos DB:

CategoriaCategory Implementazione di Azure Cosmos DBAzure Cosmos DB implementation NoteNotes
Funzionalità del grafoGraph features Offre persistenza e accesso simultaneo in anteprima.Provides Persistence and ConcurrentAccess in preview. Progettata per supportare le transazioniDesigned to support Transactions Metodi di calcolo possono essere implementati tramite il connettore Spark.Computer methods can be implemented via the Spark connector.
Funzionalità della variabileVariable features Supporta Boolean, Integer, Byte, Double, Float, Integer, Long, StringSupports Boolean, Integer, Byte, Double, Float, Integer, Long, String Supporta i tipi primitivi, è compatibile con i tipi complessi tramite modello di datiSupports primitive types, is compatible with complex types via data model
Funzionalità del verticeVertex features Supporta RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemovePropertySupports RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Supporta la creazione, la modifica e l'eliminazione di verticiSupports creating, modifying, and deleting vertices
Funzionalità della proprietà del verticeVertex property features StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValuesStringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Supporta la creazione, la modifica e l'eliminazione di proprietà di verticiSupports creating, modifying, and deleting vertex properties
Funzionalità dell'arcoEdge features AddEges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemovePropertyAddEges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Supporta la creazione, la modifica e l'eliminazione di archiSupports creating, modifying, and deleting edges
Funzionalità della proprietà dell'arcoEdge property features Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValuesProperties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Supporta la creazione, la modifica e l'eliminazione di proprietà dell'arcoSupports creating, modifying, and deleting edge properties

Formato wire Gremlin: GraphSONGremlin wire format: GraphSON

Azure Cosmos DB usa il formato GraphSON per la restituzione di risultati dalle operazioni Gremlin.Azure Cosmos DB uses the GraphSON format when returning results from Gremlin operations. GraphSON è il formato standard Gremlin per la rappresentazione di vertici, archi e proprietà (singolo e multi-valore) tramite JSON.GraphSON is the Gremlin standard format for representing vertices, edges, and properties (single and multi-valued properties) using JSON.

Ad esempio, il frammento di codice seguente mostra una rappresentazione GraphSON di un vertice restituito al client da Azure Cosmos DB.For example, the following snippet shows a GraphSON representation of a vertex returned to the client from 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 da GraphSON per i vertici sono le seguenti:The properties used by GraphSON for vertices are the following:

ProprietàProperty DescrizioneDescription
idid ID del vertice.The ID for the vertex. Deve essere univoco (in combinazione con il valore di _partition se applicabile)Must be unique (in combination with the value of _partition if applicable)
labellabel Etichetta del vertice.The label of the vertex. Questo è facoltativo e viene usato per descrivere il tipo di entità.This is optional, and used to describe the entity type.
typetype Usato per distinguere i vertici da documenti non a grafoUsed to distinguish vertices from non-graph documents
propertiesproperties Contenitore delle proprietà definite dall'utente associate al vertice.Bag of user-defined properties associated with the vertex. Ogni proprietà può avere più valori.Each property can have multiple values.
_partition (configurabile)_partition (configurable) La chiave di partizione del vertice.The partition key of the vertex. Può essere usata per scalare orizzontalmente grafi in più serverCan be used to scale out graphs to multiple servers
outEoutE Contiene un elenco degli archi uscenti da un vertice.This contains a list of out edges from a vertex. L'archiviazione delle informazioni di adiacenza con il vertice consente l'esecuzione rapida degli attraversamenti.Storing the adjacency information with vertex allows for fast execution of traversals. Gli archi vengono raggruppati in base alle relative etichette.Edges are grouped based on their labels.

E l'arco contiene le informazioni seguenti per spostarsi in altre parti del grafo.And the edge contains the following information to help with navigation to other parts of the graph.

ProprietàProperty DescrizioneDescription
idid ID dell'arco.The ID for the edge. Deve essere univoco (in combinazione con il valore di _partition se applicabile)Must be unique (in combination with the value of _partition if applicable)
labellabel Etichetta dell'arco.The label of the edge. Questa proprietà è facoltativa e viene usata per descrivere il tipo di relazione.This property is optional, and used to describe the relationship type.
inVinV Contiene un elenco di vertici per un bordo.This contains a list of in vertices for an edge. L'archiviazione delle informazioni di adiacenza con il bordo consente l'esecuzione rapida degli attraversamenti.Storing the adjacency information with the edge allows for fast execution of traversals. I vertici vengono raggruppati in base alle relative etichette.Vertices are grouped based on their labels.
propertiesproperties Contenitore delle proprietà definite dall'utente associate all'arco.Bag of user-defined properties associated with the edge. Ogni proprietà può avere più valori.Each property can have multiple values.

Ogni proprietà può archiviare più valori all'interno di una matrice.Each property can store multiple values within an array.

ProprietàProperty DescrizioneDescription
valuevalue Valore della proprietàThe value of the property

Partizionamento di GremlinGremlin partitioning

In Azure Cosmos DB i grafi vengono archiviati all'interno di contenitori che possono essere scalati in modo indipendente in termini di memoria e velocità effettiva (espressa in richieste normalizzate al secondo).In Azure Cosmos DB, graphs are stored within containers that can scale independently in terms of storage and throughput (expressed in normalized requests per second). Ogni contenitore deve definire una proprietà della chiave di partizione facoltativa, ma consigliata, che determina un limite della partizione logica per i dati correlati.Each container must define an optional, but recommended partition key property that determines a logical partition boundary for related data. Ogni vertice/arco deve possedere una proprietà id univoca per le entità all'interno del valore della chiave di partizione.Every vertex/edge must have an id property that is unique for entities within that partition key value. I dettagli sono descritti in Partitioning in Azure Cosmos DB (Partizionamento in Azure Cosmos DB).The details are covered in Partitioning in Azure Cosmos DB.

Le operazioni Gremlin funzionano senza problemi su dati a grafo che si estendono su più partizioni in Azure Cosmos DB.Gremlin operations work seamlessly across graph data that span multiple partitions in Azure Cosmos DB. Tuttavia, si consiglia di scegliere una chiave di partizione per i grafi che venga comunemente usata come filtro nelle query, abbia molti valori distinti e una frequenza di accesso a questi valori simile.However, it is recommended to choose a partition key for your graphs that is commonly used as a filter in queries, has many distinct values, and similar frequency of access these values.

Step di GremlinGremlin steps

Verranno ora esaminati gli step di Gremlin supportati da Azure Cosmos DB.Now let's look at the Gremlin steps supported by Azure Cosmos DB. Per informazioni complete su Gremlin, vedere TinkerPop reference (Riferimento a TinkerPop).For a complete reference on Gremlin, see TinkerPop reference.

stepstep DescrizioneDescription Documentazione TinkerPop 3.2TinkerPop 3.2 Documentation NoteNotes
addE Aggiunge un arco tra due verticiAdds an edge between two vertices addE stepaddE step
addV Aggiunge un vertice al grafoAdds a vertex to the graph addV stepaddV step
and Assicura che tutti gli attraversamenti restituiscono un valoreEnsures that all the traversals return a value and stepand step
as Modulatore di step per assegnare una variabile all'output di uno stepA step modulator to assign a variable to the output of a step as stepas step
by Modulatore di step usato con group e orderA step modulator used with group and order by stepby step
coalesce Restituisce il primo attraversamento che restituisce un risultatoReturns the first traversal that returns a result coalesce stepcoalesce step
constant Restituisce un valore costante.Returns a constant value. Usato con coalesceUsed with coalesce constant stepconstant step
count Restituisce il conteggio risultante dall'attraversamentoReturns the count from the traversal count stepcount step
dedup Restituisce i valori con i duplicati rimossiReturns the values with the duplicates removed dedup stepdedup step
drop Elimina i valori (vertice/arco)Drops the values (vertex/edge) drop stepdrop step
fold Si comporta come una barriera che calcola l'aggregazione di risultatiActs as a barrier that computes the aggregate of results fold stepfold step
group Raggruppa i valori in base alle etichette specificateGroups the values based on the labels specified group stepgroup step
has Usato per filtrare proprietà, vertici e archi.Used to filter properties, vertices, and edges. Supporta hasLabel, hasId, hasNot e le varianti has.Supports hasLabel, hasId, hasNot, and has variants. has stephas step
inject Inserisce i valori in un flussoInject values into a stream inject stepinject step
is Usato per eseguire un filtro con un'espressione booleanaUsed to perform a filter using a boolean expression is stepis step
limit Usato per limitare il numero di elementi nell'attraversamentoUsed to limit number of items in the traversal limit steplimit step
local Esegue il wrapping di una sezione di attraversamento, simile a una sottoqueryLocal wraps a section of a traversal, similar to a subquery local steplocal step
not Usato per produrre la negazione di un filtroUsed to produce the negation of a filter not stepnot step
optional Restituisce il risultato dell'attraversamento specificato se fornisce un risultato, in caso contrario restituisce l'elemento chiamanteReturns the result of the specified traversal if it yields a result else it returns the calling element optional stepoptional step
or Garantisce che almeno uno degli attraversamenti restituisca un valoreEnsures at least one of the traversals returns a value or stepor step
order Restituisce i risultati nell'ordinamento specificatoReturns results in the specified sort order order steporder step
path Restituisce il percorso completo dell'attraversamentoReturns the full path of the traversal path steppath step
project Proietta le proprietà come MappaProjects the properties as a Map project stepproject step
properties Restituisce le proprietà per le etichette specificateReturns the properties for the specified labels properties stepproperties step
range Filtra per l'intervallo di valori specificatoFilters to the specified range of values range steprange step
repeat Ripete lo step per il numero di volte specificato.Repeats the step for the specified number of times. Usato per eseguire i cicliUsed for looping repeat steprepeat step
sample Usato per campionare i risultati dell'attraversamentoUsed to sample results from the traversal sample stepsample step
select Usato per proiettare i risultati dell'attraversamentoUsed to project results from the traversal select stepselect step
store Usato per le aggregazioni non bloccanti risultanti dall'attraversamentoUsed for non-blocking aggregates from the traversal store stepstore step
tree Aggrega i percorsi da un vertice a una struttura ad alberoAggregate paths from a vertex into a tree tree steptree step
unfold Srotola un iteratore come stepUnroll an iterator as a step unfold stepunfold step
union Unisce i risultati di più attraversamentiMerge results from multiple traversals union stepunion 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 perIncludes the steps necessary for traversals between vertices and edges V, E, out, in, both, outE, inE, bothE, outV, inV, bothV, and otherV for vertex stepsvertex steps
where Usato per filtrare i risultati dell'attraversamento.Used to filter results from the traversal. Supporta eq, neq, lt, lte, gt, gte e gli operatori betweenSupports eq, neq, lt, lte, gt, gte, and between operators where stepwhere step

Il motore ottimizzato per la scrittura di Azure Cosmos DB supporta l'indicizzazione automatica di tutte le proprietà all'interno di vertici e archi per impostazione predefinita.Azure Cosmos DB's write-optimized engine supports automatic indexing of all properties within vertices and edges by default. Pertanto, query con filtri, query di intervallo, ordinamento o aggregazioni in qualsiasi proprietà vengono elaborati dall'indice e serviti in modo efficiente.Therefore, queries with filters, range queries, sorting, or aggregates on any property are processed from the index, and served efficiently. Per altre informazioni sul funzionamento dell'indicizzazione in Azure Cosmos DB, vedere il documento sull'indicizzazione senza schema.For more information on how indexing works in Azure Cosmos DB, see our paper on schema-agnostic indexing.

Passaggi successiviNext Steps