As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Conformidade com os padrões do Gremlin no Amazon Neptune
As seções a seguir fornecem uma visão geral da implementação do Gremlin no Neptune e como ela difere da implementação do Apache. TinkerPop
O Neptune implementa algumas etapas do Gremlin de forma nativa em seu mecanismo e usa a implementação do Apache TinkerPop Gremlin para processar outras (consulte). Suporte nativo para etapas do Gremlin no Amazon Neptune
nota
Para obter exemplos concretos dessas diferenças de implementação mostradas no console do Gremlin e no Amazon Neptune, consulte a seção Usar o Gremlin para acessar os dados de grafo no Amazon Neptune do Quick Start.
Tópicos
Padrões aplicáveis para Gremlin
A linguagem Gremlin é definida pela TinkerPop documentação do Apache
e pela TinkerPop implementação do Gremlin pelo Apache, e não por uma especificação formal. Para formatos numéricos, o Gremlin segue o padrão IEEE 754 (IEEE 754-2019 - Padrão IEEE para Aritmética). Floating-Point
Para obter mais informações, consulte também a página IEEE 754 da Wikipedia).
Variáveis e parâmetros em scripts
Quando se trata de variáveis pré-vinculadas, o objeto transversal g está Pre-bound em Netuno e o graph objeto não é suportado.
Embora o Neptune não seja compatível com variáveis do Gremlin nem com a parametrização em scripts, é possível encontrar exemplos de scripts para o Gremlin Server na Internet que contêm declarações de variáveis, como:
String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();
Também há muitos exemplos que usam parametrização
Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();
Os exemplos de parâmetro geralmente são associados a avisos sobre penalidades de desempenho por não parametrizar quando possível. Existem muitos exemplos desse tipo TinkerPop que você pode encontrar, e todos parecem bastante convincentes sobre a necessidade de parametrizar.
No entanto, tanto o recurso de declarações de variáveis quanto o recurso de parametrização (junto com os avisos) só se aplicam ao Gremlin Server quando TinkerPop ele está usando o. GremlinGroovyScriptEngine Eles não se aplicam quando o Gremlin Server usa a gramática gremlin-language ANTLR do Gremlin para analisar consultas. A gramática ANTLR não aceita declarações de variáveis nem parametrização, portanto, ao usar o ANTLR, você não precisa se preocupar em deixar de parametrizar. Como a gramática ANTLR é um componente mais recente TinkerPop, o conteúdo mais antigo que você pode encontrar na Internet geralmente não reflete essa distinção.
O Neptune usa a gramática ANTLR no mecanismo de processamento de consultas em vez do GremlinGroovyScriptEngine, portanto, não é compatível com variáveis, parametrização nem com a propriedade bindings. Como resultado, os problemas relacionados à falha na parametrização não se aplicam ao Neptune. Usando o Neptune, é perfeitamente seguro simplesmente enviar a consulta como está, onde normalmente seria parametrizada. Como resultado, o exemplo anterior pode ser simplificado sem penalidades de desempenho da seguinte forma:
String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();
Execução do script
O mecanismo Gremlin do Neptune analisa consultas usando a gramática ANTLR. TinkerPop gremlin-language Ele não executa um GremlinGroovyScriptEngine (como fazem algumas implantações do TinkerPop-based Gremlin Server), então os scripts enviados ao Neptune devem conter somente a linguagem Gremlin, e não códigos Groovy ou Java arbitrários.
Os scripts podem ser enviados para o Neptune de várias maneiras, como por meio do endpoint REST do Gremlin, do console do Gremlin ou por meio de drivers de TinkerPop linguagem (por exemplo, o cliente de script do driver Java).
É importante não confundir a linguagem Gremlin em si com o açúcar sintático ou as funções de uso geral de qualquer linguagem de programação que você possa ter visto agrupando exemplos de Gremlin em outros lugares. Quando esse código aparece em TinkerPop tutoriais ou amostras on-line, ele depende de um tempo de execução do Groovy ou do Java que o Neptune não fornece.
Importante
Tudo nesta seção se aplica aos envios de texto do Gremlin. Os envios de bytecode GLV (Gremlin Language Variant) criados em uma linguagem hospedeira como Java, Python ou.NET não estão sujeitos a essas restrições, pois o construtor de travessia da linguagem host produz bytecode que o mecanismo do Neptune consome diretamente.
O que um script pode conter
-
Todas as consultas devem começar com
g, o objeto de percurso. -
Várias travessias podem ser emitidas em um único envio separado por um ponto e vírgula (
;) ou um caractere de nova linha ().\nCada instrução, exceto a última, deve terminar com uma.iterate()etapa a ser executada; somente os dados da travessia final são retornados.
Referenciando valores de TinkerPop enumeração
Onde um valor de TinkerPop enumeração é esperado como um argumento de etapa (por exemplo, uma cardinalidade ativada property() ou uma ordem ativaby()), use os valores de formato curto reconhecidos pela gramática ANTLR. O Neptune não resolve nomes de classes Java totalmente qualificados nessa posição — por exemplo, não org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single é aceito; use single em vez disso.
A tabela a seguir lista os valores abreviados permitidos e a TinkerPop classe subjacente à qual cada um pertence.
| Valores permitidos | Classe |
|---|---|
id, key, label, value |
|
T.id, T.key, T.label, T.value |
|
set, single |
org.apache.tinkerpop.gremlin.structure. VertexProperty.Cardinality |
asc, desc, shuffle |
|
Order.asc, Order.desc, Order.shuffle |
|
global, local |
|
Scope.global, Scope.local |
|
all, first, last, mixed |
|
normSack |
org.apache.tinkerpop.gremlin.process.traversal. SackFunctions.Barrier |
addAll, and, assign, div,
max, min, minus, mult,
or, sum, sumLong |
|
keys, values |
|
BOTH, IN, OUT |
|
any, none |
org.apache.tinkerpop.gremlin.process.traversal.step. TraversalOptionParent.Pick |
O que um script pode não conter
Os itens a seguir não são suportados em consultas de cadeia de texto do Gremlin ao Neptune, porque dependem do suporte ao Groovy ou ao Java runtime que o Neptune não fornece:
-
Declarações bacanas que não começam com.
gIsso inclui:Expressões aritméticas, como
1 + 1Chamadas do sistema, como
System.nanoTime()Declarações de variáveis, como
x = 1; g.V(x)
-
Chamadas de métodos ou bibliotecas Java que não sejam as APIs Gremlin suportadas. Por exemplo
java.lang.*,Date()eg.V().tryNext().orElseGet(...)não são permitidos. -
Métodos Gremlin que usam um tipo Java como argumento. Eles só podem ser acessados por um JVM-language host, não por meio de um envio de string de texto. Exemplos:
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.program(org.apache.tinkerpop.gremlin.process.computer.VertexProgram)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.sideEffect(java.util.function.Consumer)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.from(org.apache.tinkerpop.gremlin.structure.Vertex)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.to(org.apache.tinkerpop.gremlin.structure.Vertex)
Por exemplo, a travessia a seguir não pode ser enviada como uma string de texto:.
g.V().addE('something').from(__.V().next()).to(__.V().next())
Propriedades em elementos
O Neptune não suporta o materializeProperties sinalizador que foi introduzido no TinkerPop 3.7.0 para retornar propriedades em elementos. Como resultado, o Neptune retornará somente vértices ou bordas como referências com somente seu id e label.
Sessões
As sessões no Neptune se limitam a apenas dez minutos de duração. Consulte Sessões baseadas em script do Gremlin e a Referência da TinkerPop Sessão
Transações
O Neptune abre uma nova transação no início de cada percurso do Gremlin e fecha a transação após a conclusão bem-sucedida do percurso. A operação é revertida quando há um erro.
Várias instruções separadas por um ponto-e-vírgula (;) ou um caractere de nova linha (\n) são incluídos em uma única transação. Cada instrução diferente da última deve terminar com uma etapa next() a ser executada. Somente os dados de percurso final são retornados.
A lógica da transação manual que usa tx.commit() e tx.rollback() não é compatível.
Importante
Isso se aplica somente a métodos nos quais você envia a consulta do Gremlin como uma string de texto (consulte Transações do Gremlin).
IDs de vértice e de borda
Os IDs de vértice e borda do Gremlin no Neptune devem ser do tipo String. Essas strings de ID são compatíveis com caracteres Unicode e não podem exceder 55 MB de tamanho.
User-supplied Os IDs são suportados, mas são opcionais no uso normal. Se você não fornecer um ID ao adicionar um vértice ou uma borda, o Neptune vai gerar um UUID e convertê-lo em uma string, da seguinte forma: "48af8178-50ce-971a-fc41-8c9a954cea62". Esses UUIDs não estão em conformidade com o padrão RFC, portanto, se você precisar de UUIDs padrão, deverá gerá-los externamente e fornecê-los ao adicionar vértices ou bordas.
nota
O comando Load do Neptune exige que você forneça IDs usando o campo ~id; no formato CSV do Neptune.
User-supplied Identificações
User-supplied Os IDs são permitidos no Neptune Gremlin com as seguintes estipulações.
Os IDs fornecidos são opcionais.
Somente vértices e pontos são compatíveis.
Somente o tipo
Stringé compatível.
Para criar um novo vértice com um ID personalizado, use a etapa property com a palavra-chave id: g.addV().property(id, 'customid').
nota
Não coloque aspas em torno da palavra-chave id. Ela se refere a T.id.
Todos os IDs de vértice devem ser exclusivos, e todos os IDs de presença devem ser exclusivos. O Neptune, no entanto, permite que um vértice e uma borda tenham o mesmo ID.
Se você tentar criar um novo vértice usando o g.addV() e já existir um vértice com esse ID, haverá falha na operação. A exceção para isso é que, se você especificar um novo rótulo para o vértice, a operação terá êxito, mas adiciona o novo rótulo e quaisquer propriedades adicionais especificadas ao vértice existente. Nada é substituído. Um novo vértice não é criado. O ID do vértice não altera e permanece exclusivo.
Por exemplo, os comandos a seguir do Gremlin Console serão bem-sucedidos:
gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2
IDs de propriedades de vértice
Os IDs de propriedades de vértice são gerados automaticamente e podem ser exibidos como números positivos ou negativos quando consultados.
Cardinalidade de propriedades de vértice
O Neptune é compatível com a cardinalidade set e a cardinalidade single. Se não estiver especificado, a cardinalidade set será selecionada. Isso significa que, se você definir um valor para a propriedade, um novo valor será adicionado à propriedade, mas somente se ela ainda estiver exibida no conjunto de valores. Esse é o valor da enumeração do Gremlin de Set
Não há suporte ao List. Para obter mais informações sobre a cardinalidade da propriedade, consulte o tópico
Atualizar uma propriedade de vértice
Para atualizar o valor de uma propriedade sem adicionar mais um valor ao conjunto de valores, especifique cardinalidade single na etapa property.
g.V('exampleid01').property(single, 'age', 25)
Isso remove todos os valores existentes da propriedade.
Rótulos
O Neptune é compatível com vários rótulos para um vértice. Quando cria um rótulo, você pode especificar vários rótulos separados com ::. Por exemplo, g.addV("Label1::Label2::Label3") adiciona um vértice com três diferentes rótulos. A etapa hasLabel corresponde esse vértice com qualquer um destes três rótulos: hasLabel("Label1"), hasLabel("Label2") e hasLabel("Label3").
Importante
O delimitador :: é reservado somente para esse uso. Você não pode especificar vários rótulos na etapa hasLabel. Por exemplo, hasLabel("Label1::Label2") não corresponde a nada.
Caracteres de escape
O Neptune resolve todos os caracteres de escape, conforme descrito na seção Escaping Special Characters
Serialização
O Neptune é compatível com as serializações a seguir com base no tipo MIME solicitado.
Com o Neptune, você pode usar muitos dos serializadores TinkerPop oferecidos, com suporte para as várias versões e configurações do GraphSon e. GraphBinary Consulte a tabela a seguir para ver os serializadores atualmente suportados. Apesar de haver muitas opções presentes, a orientação sobre qual usar é simples:
-
Se você estiver usando TinkerPop drivers Apache, prefira o padrão para o driver sem especificar um explicitamente. A menos que você tenha um motivo muito específico, provavelmente não precisará especificar o serializador na inicialização do driver. Em geral, o padrão usado pelos drivers é
application/vnd.graphbinary-v1.0. -
Se você estiver se conectando ao Neptune via HTTP, priorize usar
application/vnd.gremlin-v3.0+json;types=false, pois os tipos incorporados na versão alternativa do GraphSON 3 dificultam o trabalho. -
Geralmente,
application/vnd.graphbinary-v1.0-stringdsó é útil quando usado em conjunto com o Gremlin Console, pois converte todos os resultados em uma representação de string para exibição simples. -
Os formatos restantes permanecem presentes por motivos de legado e normalmente não devem ser usados com drivers sem motivo claro.
| Tipo MIME | Serialização | Configuração |
|
GraphSONUntypedMessageSerializerV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphSONMessageSerializerV2 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONUntypedMessageSerializerV2 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphBinaryMessageSerializerV1 |
|
|
GraphBinaryMessageSerializerV1 |
serializeResultToString: true |
|
GraphSONMessageSerializerGremlinV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
GraphSONMessageSerializerV2(só funciona com WebSockets) |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
|
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphBinaryMessageSerializerV1 |
|
nota
A tabela do serializador mostrada aqui se refere à nomenclatura a partir da versão 3.7.0. TinkerPop Se você quiser saber mais sobre essa mudança, consulte a documentação de TinkerPop atualização
Etapas do Lambda
O Neptune não é compatível com as etapas do Lambda.
Etapas do Gremlin não compatíveis
O Neptune não é compatível com as seguintes etapas de Gremlin:
A Etapa io( )
do Gremlin é compatível apenas parcialmente com o Neptune. Você pode usá-lo em um contexto de leitura, como em g.io("https://example.com/data/my-graph.graphml").read(), mas não pode usá-lo para escrever. Para ler um arquivo que você armazena como um objeto do Amazon S3, primeiro gere uma URL pré-assinada. Em seguida, passe esse URL HTTPS parag.io(). Para obter mais informações sobre URLs pré-assinadas, consulte Baixar e carregar objetos com URLs pré-assinadas no Guia do usuário do Amazon S3.
Atributos do grafo do Gremlin no Neptune
A implementação do Gremlin no Neptune não expõe o objeto graph. As tabelas a seguir listam os atributos do Gremlin e indicam se o Neptune é compatível ou não com eles.
Suporte do Neptune para recursos gráficos
Os atributos de grafo do Neptune, quando compatíveis, são os mesmos que seriam gerados pelo comando graph.features().
| Atributo do grafo | Habilitado? |
|---|---|
Transactions |
verdadeiro |
ThreadedTransactions |
false |
Computer |
false |
Persistence |
true |
ConcurrentAccess |
true |
Compatibilidade do Neptune com atributos de variável
| Atributo de variável | Habilitado? |
|---|---|
Variables |
false |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
false |
ByteValues |
false |
DoubleValues |
false |
FloatValues |
false |
IntegerValues |
false |
LongValues |
false |
MapValues |
false |
MixedListValues |
false |
StringValues |
false |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Compatibilidade do Neptune com atributos do vértice
| Atributo de vértice | Habilitado? |
|---|---|
MetaProperties |
false |
DuplicateMultiProperties |
false |
AddVertices |
true |
RemoveVertices |
true |
MultiProperties |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
verdadeiro |
NumericIds |
false |
StringIds |
verdadeiro |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Compatibilidade do Neptune com atributos de propriedade do vértice
| Atributo de propriedade de vértice | Habilitado? |
|---|---|
UserSuppliedIds |
false |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
true |
StringIds |
verdadeiro |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Properties |
verdadeiro |
SerializableValues |
false |
| UniformListValues | false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
verdadeiro |
MapValues |
false |
MixedListValues |
false |
StringValues |
verdadeiro |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Compatibilidade do Neptune com atributos de borda
| Atributo de borda | Habilitado? |
|---|---|
AddEdges |
true |
RemoveEdges |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
verdadeiro |
NumericIds |
false |
StringIds |
verdadeiro |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Compatibilidade do Neptune com atributos de propriedade de borda
| Atributo de propriedade de borda | Habilitado? |
|---|---|
Properties |
verdadeiro |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
verdadeiro |
MapValues |
false |
MixedListValues |
false |
StringValues |
verdadeiro |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |