Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você 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 SLA (contrato de nível de serviço 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ê deseja implementar um grafo OLAP (processamento analítico online) ou migrar um aplicativo Apache Gremlin existente? Considere o Graph no contexto do Microsoft Fabric.
Azure Cosmos DB dá suporte à linguagem de travessia de grafo Apache Tinkerpop, conhecida como 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.
Azure Cosmos DB mecanismo de gráfico segue de perto a especificação de etapas de percurso do Apache TinkerPop, mas há diferenças na implementação que são específicas do 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 os drivers populares do Gremlin que você pode usar contra Azure Cosmos DB:
| Download | Source | Introdução | Versão do conector com suporte/recomendada |
|---|---|---|---|
| .NET | Gremlin.NET no GitHub | Crie Gráfico usando .NET | 3.4.13 |
| Java | Gremlin JavaDoc | Create Graph usando Java | 3.4.13 |
| Python | Gremlin-Python no GitHub | Crie 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 de Azure Cosmos DB não oferece suporte nem mantém a biblioteca. |
Note
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. Azure Cosmos DB fornece um banco de dados de grafo persistente, de alta simultaneidade e gravável que pode ser particionado em vários servidores ou clusters.
A tabela a seguir lista os recursos do TinkerPop implementados pelo Azure Cosmos DB:
| Categoria | Azure Cosmos DB implementação | 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, AdicionarPropriedade, RemoverPropriedade, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues | Dá suporte à criação, modificação e exclusão de propriedades do vértice |
| Recursos da borda | AdicionarArestas, RemoverArestas, IdsDeStrings, IdsFornecidosPeloUsuário, AdicionarPropriedade, RemoverPropriedade | Dá suporte à criação, modificação e exclusão de bordas |
| Recursos de propriedade da borda | Propriedades, 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
Azure Cosmos DB usa o formato JSON ao retornar resultados de operações do Gremlin. Azure Cosmos DB atualmente dá suporte ao formato JSON. Por exemplo, o snippet a seguir mostra uma representação JSON de um vértice retornado para o 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 | Description |
|---|---|
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 | Description |
|---|---|
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 | Description |
|---|---|
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 vamos examinar as etapas do Gremlin compatíveis com Azure Cosmos DB. Para obter uma referência completa sobre o Gremlin, consulte Referência do TinkerPop.
| etapa | Description | 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 |
executionProfile etapa |
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 com otimização de gravação fornecido pelo Azure Cosmos DB dá suporte à indexação automática de todas as propriedades dentro de 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 em Azure Cosmos DB, consulte nosso artigo sobre schema-agnostic indexing.
Diferenças de comportamento
- O mecanismo Azure Cosmos DB Graph executa a passagem primeiro em largura enquanto o TinkerPop Gremlin é primeiro em profundidade. Esse comportamento obtém um melhor desempenho em um sistema horizontalmente escalonável, como 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. Azure Cosmos DB Graph ainda não dá suporte a ele. 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,numberoutrue/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
GraphSONv2na 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.V()chamada 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 executionProfile() etapa do Gremlin.