Partilhar via


Suporte ao gráfico do Azure Cosmos DB for Gremlin e compatibilidade com os recursos do TinkerPop

APLICA-SE A: Gremlin

O Azure Cosmos DB suporta a linguagem de travessia gráfica do Apache Tinkerpop, conhecida como Gremlin. Pode utilizar a linguagem Gremlin para criar entidades de gráfico (vértices e limites), modificar propriedades nessas entidades, efetuar consultas e transversais e eliminar entidades.

O mecanismo do Azure Cosmos DB Graph segue de perto a especificação de etapas de travessia do Apache TinkerPop , mas há diferenças na implementação que são específicas para o Azure Cosmos DB. Neste artigo, fornecemos um passo a passo rápido do Gremlin e enumeramos os recursos do Gremlin que são suportados pela API para Gremlin.

Bibliotecas de cliente compatíveis

A seguinte tabela mostra controladores Gremlin populares que pode utilizar com o Azure Cosmos DB:

Download Origem Introdução Versão do conector suportada/recomendada
.NET Gremlin.NET no GitHub Criar Gráficos com .NET 3.4.13
Java Documentação JavaDoc do Gremlin Criar Gráficos com Java 3.4.13
Python Gremlin-Python no GitHub Criar Gráficos com Python 3.4.13
Consola do Gremlin Documentação do TinkerPop Criar Gráficos na Consola do Gremlin 3.4.13
Node.js Gremlin-JavaScript no GitHub Criar Gráficos com Node.js 3.4.13
PHP Gremlin-PHP no GitHub Criar Gráficos com PHP 3.1.0
Vá Lang Vá Lang Esta biblioteca é construída por colaboradores externos. A equipe do Azure Cosmos DB não oferece suporte nem mantém a biblioteca.

Nota

As versões do driver do cliente Gremlin para 3.5.*, 3.6.* têm problemas de compatibilidade conhecidos, por isso recomendamos o uso das últimas versões de driver 3.4.* suportadas listadas acima. Esta tabela será atualizada quando problemas de compatibilidade tiverem sido resolvidos para essas versões de driver mais recentes.

Objetos gráficos suportados

O TinkerPop é um padrão que abrange uma grande variedade de tecnologias de gráficos. Portanto, tem terminologia padrão para descrever as funcionalidades disponibilizadas pelo fornecedor de gráficos. O Azure Cosmos DB fornece uma base de dados de gráficos gravável, de alta simultaneidade e persistente que pode ser dividida em múltiplos servidores ou clusters.

A tabela seguinte indica as funcionalidades do TinkerPop implementadas pelo Azure Cosmos DB:

Categoria Implementação do Azure Cosmos DB Notas
Funcionalidades de gráficos Fornece Persistência e Acesso em Simultâneo. Concebido para suportar Transações Os métodos de computador podem ser implementados através do conector do Spark.
Funcionalidades de variável Suporta Booleano, Inteiro, Byte, Duplo, Float, Long, String Suporta tipos primitivos, é compatível com tipos complexos através do modelo de dados
Funcionalidades de vértice Suporta RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Suporta a criação, modificação e eliminação de vértices
Funcionalidades de propriedade de vértice StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Suporta a criação, modificação e eliminação de propriedades de vértice
Funcionalidades de limite AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Suporta a criação, modificação e eliminação de limites
Funcionalidades de propriedades de limites Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues Suporta a criação, modificação e eliminação de propriedades de limites

Formato de fio Gremlin

O Azure Cosmos DB usa o formato JSON ao retornar resultados de operações Gremlin. Atualmente, o Azure Cosmos DB dá suporte ao formato JSON. Por exemplo, o trecho a seguir mostra uma representação JSON de um vértice retornado ao cliente do 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
        }
      ]
    }
  }

As propriedades usadas pelo formato JSON para vértices são descritas abaixo:

Property Description
id O ID do vértice. Deve ser único (em combinação com o valor de _partition , se aplicável). Se nenhum valor for fornecido, ele será automaticamente fornecido com um GUID
label A etiqueta do vértice. Esta propriedade é usada para descrever o tipo de entidade.
type É utilizado para distinguir vértices de documentos que não são gráficos
properties Conjunto de propriedades definidas pelo utilizador associadas ao vértice. Cada propriedade tem múltiplos valores.
_partition A chave de partição do vértice. Usado para particionamento de gráficos.
outE Esta propriedade contém uma lista de arestas de um vértice. Armazenar a informação de contiguidade com o vértice permite uma execução rápida das transversais. Os limites são agrupados com base nas etiquetas.

