openCypher conformidad con las especificaciones en Amazon Neptune - Amazon Neptune

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.

openCypher conformidad con las especificaciones en Amazon Neptune

La versión Amazon Neptune de openCypher generalmente admite las cláusulas, los operadores, las expresiones, las funciones y la sintaxis definidas en la openCypher especificación actual, que es la versión 9 de referencia del lenguaje de consulta de cifrado. A continuación se detallan las limitaciones y diferencias en el soporte de openCypher Neptune.

nota

La implementación actual de Cypher en Neo4j contiene una funcionalidad que no está incluida en la especificación mencionada anteriormente. openCypher Si va a migrar el código de Cypher actual a Neptune, consulte Compatibilidad de Neptune con Neo4j y Reescritura de consultas de Cypher para ejecutarlas en openCypher en Neptune para obtener más información.

Support for openCypher clausulations in Neptune

Neptune admite las siguientes cláusulas, salvo que se indique lo contrario:

  • MATCH— Compatible, excepto que shortestPath() y allShortestPaths() no son compatibles actualmente.

  • OPTIONAL MATCH

  • MANDATORY MATCH   — actualmente no es compatible con Neptune. Sin embargo, Neptune admite valores de ID personalizados en las consultas MATCH.

  • RETURN: se admite, excepto cuando se utiliza con valores no estáticos para SKIP o LIMIT. Por ejemplo, lo siguiente no funciona actualmente:

    MATCH (n) RETURN n LIMIT toInteger(rand()) // Does NOT work!
  • WITH: se admite, excepto cuando se utiliza con valores no estáticos para SKIP o LIMIT. Por ejemplo, lo siguiente no funciona actualmente:

    MATCH (n) WITH n SKIP toInteger(rand()) WITH count() AS count RETURN count > 0 AS nonEmpty // Does NOT work!
  • UNWIND

  • WHERE

  • ORDER BY

  • SKIP

  • LIMIT

  • CREATE: Neptune permite crear valores de identificadores personalizados en las consultas CREATE.

  • DELETE

  • SET

  • REMOVE

  • MERGE: Neptune admite valores de identificadores personalizados en las consultas MERGE.

  • CALL[YIELD...]   — actualmente no es compatible con Neptune.

  • UNION, UNION ALL: se admiten consultas de solo lectura, pero actualmente no se admiten consultas de mutación.

  • USINGUSING es compatible con la versión 1.3.2.0 del motor. Consulte las sugerencias de consulta para obtener más información.

Support para openCypher operadores en Neptune

Neptune admite los siguientes operadores, salvo que se indique lo contrario:

Operadores generales
  • DISTINCT

  • El operador . para acceder a las propiedades de un mapa literal anidado.

Operadores matemáticos
  • El operador de suma +.

  • El operador de resta -.

  • El operador de multiplicación *.

  • El operador de división /.

  • El operador de división de módulo %.

  • El operador de ^ exponenciación is NOT supported.

Operadores de comparación
  • El operador de suma =.

  • El operador de desigualdad <>.

  • Se admite el operador menor que <, excepto cuando alguno de los argumentos es una ruta, una lista o un mapa.

  • Se admite el operador mayor que >, excepto cuando alguno de los argumentos es una ruta, una lista o un mapa.

  • Se admite el operador <= less-than-or-equal -to excepto cuando alguno de los argumentos es una ruta, una lista o un mapa.

  • Se admite el operador >= greater-than-or-equal -to excepto cuando alguno de los argumentos es una ruta, una lista o un mapa.

  • IS NULL

  • IS NOT NULL

  • STARTS WITH se admite si los datos que se buscan son una cadena.

  • ENDS WITH se admite si los datos que se buscan son una cadena.

  • CONTAINS se admite si los datos que se buscan son una cadena.

Operadores booleanos
  • AND

  • OR

  • XOR

  • NOT

Operadores de cadena
  • El operador de concatenación +.

