Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Importante
Você está procurando uma solução de banco de dados para cenários de alta escala com um contrato de nível de serviço (SLA) de disponibilidade de 99.999%, dimensionamento automático instantâneo e failover automático em várias regiões? Considere Azure Cosmos DB para NoSQL.
Você está procurando implementar um gráfico de processamento analítico on-line (OLAP) ou migrar um aplicativo Apache Gremlin existente? Considere Graph em Microsoft Fabric.
Azure Cosmos DB suporta a linguagem de travessia de grafos 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.
Azure Cosmos DB motor Graph segue de perto a especificação de passos de travessia Apache TinkerPop mas existem diferenças na implementação específicas para 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 tabela seguinte mostra os drivers Gremlin populares que pode usar contra o Azure Cosmos DB:
| Download | Source | Introdução | Versão do conector suportada/recomendada |
|---|---|---|---|
| .NET | Gremlin.NET em GitHub | Criar grafo usando .NET | 3.4.13 |
| Java | Documentação JavaDoc do Gremlin | Criar grafo usando Java | 3.4.13 |
| Python | Gremlin-Python sobre GitHub | Create Graph usando 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 em GitHub | Criar Gráficos com Node.js | 3.4.13 |
| PHP | Gremlin-PHP em GitHub | Criar Gráficos com PHP | 3.1.0 |
| Vá Lang | Vá Lang | Esta biblioteca é construída por colaboradores externos. A equipa do Azure Cosmos DB não oferece qualquer suporte nem mantém a biblioteca. |
Observação
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 grafos persistente, de alta concorrência e gravável, que pode ser dividida em múltiplos servidores ou clusters.
A tabela seguinte lista as funcionalidades do TinkerPop implementadas pelo Azure Cosmos DB:
| Categoria | Azure Cosmos DB implementação | Notes |
|---|---|---|
| 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. |
| Características variáveis | Suporta Booleano, Inteiro, Byte, Duplo, Float, Long, String | Suporta tipos primitivos, é compatível com tipos complexos através do modelo de dados |
| Características de vértice | Suporta RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty | Suporta a criação, modificação e eliminação de vértices |
| Características de propriedades de vértice | StringIds, UserSuppliedIds, AdicionarPropriedade, RemoverPropriedade, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Suporta a criação, modificação e eliminação de propriedades de vértice |
| Funcionalidades de Edge | AdicionarArestas, RemoverArestas, StringIds, UserSuppliedIds, AdicionarPropriedade, RemoverPropriedade | Suporta a criação, modificação e eliminação de limites |
| Funcionalidades de propriedades de borda | Propriedades, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Suporta a criação, modificação e eliminação de propriedades de limites |
Formato de transmissão Gremlin
O Azure Cosmos DB utiliza o formato JSON ao devolver resultados das operações Gremlin. O Azure Cosmos DB suporta atualmente o formato JSON. Por exemplo, o seguinte excerto mostra uma representação JSON de um vértice retornado ao cliente a partir de 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 identificador do vértice. Deve ser único (em combinação com o valor de _partition , se aplicável). Se nenhum valor for fornecido, será automaticamente atribuído 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 saída 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
Agora vamos analisar os passos do Gremlin suportados pelo Azure Cosmos DB. Para obter referências completas do Gremlin, veja Referências do TinkerPop.
| etapa | 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 todos os percursos devolvem um valor | e passo |
as |
Um modulador de passos para atribuir uma variável ao resultado de um passo | como passo |
by |
Um modulador de passos utilizado com group e order |
passo a passo |
coalesce |
Devolve o primeiro percurso que produz um resultado | etapa de coalescência |
constant |
Devolve um valor constante. Utilizado com coalesce |
passo constant |
count |
Devolve a contagem do percurso | passo de contagem |
dedup |
Devolve os valores com os duplicados removidos | passo dedup |
drop |
Remove os valores (vértice/aresta) | passo de deslizamento |
executionProfile |
Cria uma descrição de todas as operações geradas pela etapa Gremlin executada |
executionProfile passo |
fold |
Atua como uma barreira que computa a soma dos resultados | passo fold |
group |
Agrupa os valores com base nas etiquetas especificadas | passo do grupo |
has |
Utilizado para filtrar propriedades, vértices e limites. Suporta variantes hasLabel, hasId, hasNot e has. |
tem passo |
inject |
Insere valores numa transmissão | passo de injeção |
is |
Utilizado para efetuar um filtro com uma expressão booleana | é passo |
limit |
Utilizado para limitar o número de itens no percurso | passo limit |
local |
A classe Local encapsula uma secção de um percurso, de forma semelhante a uma subconsulta. | passo local |
not |
Utilizado para produzir a negação de um filtro | não passo |
optional |
Ele devolve o resultado do percurso especificado se gerar um resultado, caso contrário, devolve o elemento que o chamou. | passo optional |
or |
Garante que pelo menos uma das transversais devolve um valor | ou passo |
order |
Devolve resultados na sequência de ordenação especificada | etapa do pedido |
path |
Devolve o caminho completo do percorrimento | etapa de caminho |
project |
Projeta as propriedades como um Mapa | passo do projeto |
properties |
Devolve as propriedades das etiquetas especificadas | passo propriedades |
range |
Filtra para o intervalo de valores especificado | passo da gama |
repeat |
Repete o passo o número de vezes especificado. Utilizado para criar ciclos | repetir passo |
sample |
Utilizado para amostrar resultados do percurso | passo amostra |
select |
Utilizado para projetar resultados do percurso | selecionar passo |
store |
Utilizado para agregações não bloqueantes da transversal | passo de armazenamento |
TextP.startingWith(string) |
Função de filtragem de cadeia de caracteres. Esta função é usada como um predicado no passo 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. 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 corresponder a uma propriedade na etapa has() que não termina com uma determinada sequência 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 a partir de um vértice numa árvore | passo de árvore |
unfold |
Desenrolar um iterador passo a passo | passo unfold |
union |
Agrupar resultados de múltiplos percursos | passo de união |
V |
Inclui os passos necessários para travessias entre vértices e arestas V, E, out, in, both, outE, inE, bothE, outV, inV, bothV e otherV |
passos de vértice |
where |
Utilizado para filtrar resultados do percurso. Suporta os operadores eq, neq, lt, lte, gt, gte e between |
onde passo |
O motor otimizado para escrita fornecido pelo Azure Cosmos DB suporta por defeito a indexação automática de todas as propriedades dentro dos vértices e arestas. 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 mais informações sobre como funciona a indexação em Azure Cosmos DB, consulte o nosso artigo sobre indexação agnóstica ao esquema.
Diferenças de comportamento
- Azure Cosmos DB motor Graph executa wideth-first enquanto o TinkerPop Gremlin é depth-first. Este comportamento alcança melhor desempenho em sistemas escaláveis horizontalmente 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 suporta isso. Utilize
GremlinClient.SubmitAsync()e transmita o percurso como uma cadeia de texto.property(set, 'xyz', 1)A cardinalidade definida não é suportada hoje. Utilizeproperty(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 propriedades
order().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, outrue/falsetipos.nullvalores não são suportados.O serializador GraphSONv3 não é suportado no momento. Use
GraphSONv2as classes Serializer, Reader e Writer na configuração de conexão. Os resultados devolvidos pelo Azure Cosmos DB para o Gremlin não têm o mesmo formato que o formato do 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 de travessia intermédias : Atualmente, apenas a primeira chamada de um percurso 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 Gremlin executionProfile() .