Cada propriedade pode armazenar múltiplos valores numa matriz.

Property Description
value O valor da propriedade

O limite contém a seguinte informação para ajudar com a navegação para outras partes do gráfico.

Property Description
id O ID do limite. Deve ser único (em combinação com o valor de _partition , se aplicável)
label A etiqueta do limite. Esta propriedade é opcional e é utilizada para descrever o tipo de relação.
inV Esta propriedade contém uma lista de vértices para uma aresta. Armazenar as informações de contiguidade com o limite permite uma execução rápida das transversais. Os vértices são agrupados com base nas etiquetas.
properties Conjunto de propriedades definidas pelo utilizador associadas ao limite.

Passos do Gremlin

Vamos observar os passos do Gremlin suportados pelo Azure Cosmos DB. Para obter referências completas do Gremlin, veja Referências do TinkerPop.

step Description Documentação do TinkerPop 3.2
addE Adiciona um limite entre dois vértices passo addE
addV Adiciona um vértice ao gráfico passo addV
and Garante que todas as transversais devolvem um valor passo and
as Um modulador de passos para atribuir uma variável ao resultado de um passo passo as
by Um modulador de passos utilizado com group e order passo by
coalesce Devolve a primeira transversal que devolve um resultado passo coalesce
constant Devolve um valor constante. Utilizado com coalesce passo constant
count Devolve a contagem da transversal passo count
dedup Devolve os valores com os duplicados removidos passo dedup
drop Ignora os valores (vértice/limite) passo drop
executionProfile Cria uma descrição de todas as operações geradas pela etapa Gremlin executada executionEtapa do perfil
fold Age como uma barreira que calcula a agregação de resultados passo fold
group Agrupa os valores com base nas etiquetas especificadas passo group
has Utilizado para filtrar propriedades, vértices e limites. Suporta variantes hasLabel, hasId, hasNot e has. passo has
inject Insere valores numa transmissão passo inject
is Utilizado para efetuar um filtro com uma expressão booleana passo is
limit Utilizado para limitar o número de itens na transversal passo limit
local Encapsula uma secção de uma transversal, da mesma forma que uma subconsulta passo local
not Utilizado para produzir a negação de um filtro passo not
optional Devolve o resultado da transversal especificada se gerar um resultado, caso contrário, devolve o elemento de chamada passo optional
or Garante que pelo menos uma das transversais devolve um valor passo or
order Devolve resultados na sequência de ordenação especificada passo order
path Devolve o caminho completo da transversal passo path
project Projeta as propriedades como um Mapa passo project
properties Devolve as propriedades das etiquetas especificadas passo properties
range Filtra o intervalo especificado de valores passo range
repeat Repete o passo o número de vezes especificado. Utilizado para criar ciclos passo repeat
sample Utilizado para exemplificar resultados da transversal passo sample
select Utilizado para projetar resultados da transversal passo select
store Utilizado para agregações que não sejam de bloqueio da transversal passo store
TextP.startingWith(string) Função de filtragem de cadeia de caracteres. Esta função é usada como um predicado para a has() etapa corresponder a uma propriedade com o início de uma determinada cadeia de caracteres Predicados TextP
TextP.endingWith(string) Função de filtragem de cadeia de caracteres. Esta função é usada como um predicado para a has() etapa para corresponder uma propriedade com o final de uma determinada cadeia de caracteres Predicados TextP
TextP.containing(string) Função de filtragem de cadeia de caracteres. Esta função é usada como um predicado para a has() etapa para corresponder uma propriedade com o conteúdo de uma determinada cadeia de caracteres Predicados TextP
TextP.notStartingWith(string) Função de filtragem de cadeia de caracteres. Essa função é usada como um predicado para a has() etapa corresponder a uma propriedade que não começa com uma determinada cadeia de caracteres Predicados TextP
TextP.notEndingWith(string) Função de filtragem de cadeia de caracteres. Esta função é usada como um predicado para a has() etapa corresponder a uma propriedade que não termina com uma determinada cadeia de caracteres Predicados TextP
TextP.notContaining(string) Função de filtragem de cadeia de caracteres. Esta função é usada como um predicado para a has() etapa corresponder a uma propriedade que não contém uma determinada cadeia de caracteres Predicados TextP
tree Agrega caminhos de um vértice numa árvore passo tree
unfold Mostra um iterador como um passo passo unfold
union Intercala resultados de múltiplas transversais passo union
V Inclui os passos necessários para transversais entre vértices e limites V, E, out, in, both, outE, inE, bothE, outV, inV, bothV e otherV passos vertex
where Utilizado para filtrar resultados da transversal. Suporta os operadores eq, neq, lt, lte, gt, gte e between passo where

