Suporte e compatibilidade de grafo do Azure Cosmos DB para Gremlin com recursos do TinkerPop
APLICA-SE AO: Gremlin
Azure Cosmos DB suporta a linguagem transversal de gráficos Apache Tinkerpop, conhecida como gráfica Gremlin. É possível usar a linguagem Gremlin para criar entidades de grafo (vértices e bordas), modificar propriedades dentro dessas entidades, executar consultas e passagens e excluir entidades.
O mecanismo de grafo do Azure Cosmos DB segue estreitamente 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 instruções passo a passo rápidas do Gremlin e enumeramos os recursos do Gremlin compatíveis com a API para Gremlin.
Bibliotecas de cliente compatíveis
A tabela a seguir mostra drivers Gremlin populares que você pode usar com o BD Cosmos do Azure:
Baixar | Fonte | Introdução | Versão do conector com suporte/recomendada |
---|---|---|---|
.NET | Gremlin.NET no GitHub | Criar Grafo usando .NET | 3.4.13 |
Java | Gremlin JavaDoc | Criar Grafo usando Java | 3.4.13 |
Python | Gremlin-Python no GitHub | Criar Grafo usando Python | 3.4.13 |
Console do Gremlin | Documentos do TinkerPop | Criar Grafo usando Console do Gremlin | 3.4.13 |
Node.js | Gremlin-JavaScript no GitHub | Criar Grafo usando Node.js | 3.4.13 |
PHP | Gremlin-PHP no GitHub | Criar Grafo usando PHP | 3.1.0 |
Linguagem Go | Linguagem Go | Essa biblioteca foi criada por colaboradores externos. A equipe do Azure Cosmos DB não oferece suporte nem manutenção à biblioteca. |
Observação
As versões do driver do cliente Gremlin para 3.5.* e 3.6.* têm problemas de compatibilidade conhecidos, portanto, recomendamos usar as últimas versões do driver 3.4.* com suporte listadas acima. Essa tabela será atualizada quando os problemas de compatibilidade forem resolvidos nessas versões mais recentes do driver.
Suporte para objetos de gráficos
O TinkerPop é um padrão que abrange uma ampla variedade de tecnologias de grafo. Portanto, ele tem uma terminologia padrão para descrever quais recursos são fornecidos por um provedor de grafo. O Azure Cosmos DB fornece um banco de dados de grafo gravável, persistente e de alta simultaneidade que pode ser particionado em vários servidores ou clusters.
A tabela a seguir lista os recursos do TinkerPop que são implementados pelo BD Cosmos do Azure:
Categoria | Implementação do BD Cosmos do Azure | Observações |
---|---|---|
Recursos de grafo | Fornece persistência e ConcurrentAccess. Projetado para dar suporte a Transactions | Métodos de computador podem ser implementados por meio do conector Spark. |
Recursos variáveis | Dá suporte a Boolean, Integer, Byte, Double, Float, Long, String | Dá suporte a tipos primitivos, é compatível com tipos complexos por meio do modelo de dados |
Recursos do vértice | Dá suporte a RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty | Dá suporte à criação, modificação e exclusão de vértices |
Recursos de propriedade do vértice | StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Dá suporte à criação, modificação e exclusão de propriedades do vértice |
Recursos da borda | AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty | Dá suporte à criação, modificação e exclusão de bordas |
Recursos de propriedade da borda | Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Dá suporte à criação, modificação e exclusão de propriedades da borda |
Formato de transmissão do Gremlin
O Azure Cosmos DB usa o formato JSON ao retornar resultados de operações do Gremlin. No momento, o Azure Cosmos DB é compatível com o formato JSON. Por exemplo, o snippet de código a seguir mostra uma representação em 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:
Propriedade | Descrição |
---|---|
id |
A ID do vértice. Deve ser exclusiva (em combinação com o valor de _partition , se aplicável). Se nenhum valor for fornecido, ele será automaticamente fornecido com um GUID |
label |
O rótulo do vértice. Esta propriedade é usada para descrever o tipo de entidade. |
type |
Usado para distinguir vértices de documentos que não são grafos |
properties |
Recipiente de propriedades definidas pelo usuário associadas ao vértice. Cada propriedade pode ter vários valores. |
_partition |
A chave de partição do vértice. Usado para particionamento de gráfico. |
outE |
Essa propriedade contém uma lista de bordas externas de um vértice. Armazenar as informações de adjacência com o vértice permite a execução rápida de passagens. As bordas são agrupadas com base em seus rótulos. |
Cada propriedade pode armazenar diversos valores em uma matriz.
Propriedade | Descrição |
---|---|
value |
O valor da propriedade |
E a borda contém as seguintes informações para ajudar com a navegação para outras partes do grafo.
Propriedade | Descrição |
---|---|
id |
A ID da borda. Deve ser exclusiva (em combinação com o valor de _partition , se aplicável) |
label |
O rótulo da borda. Esta propriedade é opcional e é usada para descrever o tipo de relacionamento. |
inV |
Ela contém uma lista nos vértices de uma borda. Armazenar as informações de adjacência com a borda permite a execução rápida das passagens. Os vértices são agrupados com base em seus rótulos. |
properties |
Recipiente de propriedades definidas pelo usuário associadas à borda. |
Etapas do Gremlin
Agora, vejamos as etapas do Gremlin com suporte do BD Cosmos do Azure. Para obter uma referência completa sobre o Gremlin, consulte Referência do TinkerPop.
Etapa | Descrição | Documentação do TinkerPop 3.2 |
---|---|---|
addE |
Adiciona uma borda entre dois vértices | Etapa addE |
addV |
Adiciona um vértice ao grafo | Etapa addV |
and |
Garante que todas as passagens retornem um valor | e uma etapa |
as |
Um modulador de etapa para atribuir uma variável à saída de uma etapa | Etapa as |
by |
Um modulador de etapa usado com group e order |
Etapa by |
coalesce |
Retorna a primeira passagem que retorna um resultado | Etapa coalesce |
constant |
Retorna um valor constante. Usada com coalesce |
Etapa constant |
count |
Retorna a contagem da passagem | Etapa count |
dedup |
Retorna os valores com as duplicatas removidas | Etapa dedup |
drop |
Remove os valores (vértice/borda) | Etapa drop |
executionProfile |
Cria uma descrição de todas as operações gerada pela etapa executada Gremlin | etapa executionProfile |
fold |
Atua como uma barreira que calcula o valor agregado dos resultados | Etapa fold |
group |
Agrupa os valores com base nos rótulos especificados | Etapa group |
has |
Usada para filtrar propriedades, vértices e bordas. Dá suporte às variantes hasLabel , hasId , hasNot e has . |
Etapa has |
inject |
Insere valores em um fluxo | Etapa inject |
is |
Usada para executar um filtro usando uma expressão booliana | Etapa is |
limit |
Usada para limitar o número de itens na passagem | Etapa limit |
local |
A etapa local encapsula uma seção de uma passagem, de forma semelhante a uma subconsulta | Etapa local |
not |
Usada para produzir a negação de um filtro | Etapa not |
optional |
Retorna o resultado da passagem especificada se ela produzir um resultado. Caso contrário, retorna o elemento de chamada | Etapa optional |
or |
Garante que pelo menos uma das passagens retorne um valor | Etapa or |
order |
Retorna os resultados na ordem de classificação especificada | Etapa order |
path |
Retorna o caminho completo da passagem | Etapa path |
project |
Projeta as propriedades como um mapa | Etapa project |
properties |
Retorna as propriedades para os rótulos especificados | Etapa properties |
range |
Filtra para o intervalo de valores especificado | Etapa range |
repeat |
Repete a etapa o número de vezes especificado. Usada para efetuar loop | Etapa repeat |
sample |
Usada para fazer a amostragem dos resultados da passagem | Etapa sample |
select |
Usada para projetar resultados da passagem | Etapa select |
store |
Usada para agregações sem bloqueio da passagem | Etapa store |
TextP.startingWith(string) |
Função de filtragem de cadeia de caracteres. Essa função é usada como um predicado para a etapa has() para corresponder 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. Essa função é usada como um predicado para a etapa has() 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. Essa função é usada como um predicado para a etapa has() 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 etapa has() para corresponder 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. Essa função é usada como um predicado para a etapa has() para corresponder 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. Essa função é usada como um predicado para a etapa has() para corresponder uma propriedade que não contém uma determinada cadeia de caracteres |
Predicados TextP |
tree |
Agrega os caminhos de um vértice em uma árvore | Etapa tree |
unfold |
Desenrola um iterador como uma etapa | Etapa unfold |
union |
Mescla resultados de várias passagens | Etapa union |
V |
Inclui as etapas necessárias para passagens entre vértices e bordas V , E , out , in , both , outE , inE , bothE , outV , inV , bothV e otherV para |
Etapa vertex |
where |
Usada para filtrar os resultados da passagem. Dá suporte aos operadores eq , neq , lt , lte , gt , gte e between |
Etapa where |
O mecanismo otimizado para gravação do Azure Cosmos DB dá suporte à indexação automática de todas as propriedades dentro dos vértices e bordas por padrão. Sendo assim, consultas com filtros, consultas de intervalo, classificações ou agregações de qualquer propriedade são processadas no índice e atendidas de modo eficiente. Para obter mais informações sobre como a indexação funciona no BD Cosmos do Azure, consulte nosso artigo sobre Indexação independente do esquema.
Diferenças de comportamento
- O mecanismo de grafo do Azure Cosmos DB executa a travessia do balanceamento em largura, enquanto o Gremlin do TinkerPop é de balanceamento em profundidade. Esse comportamento atinge um melhor desempenho no sistema escalonável horizontalmente como o Azure Cosmos DB.
Recursos sem suporte
Código de bytes do Gremlin é uma especificação independente da linguagem de programação para passagens de gráfico. O grafo do Azure Cosmos DB ainda não dá suporte a isso. Use
GremlinClient.SubmitAsync()
e envie a travessia como uma cadeia de caracteres de texto.Não há suporte à definição da cardinalidade
property(set, 'xyz', 1)
no momento. Useproperty(list, 'xyz', 1)
em seu lugar. Para saber mais, confira Propriedades de vértice com TinkerPop.A
match()
etapa não está disponível no momento. Esta etapa fornece funcionalidades de consulta declarativa.Não há suporte para objetos como propriedades nos vértices ou bordas. As propriedades somente podem ser tipos primitivos ou matrizes.
Não há suporte à classificação por propriedades de matriz
order().by(<array property>)
. É possível classifica apenas por tipos primitivos.Não há suporte a tipos JSON não primitivos. Use os tipos
string
,number
outrue
/false
. Não há suporte para valoresnull
.No momento, não há suporte para o serializador GraphSONv3. Use as classes de Serializador, Leitor e Gravador
GraphSONv2
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 as expressões e funções lambda. Isso inclui as funções
.map{<expression>}
,.by{<expression>}
e.filter{<expression>}
. Para saber mais e aprender a reescrevê-las usando as etapas do Gremlin, confira Uma observação sobre Lambdas.Não há suporte a Transações devido à natureza distribuída do sistema. Configure o modelo de consistência apropriado na conta do Gremlin para "ler as próprias gravações" e use a simultaneidade otimista para resolver as gravações conflitantes.
Limitações conhecidas
- Utilização de índice para consultas do Gremlin com etapas de
.V()
meia travessia: No momento, somente a primeira chamada.V()
de travessia usará o índice para resolver filtros ou predicados anexados a ela. As chamadas subsequentes não consultarão o índice, o que pode aumentar a latência e o custo da consulta.
Pressupondo a indexação padrão, uma consulta do Gremlin de leitura típica que começa com a etapa .V()
usaria parâmetros nas 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 etapa .V()
é incluída na consulta do Gremlin, a resolução dos dados para a consulta pode não ser ideal. Use a seguinte consulta como um exemplo:
g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')
Essa consulta retornará dois grupos de vértices com base na propriedade deles chamada category
. Nesse caso, somente a primeira chamada, g.V().has('category', 'A')
, fará uso do índice para resolver os vértices com base nos valores das propriedades deles.
Uma solução alternativa para essa consulta é usar etapas de subtravessia como .map()
e union()
. Isso é 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 examinar o desempenho das consultas usando a etapa executionProfile()
do Gremlin.
Próximas etapas
- Comece a compilar um aplicativo de grafo usando nossos SDKs
- Para saber mais sobre o suporte para grafo no Azure Cosmos DB