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
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
yshortestPath()
no son compatibles actualmente.allShortestPaths()
OPTIONAL MATCH
— actualmente no es compatible con Neptune. Sin embargo, Neptune admite valores de ID personalizados en las consultasMANDATORY MATCH
MATCH
.-
RETURN
: se admite, excepto cuando se utiliza con valores no estáticos paraSKIP
oLIMIT
. 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 paraSKIP
oLIMIT
. 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 consultasCREATE
.DELETE
SET
REMOVE
MERGE
: Neptune admite valores de identificadores personalizados en las consultasMERGE
.
— actualmente no es compatible con Neptune.CALL[YIELD...]
UNION, UNION ALL
: se admiten consultas de solo lectura, pero actualmente no se admiten consultas de mutación.-
USING
—USING
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ónis 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 cadenasstartNode()
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
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
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 "
fechaT
hora"
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.