Operadores de lista
  • El operador de concatenación +.

  • IN (comprueba la presencia de un elemento en una lista)

Support for openCypher expressions in Neptune

Neptune admite las siguientes expresiones, salvo que se indique lo contrario:

  • CASE

  • La expresión [] no se admite actualmente en Neptune para acceder a claves de propiedad calculadas dinámicamente dentro de un nodo, una relación o un mapa. Por ejemplo, lo siguiente no funciona:

    MATCH (n) WITH [5, n, {key: 'value'}] AS list RETURN list[1].name

Support para openCypher funciones en Neptune

Neptune admite las siguientes funciones, salvo que se indique lo contrario:

Funciones de predicados
  • exists()

Funciones escalares
  • coalesce()

  • endNode()

  • epochmillis()

  • head()

  • id()

  • last()

  • length()

  • randomUUID()

  • properties()

  • removeKeyFromMap

  • size(): este método sobrecargado solo funciona actualmente para expresiones de patrones, listas y cadenas

  • startNode()

  • timestamp()

  • toBoolean()

  • toFloat()

  • toInteger()

  • type()

Funciones de agregación
  • avg()

  • collect()

  • count()

  • max()

  • min()

  • percentileDisc()

  • stDev()

  • percentileCont()

  • stDevP()

  • sum()

Lista de funciones
  • join() (concatena las cadenas de una lista en una sola cadena)

  • keys()

  • labels()

  • nodes()

  • range()

  • relationships()

  • reverse()

  • tail()

Funciones matemáticas: numéricas
  • abs()

  • ceil()

  • floor()

  • rand()

  • round()

  • sign()

Funciones matemáticas: logarítmicas
  • e()

  • exp()

  • log()

  • log10()

  • sqrt()

Funciones matemáticas: trigonométricas
  • acos()

  • asin()

  • atan()

  • atan2()

  • cos()

  • cot()

  • degrees()

  • pi()

  • radians()

  • sin()

  • tan()

Funciones de cadena
  • join() (concatena las cadenas de una lista en una sola cadena)

  • left()

  • lTrim()

  • replace()

  • reverse()

  • right()

  • rTrim()

  • split()

  • substring()

  • toLower()

  • toString()

  • toUpper()

  • trim()

Funciones definidas por el usuario

User-defined functions actualmente no son compatibles con Neptune.

Detalles de implementación específicos de Neptuno openCypher

En las siguientes secciones se describen las formas en las que la implementación de Neptune openCypher puede diferir o ir más allá de las openCypher especificaciones.

Evaluaciones de trayectoria de longitud variable (VLP) en Neptune

Las evaluaciones de rutas de longitud variable (VLP) detectan rutas entre nodos en el gráfico. La longitud de la ruta no puede estar restringida en una consulta. Para evitar ciclos, la openCypher especificación especifica que cada borde debe recorrerse como máximo una vez por solución.

PuesVLPs, la implementación de Neptune se desvía de la openCypher especificación en el sentido de que solo admite valores constantes para los filtros de igualdad de propiedades. Tomemos como ejemplo la siguiente consulta:

MATCH (x)-[:route*1..2 {dist:33, code:x.name}]->(y) return x,y

Dado que el valor del filtro de igualdad de la propiedad x.name no es una constante, esta consulta da como resultado una UnsupportedOperationException con el mensaje: Property predicate over variable-length relationships with non-constant expression is not supported in this release.

Soporte temporal en la openCypher implementación de Neptuno (base de datos Neptune 1.3.1.0 y versiones anteriores)

Neptune actualmente proporciona un soporte limitado para la función temporal en. openCypher Admite el tipo de datos DateTime para los tipos temporales.

La datetime() función se puede utilizar para obtener la UTC fecha y hora actuales de la siguiente manera:

RETURN datetime() as res

Los valores de fecha y hora se pueden analizar a partir de cadenas en un formato de "fechaThora" en el que la fecha y la hora se expresan en uno de los formatos admitidos que se indican a continuación:

Formatos de fecha admitidos
  • yyyy-MM-dd

  • yyyyMMdd

  • yyyy-MM

  • yyyy-DDD

  • yyyyDDD

  • yyyy

Formatos de tiempo admitidos
  • HH:mm:ssZ

  • HHmmssZ

  • HH:mm:ssZ

  • HH:mmZ

  • HHmmZ

  • HHZ

  • HHmmss

  • HH:mm:ss

  • HH:mm

  • HHmm

  • HH

Por ejemplo:

RETURN datetime('2022-01-01T00:01') // or another example: RETURN datetime('2022T0001')

Tenga en cuenta que todos los valores de fecha y hora en Neptune openCypher se almacenan y recuperan como valores. UTC

Neptune openCypher usa un statement reloj, lo que significa que se usa el mismo instante en el tiempo durante toda la consulta. Una consulta diferente dentro de la misma transacción podría utilizar un instante diferente en el tiempo.

Neptune no admite el uso de una función en una llamada a datetime(). Por ejemplo, lo siguiente no funciona:

CREATE (:n {date:datetime(tostring(2021))}) // ---> NOT ALLOWED!

Neptune admite la función epochmillis() que convierte una datetime en epochmillis. Por ejemplo:

MATCH (n) RETURN epochMillis(n.someDateTime) 1698972364782

Neptune no admite actualmente otras funciones y operaciones en objetos DateTime, como la suma y la resta.

Soporte temporal en la openCypher implementación de Neptune (Neptune Analytics y Neptune Database 1.3.2.0 y versiones posteriores)

La siguiente funcionalidad de fecha y hora OpenCypher se aplica a Neptune Analytics. Como alternativa, puede usar el parámetro labmode DatetimeMillisecond=enabled para habilitar la siguiente funcionalidad de fecha y hora en la versión 1.3.2.0 y posteriores del motor Neptune Engine. Para obtener más información sobre el uso de esta funcionalidad en labmode, consulte. Soporte extendido de fecha y hora

  • Support para milisegundos. El literal de fecha y hora siempre se devolverá en milisegundos, incluso si milisegundos es 0. (El comportamiento anterior consistía en truncar los milisegundos).

    CREATE (:event {time: datetime('2024-04-01T23:59:59Z')}) # Returning the date returns with 000 suffixed representing milliseconds MATCH(n:event) RETURN n.time as datetime { "results" : [ { "n" : { "~id" : "0fe88f7f-a9d9-470a-bbf2-fd6dd5bf1a7d", "~entityType" : "node", "~labels" : [ "event" ], "~properties" : { "time" : "2024-04-01T23:59:59.000Z" } } } ] }
  • Support para llamar a la función datetime () sobre propiedades almacenadas o resultados intermedios. Por ejemplo, las siguientes consultas no eran posibles antes de esta función.

    Datetime () sobre las propiedades:

    // Create node with property 'time' stored as string CREATE (:event {time: '2024-04-01T23:59:59Z'}) // Match and return this property as datetime MATCH(n:event) RETURN datetime(n.time) as datetime

    Datetime () sobre los resultados intermedios:

    // Parse datetime from parameter UNWIND $list as myDate RETURN datetime(myDate) as d
  • Ahora también es posible guardar las propiedades de fecha y hora que se crean en los casos mencionados anteriormente.

    Guardar la fecha y hora de la propiedad de cadena de una propiedad en otra:

    // Create node with property 'time' stored as string CREATE (:event {time: '2024-04-01T23:59:59Z', name: 'crash'}) // Match and update the same property to datetime type MATCH(n:event {name: 'crash'}) SET n.time = datetime(n.time) // Match and update another node's property MATCH(e:event {name: 'crash'}) MATCH(n:server {name: e.servername}) SET n.time = datetime(e.time)

    Cree nodos por lotes a partir de un parámetro con una propiedad de fecha y hora:

    // Batch create from parameter UNWIND $list as events CREATE (n:crash) {time: datetime(events.time)} // Parameter value { "x":[ {"time":"2024-01-01T23:59:29", "name":"crash1"}, {"time":"2023-01-01T00:00:00Z", "name":"crash2"} ] }
  • Support para un subconjunto mayor de ISO86 10 formatos de fecha y hora. Consulte a continuación.

