Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Conformidad con los estándares de Gremlin en Amazon Neptune
Las siguientes secciones proporcionan una descripción general de la implementación de Gremlin en Neptune y en qué se diferencia de la implementación de Apache. TinkerPop
Neptune implementa algunos pasos de Gremlin de forma nativa en su motor y usa la implementación de Apache TinkerPop Gremlin para procesar otros (consulte). Compatibilidad nativa con pasos de Gremlin en Amazon Neptune
nota
Para ver algunos ejemplos concretos de estas diferencias de implementación que se muestran en la consola de Gremlin y Amazon Neptune, consulte la sección Uso de Gremlin para acceder a datos de gráficos en Amazon Neptune del inicio rápido.
Temas
Estándares aplicables de Gremlin
El lenguaje Gremlin se define mediante la TinkerPop documentación de Apache y la TinkerPop implementación de Gremlin en Apache
y no mediante una especificación formal. Para los formatos numéricos, Gremlin sigue el estándar IEEE 754 (IEEE 754-2019: estándar IEEE de aritmética). Floating-Point
Para obtener más información, consulte también la página IEEE 754 de Wikipedia. https://en.wikipedia.org/wiki/IEEE_754
Variables y parámetros en los scripts
En lo que respecta a las variables predelimitadas, el objeto transversal g está Pre-bound en Neptuno y no es graph compatible.
Aunque Neptune no admite variables de Gremlin ni la parametrización en los scripts, a menudo encontrará en Internet ejemplos de scripts del servidor de Gremlin que contienen declaraciones de variables, como:
String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();
También hay muchos ejemplos que utilizan la parametrización
Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();
Los ejemplos de parámetros suelen estar asociados a advertencias sobre penalizaciones en el rendimiento si no se parametriza cuando es posible. Hay muchos ejemplos de este tipo TinkerPop que puede encontrar, y todos parecen bastante convincentes sobre la necesidad de parametrizar.
Sin embargo, tanto la función de declaración de variables como la función de parametrización (junto con las advertencias) solo se aplican al servidor Gremlin cuando se utiliza TinkerPop el. GremlinGroovyScriptEngine No se aplican cuando el servidor de Gremlin utiliza la gramática ANTLR gremlin-language de Gremlin para analizar las consultas. La gramática de ANTLR no admite ni las declaraciones de variables ni la parametrización, por lo que cuando utilice ANTLR, no tiene que preocuparse por no poder parametrizar. Como la gramática ANTLR es un componente más nuevo TinkerPop, el contenido más antiguo que puede encontrar en Internet no suele reflejar esta distinción.
Neptune utiliza la gramática de ANTLR en su motor de procesamiento de consultas en lugar del GremlinGroovyScriptEngine, por lo que no admite variables, parametrización ni la propiedad bindings. Como resultado, los problemas relacionados con la falta de parametrización no se aplican en Neptune. Con Neptune, es perfectamente seguro enviar la consulta tal cual, cuando lo normal sería parametrizarla. Como resultado, el ejemplo anterior se puede simplificar sin ninguna penalización en el rendimiento de la siguiente manera:
String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();
Ejecución de scripts
El motor Gremlin de Neptune analiza las consultas utilizando la gramática ANTLR. TinkerPop gremlin-language No funciona GremlinGroovyScriptEngine (como ocurre con algunas implementaciones de TinkerPop-based Gremlin Server), por lo que los scripts enviados a Neptune deben contener solo el lenguaje Gremlin, no código Groovy o Java arbitrario.
Los scripts se pueden enviar a Neptune de varias maneras, por ejemplo, a través del terminal REST de Gremlin, la consola Gremlin o mediante controladores de TinkerPop idioma (por ejemplo , el cliente de scripts del controlador Java). https://tinkerpop.apache.org/docs/current/reference/#gremlin-java-scripts
Es importante no confundir el lenguaje Gremlin en sí mismo con el contenido sintáctico o las funciones de uso general de cualquier lenguaje de programación que hayas visto empaquetar ejemplos de Gremlin en otros lugares. Si este tipo de código aparece en TinkerPop tutoriales o ejemplos en línea, depende de un entorno de ejecución de Groovy o Java que Neptune no proporcione.
importante
Todo lo contenido en esta sección se aplica a los envíos de Gremlin con cadenas de texto. Los envíos de código de bytes GLV (variante del lenguaje Gremlin) creados en un lenguaje anfitrión como Java, Python o.NET no están sujetos a estas restricciones, ya que el generador transversal del idioma anfitrión produce código de bytes que el motor de Neptune consume directamente.
Qué puede contener un script
-
Todas las consultas debe comenzar por
g, el objeto de recorrido. -
Se pueden realizar varios recorridos en una sola presentación separados por un punto y coma (
;) o un carácter de nueva línea ().\nTodas las instrucciones, excepto la última, deben terminar con un.iterate()paso para ejecutarse; solo se devuelven los datos del recorrido final.
Haciendo referencia a los valores de enumeración TinkerPop
Cuando se espera un valor de TinkerPop enumeración como argumento escalonado (por ejemplo, una cardinalidad en property() o un orden enby()), utilice los valores abreviados reconocidos por la gramática ANTLR. Neptune no resuelve nombres de clases Java completamente calificados en esta posición; por ejemplo, no org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single se acepta; utilícelo en su lugar. single
En la tabla siguiente se enumeran los valores abreviados permitidos y la TinkerPop clase subyacente a la que pertenece cada uno.
| Valores permitidos | Clase |
|---|---|
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 |
Lo que no puede contener un script
No se admite lo siguiente en las consultas de cadenas de texto de Gremlin a Neptune, porque dependen de la compatibilidad con Groovy o Java en tiempo de ejecución que Neptune no proporciona:
-
Sentencias de Groovy que no comienzan por.
gEsto incluye:Expresiones aritméticas como
1 + 1Llamadas al sistema como
System.nanoTime()Declaraciones de variables como
x = 1; g.V(x)
-
Llamadas a métodos o bibliotecas de Java distintas de las API de Gremlin compatibles. Por ejemplo
java.lang.*,Date()yg.V().tryNext().orElseGet(...)no se permiten. -
Métodos Gremlin que toman un tipo Java como argumento. Solo se puede acceder a ellos desde un JVM-language anfitrión, no desde una cadena de texto. Ejemplos:
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 ejemplo, el siguiente recorrido no se puede enviar como una cadena de texto:.
g.V().addE('something').from(__.V().next()).to(__.V().next())
Propiedades de los elementos
Neptune no admite la materializeProperties bandera que se introdujo en la TinkerPop versión 3.7.0 para devolver las propiedades de los elementos. Como resultado, Neptune seguirá devolviendo únicamente vértices o bordes como referencias solo con su id y label.
Sesiones
Las sesiones en Neptune se limitan a una duración de 10 minutos. Consulte Sesiones basadas en scripts de Gremlin y la referencia de la TinkerPop sesión
Transacciones
Neptune abre una nueva transacción al principio de cada recorrido de Gremlin y la cierra una vez que este se completa correctamente. La transacción se revierte si se produce un error.
Varias instrucciones separadas por punto y coma (;) o por un carácter de nueva línea (\n) se incluyen en una sola transacción. Todas las instrucciones, aparte de la última, deben finalizar con un paso next() para ejecutarse. Solo se devuelven los datos del recorrido final.
No se admite la lógica de transacción manual que utiliza tx.commit() y tx.rollback().
importante
Esto solo se aplica a aquellos casos en los que envíe la consulta de Gremlin como una cadena de texto (consulte Transacciones de Gremlin).
Identificador de vértice y borde
Los identificadores de vértice y borde de Gremlin en Neptune deben ser de tipo String. Estas cadenas de identificación admiten caracteres Unicode y su tamaño no puede superar los 55 MB.
User-supplied Se admiten los identificadores, pero son opcionales en el uso normal. Si no proporciona un identificador cuando añade un vértice o un borde, Neptune genera un UUID y lo convierte en una cadena, de una forma parecida a esta: "48af8178-50ce-971a-fc41-8c9a954cea62". Estos UUID no cumplen el estándar RFC, por lo que si necesita UUID estándar, debe generarlos externamente y proporcionarlos cuando añada vértices o bordes.
nota
Sin embargo, el comando Load de Neptune requiere que proporcione identificadores mediante el campo ~id en formato CSV de Neptune.
User-supplied ID
User-supplied Se permiten identificaciones en Neptune Gremlin con las siguientes estipulaciones.
Los ID proporcionados son opcionales.
Solo se admiten vértices y bordes.
Solo se admite el tipo
String.
Para crear un vértice con un ID personalizado, utilice el paso property con la palabra clave id: g.addV().property(id, 'customid').
nota
No añada comillas alrededor de la palabra clave id. Hace referencia a T.id.
Todos los identificadores de vértice deben ser únicos y todos los identificadores de borde deben ser únicos. Sin embargo, Neptune permite que un vértice y un borde tengan el mismo identificador.
Si intenta crear un vértice con g.addV() y ya existe un vértice con ese ID, la operación dará error. La excepción a esta norma es que, si especifica una nueva etiqueta para el vértice, la operación se completará correctamente, pero añadirá la nueva etiqueta y las propiedades adicionales especificadas al vértice existente. No se sobrescribirá ninguna. No se creará un nuevo vértice. El ID del vértice no cambia y continúa siendo único.
Por ejemplo, los siguientes comandos de la consola de Gremlin se ejecutan correctamente:
gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2
Identificadores de propiedades de vértice
Los ID de propiedades de vértice se generan automáticamente y pueden aparecer como números positivos o negativos al realizar consultas.
Cardinalidad de las propiedades de vértice
Neptune admite la cardinalidad en conjuntos y la cardinalidad simple. Si no se especifica, se selecciona la cardinalidad en conjuntos. Esto significa que si establece un valor de propiedad, añade un nuevo valor a la propiedad, pero solo si este no aparece en el conjunto de valores. Este es el valor de enumeración de Gremlin de Set (Establecer)
List no se admite. Para obtener más información sobre la cardinalidad de las propiedades, consulte el tema Vertex
Actualización de una propiedad de vértice
Para actualizar un valor de propiedad sin añadir un valor al conjunto de valores, especifique la cardinalidad single en el paso property.
g.V('exampleid01').property(single, 'age', 25)
Esto elimina todos los valores existentes para la propiedad.
Etiquetas
Neptune admite varias etiquetas para un vértice. Al crear una etiqueta, puede especificar varias si las separa mediante ::. Por ejemplo, g.addV("Label1::Label2::Label3") añade un vértice con tres etiquetas distintas. El paso hasLabel busca coincidencias de este vértice con cualquiera de esas tres etiquetas: hasLabel("Label1") hasLabel("Label2") y hasLabel("Label3").
importante
El delimitador :: está reservado solo para este uso. No se pueden especificar varias etiquetas en el paso hasLabel. Por ejemplo, hasLabel("Label1::Label2") no tiene ninguna coincidencia.
Caracteres de escape
Neptune resuelve todos los caracteres de escape tal y como se describe en la sección Escaping Special Characters
Serialización
Neptune admite las siguientes serializaciones en función del tipo MIME solicitado.
Con Neptune, puedes usar muchos de los serializadores que TinkerPop ofrece, y son compatibles con las distintas versiones y configuraciones de GraphSon y. GraphBinary Consulta la siguiente tabla para ver los serializadores compatibles actualmente. A pesar de que son muchas las opciones disponibles, las instrucciones sobre cuál utilizar son muy sencillas:
-
Si utiliza TinkerPop controladores Apache, prefiera el predeterminado para el controlador sin especificar uno de forma explícita. A menos que tenga una razón muy específica para hacerlo, es probable que no necesite especificar el serializador en la inicialización del controlador. En general, el valor predeterminado que utilizan los controladores es
application/vnd.graphbinary-v1.0. -
Si se conecta a Neptune a través de HTTP, priorice el uso de
application/vnd.gremlin-v3.0+json;types=false, ya que los tipos incrustados en la versión alternativa de GraphSON 3 dificultan el trabajo. -
Por lo general,
application/vnd.graphbinary-v1.0-stringdsolo es útil cuando se usa junto con la Consola de Gremlin, ya que convierte todos los resultados en una representación de cadena para facilitar su visualización. -
Los demás formatos se mantienen por motivos de compatibilidad con las versiones anteriores y, por lo general, no deben usarse con controladores a menos que existe una causa clara para ello.
| Tipo MIME | Serialización | Configuración |
|
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(solo funciona con WebSockets) |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
GraphSONMessageSerializerV3 |
|
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
GraphBinaryMessageSerializerV1 |
|
nota
La tabla de serialización que se muestra aquí hace referencia a los nombres a partir de TinkerPop la versión 3.7.0. Si desea obtener más información sobre este cambio, consulte la TinkerPop documentación de actualización.
Pasos de Lambda
Neptune no admite los pasos de Lambda.
Pasos de Gremlin no admitidos
Neptune no admite los siguientes pasos de Gremlin:
El paso io()
de Gremlin solo se admite parcialmente en Neptune. Puedes usarlo en un contexto de lectura, como en g.io("https://example.com/data/my-graph.graphml").read(), pero no puedes usarlo para escribir. Para leer un archivo que almacene como un objeto de Amazon S3, genere primero una URL prefirmada. A continuación, pase esa URL HTTPS ag.io(). Para obtener más información sobre las URL prefirmadas, consulte Descargar y cargar objetos con URL prefirmadas en la guía del usuario de Amazon S3.
Características de gráficos de Gremlin en Neptune
La implementación de Gremlin en Neptune no expone el objeto graph. Las siguientes tablas muestran las características de Gremlin e indican si Neptune las admite o no.
Soporte de Neptune para las funciones gráficas
Las características de gráficos, si se admiten, son las mismas que devolvería el comando graph.features().
| Característica de gráfico | ¿Habilitada? |
|---|---|
Transactions |
true |
ThreadedTransactions |
false |
Computer |
false |
Persistence |
true |
ConcurrentAccess |
true |
Compatibilidad de Neptune con características de variables
| Característica de variable | ¿Habilitada? |
|---|---|
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 |
Compatibilidad de Neptune con características de vértices
| Característica de vértice | ¿Habilitada? |
|---|---|
MetaProperties |
false |
DuplicateMultiProperties |
false |
AddVertices |
true |
RemoveVertices |
true |
MultiProperties |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
false |
StringIds |
true |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Compatibilidad de Neptune con características de propiedades de vértices
| Característica de propiedad de vértice | ¿Habilitada? |
|---|---|
UserSuppliedIds |
false |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
true |
StringIds |
true |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Properties |
true |
SerializableValues |
false |
| UniformListValues | false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
true |
MapValues |
false |
MixedListValues |
false |
StringValues |
true |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Compatibilidad de Neptune con características de bordes
| Característica de borde | ¿Habilitada? |
|---|---|
AddEdges |
true |
RemoveEdges |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
false |
StringIds |
true |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Compatibilidad de Neptune con características de propiedades de bordes
| Característica de propiedad de borde | ¿Habilitada? |
|---|---|
Properties |
true |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
true |
MapValues |
false |
MixedListValues |
false |
StringValues |
true |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |