Suporte e compatibilidade de gráficos do Azure Cosmos DB para Gremlin com as funcionalidades do TinkerPop
APLICA-SE A: Gremlin
O Azure Cosmos DB suporta a linguagem transversal de grafos 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 motor do Graph do Azure Cosmos DB segue de perto a especificação dos passos do percurso do Apache TinkerPop , mas existem diferenças na implementação específicas do Azure Cosmos DB. Neste artigo, fornecemos instruções rápidas sobre o Gremlin e enumeramos as funcionalidades do Gremlin que são suportadas 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 |
Go Lang | Go Lang | Esta biblioteca é criada por contribuidores externos. A equipa do Azure Cosmos DB não oferece suporte nem mantém a biblioteca. |
Nota
As versões do controlador de cliente Gremlin para a versão 3.5.*, 3.6.* têm problemas de compatibilidade conhecidos, pelo que recomendamos que utilize as versões de controlador 3.4.* mais recentes suportadas listadas acima. Esta tabela será atualizada quando tiverem sido resolvidos problemas de compatibilidade para estas versões de controlador mais recentes.
Objetos de Grafo 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, Número Inteiro, Byte, Duplo, Flutuante, Longo, Cadeia | 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 utiliza o formato JSON ao devolver resultados das operações do Gremlin. Atualmente, o Azure Cosmos DB suporta o formato JSON. Por exemplo, o fragmento seguinte mostra uma representação JSON de um vértice devolvido ao cliente a partir 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 utilizadas pelo formato JSON para vértices são descritas abaixo:
Propriedade | Descrição |
---|---|
id |
O ID do vértice. Tem de ser exclusivo (em combinação com o valor de _partition se aplicável). Se não for fornecido nenhum valor, será fornecido automaticamente com um GUID |
label |
A etiqueta do vértice. Esta propriedade é utilizada 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. Utilizado para criação de partições de grafos. |
outE |
Esta propriedade contém uma lista de limites 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.
Propriedade | Descrição |
---|---|
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.
Propriedade | Descrição |
---|---|
id |
O ID do limite. Tem de ser exclusivo (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 extremidade. 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.
passo | Descrição | 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 pelo passo do Gremlin executado | executionProfile step (passo executionProfile) |
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 opcional |
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 cadeias. Esta função é utilizada como predicado para que o has() passo corresponda a uma propriedade com o início de uma determinada cadeia |
Predicados de TextP |
TextP.endingWith(string) |
Função de filtragem de cadeias. Esta função é utilizada como predicado para que o has() passo corresponda a uma propriedade com o fim de uma determinada cadeia |
Predicados de TextP |
TextP.containing(string) |
Função de filtragem de cadeias. Esta função é utilizada como predicado para que o has() passo corresponda a uma propriedade com o conteúdo de uma determinada cadeia de carateres |
Predicados de TextP |
TextP.notStartingWith(string) |
Função de filtragem de cadeias. Esta função é utilizada como predicado para que o has() passo corresponda a uma propriedade que não começa com uma determinada cadeia |
Predicados de TextP |
TextP.notEndingWith(string) |
Função de filtragem de cadeias. Esta função é utilizada como predicado para que o has() passo corresponda a uma propriedade que não termina com uma determinada cadeia |
Predicados de TextP |
TextP.notContaining(string) |
Função de filtragem de cadeias. Esta função é utilizada como predicado para que o has() passo corresponda a uma propriedade que não contém uma determinada cadeia |
Predicados de 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 motor do Graph do Azure Cosmos DB executa o primeiro percurso de amplitude , enquanto o TinkerPop Gremlin é de profundidade. Este comportamento obtém um melhor desempenho num sistema horizontalmente dimensionável, como o Azure Cosmos DB.
Funcionalidades não suportadas
O Gremlin Bytecode é uma especificação agnóstica de linguagem de programação para percursos de grafos. O Graph do Azure Cosmos DB ainda não o suporta. Utilize
GremlinClient.SubmitAsync()
e transmita o percurso como uma cadeia de texto.property(set, 'xyz', 1)
definir cardinalidade não é suportado hoje. Em vez disso, utilizeproperty(list, 'xyz', 1)
. Para saber mais, veja Propriedades de vértice com o TinkerPop.O
match()
passo não está atualmente disponível. Este passo fornece capacidades de consulta declarativas.Os objetos como propriedades em vértices ou arestas não são suportados. As propriedades apenas podem ser matrizes ou tipos primitivos.
Ordenar por propriedades
order().by(<array property>)
de matriz não é suportado. A ordenação é suportada apenas por tipos primitivos.Os tipos JSON não primitivos não são suportados. Utilize
string
,number
outrue
/false
tipos.null
os valores não são suportados.O serializador GraphSONv3 não é atualmente suportado. Utilize
GraphSONv2
as classes Serializer, Reader e Writer na configuração da ligação. Os resultados devolvidos pelo Azure Cosmos DB para Gremlin não têm o mesmo formato que o formato GraphSON.As expressões e funções lambda não são atualmente suportadas. Isto inclui as
.map{<expression>}
funções , ,.by{<expression>}
e as.filter{<expression>}
funções. Para saber mais e aprender a reescrevê-los com os passos do Gremlin, consulte A Note on Lambdas (Uma Nota sobre Lambdas).As transações não são suportadas devido à natureza distribuída do sistema. Configure o modelo de consistência adequado na conta do Gremlin para "ler as suas próprias escritas" e utilize a simultaneidade otimista para resolver escritas em conflito.
Limitações conhecidas
- Utilização do índice para consultas do Gremlin com passos intermédios
.V()
: atualmente, apenas a primeira.V()
chamada de um percurso utilizará o índice para resolver quaisquer filtros ou predicados ligados ao mesmo. As chamadas subsequentes não consultarão o índice, o que poderá aumentar a latência e o custo da consulta.
Assumindo a indexação predefinida, uma consulta gremlin de leitura típica que começa com o .V()
passo utilizaria parâmetros nos passos de filtragem anexados, 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 um .V()
passo é incluído na consulta do Gremlin, a resolução dos dados da consulta poderá não ser ideal. Veja a seguinte consulta como exemplo:
g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')
Esta consulta devolverá dois grupos de vértices com base na respetiva propriedade denominada category
. Neste caso, apenas a primeira chamada utilizará g.V().has('category', 'A')
o índice para resolver os vértices com base nos valores das respetivas propriedades.
Uma solução para esta consulta é utilizar passos 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'))
Pode rever o desempenho das consultas com o passo GremlinexecutionProfile()
.
Passos seguintes
- Comece a criar uma aplicação de gráficos com os nossos SDKs
- Saiba mais sobre o suporte de gráficos no Azure Cosmos DB