Formatos admitidos

El formato de un valor de fecha y hora es [Fecha] T [Hora] [Zona horaria], donde T es el separador. Si no se proporciona una zona horaria explícita, se asume que UTC (Z) es la predeterminada.

Zona horaria

Los formatos de zona horaria admitidos son:

  • +/-HH:mm

  • +/-HHmm

  • +/-HH

La presencia de una zona horaria en una cadena de fecha y hora es opcional. En caso de que el desplazamiento de zona horaria sea 0, se puede usar Z en lugar del sufijo de zona horaria anterior para indicar la hora. UTC El rango admitido de una zona horaria es de - 14:00 a + 14:00.

Date

Si no hay ninguna zona horaria o la zona horaria es UTC (Z), los formatos de fecha admitidos son los siguientes:

nota

DDDhace referencia a una fecha ordinal, que representa un día del año comprendido entre 001 y 365 (366 en años bisiestos). Por ejemplo, 2024-002 representa el 2 de enero de 2024.

  • yyyy-MM-dd

  • yyyyMMdd

  • yyyy-MM

  • yyyyMM

  • yyyy-DDD

  • yyyyDDD

  • yyyy

Si se elige una zona horaria distinta de la Z, los formatos de fecha admitidos se limitan a los siguientes:

  • yyyy-MM-dd

  • yyyy-DDD

  • yyyyDDD

El intervalo de fechas admitido es del 01/01/2001 al 31/12/9999.

Tiempo

Si no hay ninguna zona horaria o la zona horaria es (Z), los formatos de hora admitidos son: UTC

  • HH:mm:ss.SSS

  • HH:mm:ss

  • HHmmss.SSS

  • HHmmss

  • HH:mm

  • HHmm

  • HH

Si se elige una zona horaria distinta de la Z, los formatos de hora admitidos se limitan a los siguientes:

  • HH:mm:ss

  • HH:mm:ss.SSS

Diferencias en la semántica del lenguaje de Neptune openCypher

Neptune representa el nodo y la relación IDs como cadenas en lugar de números enteros. El identificador es igual al identificador proporcionado a través del programa de carga de datos. Si hay un espacio de nombres para la columna, se utiliza el espacio de nombres más el identificador. En consecuencia, la función id devuelve una cadena en lugar de un número entero.

El tipo de datos INTEGER está limitado a 64 bits. Al convertir valores de cadena o coma flotante más grandes en un número entero mediante la función TOINTEGER, los valores negativos se truncan a LLONG_MIN y los valores positivos se truncan a LLONG_MAX.

Por ejemplo:

RETURN TOINTEGER(2^100) > 9223372036854775807 RETURN TOINTEGER(-1 * 2^100) > -9223372036854775808

La función join() específica de Neptune

Neptune implementa una join() función que no está presente en la openCypher especificación. Crea un literal de cadena a partir de una lista de literales de cadena y un delimitador de cadenas. Adopta dos argumentos:

  • El primer argumento es una lista de literales de cadena.

  • El segundo argumento es la cadena delimitadora, que puede tener cero, uno o más caracteres.

Ejemplo:

join(["abc", "def", "ghi"], ", ") // Returns "abc, def, ghi"

La función removeKeyFromMap() específica de Neptune

Neptune implementa una removeKeyFromMap() función que no está presente en la openCypher especificación. Elimina una clave específica de un mapa y devuelve el nuevo mapa resultante.

La función toma dos argumentos:

  • El primer argumento es el mapa del que se debe eliminar la clave.

  • El segundo argumento es la clave que hay que eliminar del mapa.