O motor otimizado para escrita fornecido pelo Azure Cosmos DB suporta a indexação automática de todas as propriedades nos vértices e limites por predefinição. Portanto, as consultas com filtros, as consultas de intervalo, a ordenação ou as agregações em qualquer propriedade são processadas no índice e fornecidas de forma eficiente. Para obter mais informações sobre como a indexação funciona no Azure Cosmos DB, veja a nossa documentação sobre indexação sem esquema.

Diferenças de comportamento

  • O mecanismo do Azure Cosmos DB Graph executa a primeira travessia ampla, enquanto o TinkerPop Gremlin é o primeiro a profundidade. Esse comportamento alcança um melhor desempenho em sistemas horizontalmente escalonáveis, como o Azure Cosmos DB.

Funcionalidades não suportadas

  • Gremlin Bytecode é uma especificação agnóstica de linguagem de programação para percursos em gráfico. O Azure Cosmos DB Graph ainda não oferece suporte a ele. Utilize GremlinClient.SubmitAsync() e transmita o percurso como uma cadeia de texto.

  • property(set, 'xyz', 1) A cardinalidade definida não é suportada hoje. Utilize property(list, 'xyz', 1) em substituição. Para saber mais, consulte Propriedades Vertex com TinkerPop.

  • A match() etapa não está disponível no momento. Esta etapa fornece recursos de consulta declarativa.

  • Não há suporte para objetos como propriedades em vértices ou bordas. As propriedades apenas podem ser matrizes ou tipos primitivos.

  • Não há suporte para classificação por propriedadesorder().by(<array property>) de matriz. A ordenação é suportada apenas por tipos primitivos.

  • Não há suporte para tipos JSON não primitivos . Use string, number, ou true/false tipos. null valores não são suportados.

  • O serializador GraphSONv3 não é suportado no momento. Use GraphSONv2 as classes Serializer, Reader e Writer na configuração de conexão. Os resultados retornados pelo Azure Cosmos DB para Gremlin não têm o mesmo formato que o formato GraphSON.

  • Atualmente, não há suporte para expressões e funções do Lambda. Isso inclui o .map{<expression>}, o .by{<expression>}, e as .filter{<expression>} funções. Para saber mais e como reescrevê-los usando as etapas de Gremlin, consulte Uma nota sobre o Lambdas.

  • As transações não são suportadas devido à natureza distribuída do sistema. Configure o modelo de consistência apropriado na conta Gremlin para "ler suas próprias gravações" e use simultaneidade otimista para resolver gravações conflitantes.

Limitações conhecidas

  • Utilização do índice para consultas Gremlin com etapas intermediárias.V(): Atualmente, apenas a primeira .V() chamada de uma travessia fará uso do índice para resolver quaisquer filtros ou predicados anexados a ele. As chamadas subsequentes não consultarão o índice, o que poderá aumentar a latência e o custo da consulta.

Supondo a indexação padrão, uma consulta Gremlin de leitura típica que começa com a .V() etapa usaria parâmetros em suas etapas de filtragem anexadas, como .has() ou .where() para otimizar o custo e o desempenho da consulta. Por exemplo:

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

No entanto, quando mais de uma .V() etapa é incluída na consulta Gremlin, a resolução dos dados para a consulta pode não ser ideal. Tome a seguinte consulta como exemplo:

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

Esta consulta retornará dois grupos de vértices com base em sua propriedade chamada category. Neste caso, apenas a primeira chamada, g.V().has('category', 'A') fará uso do índice para resolver os vértices com base nos valores de suas propriedades.

Uma solução alternativa para essa consulta é usar etapas subtraversais como .map() e union(). Isto é exemplificado abaixo:

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

Você pode revisar o desempenho das consultas usando a etapa GremlinexecutionProfile().

Próximos passos