Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Conformité aux spécifications OpenCypher dans Amazon Neptune
La version Amazon Neptune d'openCypher prend généralement en charge les clauses, les opérateurs, les expressions, les fonctions et la syntaxe définis dans la spécification openCypher actuelle, à savoir la version 9 de Cypher Query Language Reference
Note
L'implémentation Neo4j actuelle de Cypher contient des fonctionnalités qui ne se trouvent pas dans la spécification openCypher mentionnée ci-dessus. Si vous migrez le code Cypher actuel vers Neptune, consultez Compatibilité de Neptune avec Neo4j et Réécriture des requêtes Cypher pour les exécuter dans openCypher sur Neptune pour plus d'informations.
Prise en charge des clauses openCypher dans Neptune
Neptune prend en charge les clauses suivantes, sauf indication contraire :
MATCH
: prise en charge, mais pas
etshortestPath()
allShortestPaths()
OPTIONAL MATCH
: n'est actuellement pas pris en charge dans Neptune. Neptune prend toutefois en charge les valeurs d'ID personnalisées dans les requêtesMANDATORY MATCH
MATCH
.-
RETURN
: pris en charge, sauf lorsqu'il est utilisé avec des valeurs non statiques pourSKIP
ouLIMIT
. Par exemple, voici ce qui ne fonctionne pas pour l'instant :MATCH (n) RETURN n LIMIT toInteger(rand()) // Does NOT work!
-
WITH
: pris en charge, sauf lorsqu'il est utilisé avec des valeurs non statiques pourSKIP
ouLIMIT
. Par exemple, voici ce qui ne fonctionne pas pour l'instant :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 vous permet de créer des valeurs d'ID personnalisées dans les requêtesCREATE
.DELETE
SET
REMOVE
MERGE
: Neptune prend en charge les valeurs d'ID personnalisées dans les requêtesMERGE
.
: n'est actuellement pas pris en charge dans Neptune.CALL[YIELD...]
UNION, UNION ALL
: les requêtes en lecture seule sont prises en charge, mais les requêtes de mutation ne le sont pas actuellement.
Prise en charge des opérateurs openCypher dans Neptune
Neptune prend en charge les opérateurs suivants, sauf indication contraire :
Opérateurs généraux
DISTINCT
L'opérateur
.
permettant d'accéder aux propriétés d'un mappage de littéraux imbriqué.
Operateurs mathématiques
Opérateur d'addition
+
.L'opérateur de soustraction
-
.Opérateur de multiplication
*
.L'opérateur de division
/
.L'opérateur de division modulo
%
.L’opérateur d’exponentiation
^
n’est PAS pris en charge
.
Opérateurs de comparaison
Opérateur d'addition
=
.L'opérateur d'égalité
<>
.L'opérateur
<
(inférieur à) est pris en charge sauf lorsque l'un des arguments est un chemin, une liste ou un mappage.L'opérateur
>
(supérieur à) est pris en charge sauf lorsque l'un des arguments est un chemin, une liste ou un mappage.L'opérateur
<=
less-than-or-equal -to est pris en charge sauf lorsque l'un des arguments est un chemin, une liste ou une carte.L'opérateur
>=
greater-than-or-equal -to est pris en charge sauf lorsque l'un des arguments est un chemin, une liste ou une carte.IS NULL
IS NOT NULL
STARTS WITH
est pris en charge si les données recherchées correspondant à une chaîne.ENDS WITH
est pris en charge si les données recherchées correspondant à une chaîne.CONTAINS
est pris en charge si les données recherchées correspondant à une chaîne.
Opérateurs booléens
AND
OR
XOR
NOT
Opérateurs de chaîne
Opérateur de concaténation
+
.
Opérateurs de liste
Opérateur de concaténation
+
.IN
(vérifie la présence d'un élément dans la liste)
Prise en charge des expressions openCypher dans Neptune
Neptune prend en charge les expressions suivantes, sauf indication contraire :
CASE
-
L'expression
[]
n'est actuellement pas prise en charge dans Neptune pour accéder aux clés de propriété calculées dynamiquement au sein d'un nœud, d'une relation ou d'un mappage. Par exemple, les éléments suivants ne fonctionnent pas :MATCH (n) WITH [5, n, {key: 'value'}] AS list RETURN list[1].name
Prise en charge des fonctions openCypher dans Neptune
Neptune prend en charge les fonctions suivantes, sauf indication contraire :
Fonctions de prédicat
exists()
Fonctions scalaires
coalesce()
endNode()
epochmillis()
head()
id()
last()
length()
randomUUID()
properties()
removeKeyFromMap
size()
: cette méthode surchargée ne fonctionne actuellement que pour les expressions de modèles, les listes et les chaînes.startNode()
timestamp()
toBoolean()
toFloat()
toInteger()
type()
Fonctions d'agrégation
avg()
collect()
count()
max()
min()
percentileDisc()
stDev()
percentileCont()
stDevP()
sum()
Répertorier des fonctions
join() (concatène les chaînes d'une liste en une seule chaîne)
keys()
labels()
nodes()
range()
relationships()
reverse()
tail()
Fonctions mathématiques (numériques)
abs()
ceil()
floor()
rand()
round()
sign()
Fonctions mathématiques (logarithmiques)
e()
exp()
log()
log10()
sqrt()
Fonctions mathématiques (trigonométriques)
acos()
asin()
atan()
atan2()
cos()
cot()
degrees()
pi()
radians()
sin()
tan()
Fonctions de chaîne
join() (concatène les chaînes d'une liste en une seule chaîne)
left()
lTrim()
replace()
reverse()
right()
rTrim()
split()
substring()
toLower()
toString()
toUpper()
trim()
Fonctions définies par l'utilisateur
Les fonctions définies par l'utilisateur
ne sont actuellement pas prises en charge dans Neptune.
Détails d'implémentation d'openCypher spécifiques à Neptune
Les sections suivantes décrivent en quoi l'implémentation Neptune d'openCypher peut différer ou aller au-delà de la spécification openCypher
Évaluations des chemins de longueur variable (VLP) dans Neptune
Les évaluations de chemins de longueur variable (VLP
) découvrent les chemins entre les nœuds du graphe. La longueur du chemin peut être illimitée dans une requête. Pour éviter les cycles, la spécification openCypher
Pour les VLP, l'implémentation Neptune s'écarte de la spécification openCypher en ce sens qu'elle ne prend en charge que les valeurs de constantes pour les filtres d'égalité des propriétés. Prenons la requête suivante :
MATCH (x)-[:route*1..2 {dist:33, code:x.name}]->(y) return x,y
La valeur du filtre d'égalité des propriétés x.name
n'étant pas une constante, cette requête génère une exception UnsupportedOperationException
avec le message suivant : Property predicate over variable-length relationships with non-constant
expression is not supported in this release.
Prise en charge temporelle dans l'implémentation de Neptune openCypher
Neptune fournit actuellement une prise en charge limitée de la fonction temporelle dans openCypher. Il prend en charge le type de données DateTime
pour les types temporels.
La fonction datetime()
peut être utilisée pour obtenir la date et l'heure UTC actuelles comme suit :
RETURN datetime() as res
Les valeurs de date et d'heure peuvent être converties à partir des données stockées dans Neptune comme suit :
MATCH (n) RETURN datetime(n.createdDate)
Les valeurs de date et d'heure peuvent être analysées à partir de chaînes dans un format "
dateT
heure"
où date et heure sont toutes deux exprimées sous l'une des formes prises en charge ci-dessous :
Formats de date pris en charge
yyyy-MM-dd
yyyyMMdd
yyyy-MM
yyyy-DDD
yyyyDDD
yyyy
Formats pris en charge
HH:mm:ssZ
HHmmssZ
HH:mm:ssZ
HH:mmZ
HHmmZ
HHZ
HHmmss
HH:mm:ss
HH:mm
HHmm
HH
Par exemple :
RETURN datetime('2022-01-01T00:01') // or another example: RETURN datetime('2022T0001')
Notez que toutes les valeurs de date/heure dans Neptune openCypher sont stockées et récupérées sous forme de valeurs UTC.
Neptune openCypher utilise une horloge statement
, ce qui signifie que le même instant dans le temps est utilisé pendant toute la durée d'une requête. Une requête différente au sein de la même transaction peut utiliser un instant différent.
Neptune ne prend pas en charge l'utilisation d'une fonction dans un appel à datetime()
. Voici, par exemple, ce qui ne fonctionne pas :
CREATE (:n {date:datetime(tostring(2021))}) // ---> NOT ALLOWED!
Neptune prend en charge la fonction epochmillis()
qui convertit une valeur datetime
en epochmillis
. Par exemple :
MATCH (n) RETURN epochMillis(n.someDateTime) 1698972364782
Neptune ne prend actuellement pas en charge les autres fonctions et opérations au niveau des objets DateTime
, telles que l'addition et la soustraction.
Différences de sémantique du langage Neptune openCypher
Neptune représente les ID de nœuds et de relations sous forme de chaînes plutôt que d'entiers. L'ID équivaut à celui fourni par le biais du chargeur de données. S'il existe un espace de noms pour la colonne, il s'agit de l'espace de noms plus l'ID. Par conséquent, la fonction id
renvoie une chaîne au lieu d'un entier.
Le type de données INTEGER
est limité à 64 bits. Lors de la conversion de valeurs à virgule flottante ou de valeurs de chaîne plus grandes en entier à l'aide de la fonction TOINTEGER
, les valeurs négatives sont tronquées en LLONG_MIN
, et les valeurs positives sont tronquées en LLONG_MAX
.
Par exemple :
RETURN TOINTEGER(2^100) > 9223372036854775807 RETURN TOINTEGER(-1 * 2^100) > -9223372036854775808
Fonction join()
spécifique à Neptune
Neptune implémente une fonction join()
qui ne se trouve pas dans la spécification openCypher. Cela crée un littéral de chaîne à partir d'une liste de littéraux de chaîne et d'un délimiteur de chaîne. Deux arguments sont donc utilisés :
Le premier argument est une liste de littéraux de chaîne.
Le deuxième argument est le délimiteur de chaîne, qui peut avoir un, aucune ou plusieurs caractères.
Exemple :
join(["abc", "def", "ghi"], ", ") // Returns "abc, def, ghi"
Fonction removeKeyFromMap()
spécifique à Neptune
Neptune implémente une fonction removeKeyFromMap()
qui ne se trouve pas dans la spécification openCypher. Il supprime une clé spécifiée dans un mappage et renvoie le nouveau mappage généré.
La fonction accepte deux arguments :
Le premier argument est le mappage à partir duquel la clé doit être supprimée.
Le premier argument est la clé à supprimer du mappage.
Cette fonction removeKeyFromMap()
est particulièrement utile dans les situations où vous souhaitez définir les valeurs d'un nœud ou d'une relation en déroulant une liste de mappage. Par exemple :
UNWIND [{`~id`: 'id1', name: 'john'}, {`~id`: 'id2', name: 'jim'}] as val CREATE (n {`~id`: val.`~id`}) SET n = removeKeyFromMap(val, '~id')
Valeurs d'ID personnalisées pour les propriétés des nœuds et des relations
À partir de la version 1.2.0.2 du moteur, Neptune a étendu la spécification openCypher afin que vous puissiez désormais spécifier les valeurs id
des nœuds et des relations dans les clauses CREATE
, MERGE
et MATCH
. Cela vous permet d'attribuer des chaînes conviviales au lieu d'UUID générés par le système pour identifier les nœuds et les relations.
Avertissement
Cette extension de la spécification openCypher est rétrocompatible, car ~id
est désormais considéré comme un nom de propriété réservé. Si vous l'utilisez déjà ~id
en tant que propriété dans vos données et requêtes, vous devez migrer la propriété existante vers une nouvelle clé de propriété et supprimer l'ancienne. veuillez consulter Que faire si vous utilisez actuellement ~id en tant que propriété.
Voici un exemple montrant comment créer des nœuds et des relations dotés d'ID personnalisés :
CREATE (n {`~id`: 'fromNode', name: 'john'}) -[:knows {`~id`: 'john-knows->jim', since: 2020}] ->(m {`~id`: 'toNode', name: 'jim'})
Si vous essayez de créer un ID personnalisé déjà utilisé, Neptune génère une erreur DuplicateDataException
.
Voici un exemple d'utilisation d'ID personnalisé dans une clause MATCH
:
MATCH (n {`~id`: 'id1'}) RETURN n
Voici un exemple d'utilisation d'ID personnalisés dans une clause MERGE
:
MATCH (n {name: 'john'}), (m {name: 'jim'}) MERGE (n)-[r {`~id`: 'john->jim'}]->(m) RETURN r
Que faire si vous utilisez actuellement ~id
en tant que propriété
Avec la version 1.2.0.2 du moteur, la clé ~id
dans les clauses openCypher est désormais traitée comme id
plutôt que comme propriété. Dès lors, si vous avez une propriété nommée ~id
, il devient impossible d'y accéder.
Si vous utilisez une propriété ~id
, avant de passer à la version de moteur 1.2.0.2
ou à une version ultérieure, vous devez migrer la propriété ~id
existante vers une nouvelle clé de propriété, puis supprimer la propriété ~id
. Par exemple, la requête ci-dessous :
Crée une propriété nommée 'newId' pour tous les nœuds,
copie la valeur de la propriété '~id' dans la propriété 'newId'
et supprime la propriété '~id' des données
MATCH (n) WHERE exists(n.`~id`) SET n.newId = n.`~id` REMOVE n.`~id`
La même approche doit être adoptée pour toutes les relations dans les données qui ont une propriété ~id
.
Vous devrez également modifier toutes les requêtes que vous utilisez qui font référence à une propriété ~id
. Par exemple, cette requête :
MATCH (n) WHERE n.`~id` = 'some-value' RETURN n
... serait remplacée par ce qui suit :
MATCH (n) WHERE n.newId = 'some-value' RETURN n
Autres différences entre Neptune openCypher et Cypher
Neptune prend uniquement en charge les connexions TCP pour le protocole Bolt. WebSocketsles connexions pour Bolt ne sont pas prises en charge.
Neptune openCypher supprime les espaces tels que définis par Unicode dans les fonctions
trim()
,ltrim()
etrtrim()
.Dans Neptune openCypher,
tostring(
double)
ne passe pas automatiquement en notation E pour les grandes valeurs du double.Bien qu'openCypher CREATE ne crée pas de propriétés à valeurs multiples, celles-ci peuvent exister dans les données créées à l'aide de Gremlin. Si Neptune openCypher trouve une propriété à valeurs multiples, l'une de ces valeurs est choisie arbitrairement, ce qui crée un résultat non déterministe.