La función removeKeyFromMap() resulta especialmente útil en situaciones en las que se desean establecer valores para un nodo o una relación presentando una lista de mapas. Por ejemplo:

UNWIND [{`~id`: 'id1', name: 'john'}, {`~id`: 'id2', name: 'jim'}] as val CREATE (n {`~id`: val.`~id`}) SET n = removeKeyFromMap(val, '~id')

Valores de identificadores personalizados para las propiedades de los nodos y las relaciones

A partir de la versión 1.2.0.2 del motor, Neptune ha ampliado la openCypher especificación para que ahora pueda especificar id los valores de los nodos y las relaciones en las cláusulasCREATE, MERGE y. MATCH Esto le permite asignar cadenas fáciles de usar en lugar de generadas por el sistema UUIDs para identificar nodos y relaciones.

aviso

Esta extensión de la openCypher especificación no es compatible con versiones anteriores, ya que ahora ~id se considera un nombre de propiedad reservada. Si ya utiliza ~id como propiedad en sus datos y consultas, tendrá que migrar la propiedad existente a una nueva clave de propiedad y eliminar la antigua. Consulte Qué hacer si actualmente utiliza ~id como propiedad.

A continuación, se muestra un ejemplo que muestra cómo crear nodos y relaciones personalizadasIDS:

CREATE (n {`~id`: 'fromNode', name: 'john'}) -[:knows {`~id`: 'john-knows->jim', since: 2020}] ->(m {`~id`: 'toNode', name: 'jim'})

Si intenta crear un identificador personalizado que ya esté en uso, Neptune mostrará un error DuplicateDataException.

A continuación, se muestra un ejemplo del uso de un identificador personalizado en una cláusula MATCH:

MATCH (n {`~id`: 'id1'}) RETURN n

A continuación, se muestra un ejemplo del uso de IDs la personalización en una MERGE cláusula:

MATCH (n {name: 'john'}), (m {name: 'jim'}) MERGE (n)-[r {`~id`: 'john->jim'}]->(m) RETURN r

Qué hacer si actualmente utiliza ~id como propiedad

Con la versión 1.2.0.2 del motor, la ~id clave de las openCypher cláusulas ahora se trata como una propiedad y id no como una propiedad. Esto significa que si tiene una propiedad denominada ~id, es imposible acceder a ella.

Si utiliza una propiedad ~id, lo que debe hacer antes de actualizarla a la versión del motor 1.2.0.2 o posterior es migrar primero la propiedad ~id existente a una nueva clave de propiedad y, a continuación, eliminar la propiedad ~id. Por ejemplo, la siguiente consulta:

  • Crea una nueva propiedad llamada 'newId' para todos los nodos,

  • copia el valor de la propiedad '~id' en la propiedad 'newId',

  • y elimina la propiedad '~id' de los datos.

MATCH (n) WHERE exists(n.`~id`) SET n.newId = n.`~id` REMOVE n.`~id`

Se debe hacer lo mismo con cualquier relación en los datos que tenga una propiedad ~id.

También tendrá que cambiar las consultas que esté utilizando que hagan referencia a una propiedad ~id. Por ejemplo, esta consulta:

MATCH (n) WHERE n.`~id` = 'some-value' RETURN n

...se convertiría en esto:

MATCH (n) WHERE n.newId = 'some-value' RETURN n

Otras diferencias entre Neptune openCypher y Cypher

  • Neptune solo admite TCP conexiones para el protocolo Bolt. WebSocketsno se admiten las conexiones para Bolt.

  • Neptune openCypher elimina los espacios en blanco tal y como los define Unicode en las funciones y. trim() ltrim() rtrim()

  • En NeptuneopenCypher, el tostring( doble ) no cambia automáticamente a la notación E para valores grandes del doble.

  • Aunque openCypher CREATE no crea propiedades con varios valores, pueden existir en los datos creados con Gremlin. Si Neptune openCypher encuentra una propiedad con varios valores, uno de los valores se elige arbitrariamente, lo que crea un resultado no determinista.