Des virgules dans la clause MERGE comme dans la clause MATCH?
Ce qui suit fonctionne correctement dans neo4j 4:
MATCH (a)-->(b)<--(c), (b)-->(d)
RETURN a
Mais ce qui suit renvoie une erreur:
MERGE (a)-->(b)<--(c), (b)-->(d)
RETURN a
Texte d'erreur: Neo.ClientError.Statement.SyntaxError
Invalid input ',': expected whitespace, a relationship pattern, ON, FROM GRAPH, USE GRAPH, CONSTRUCT, LOAD CSV, START, MATCH, UNWIND, MERGE, CREATE UNIQUE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, CALL, RETURN, UNION, ';' or end of input (line 1, column 22 (offset: 21))
"MERGE (a)-->(b)<--(c), (b)-->(d)"
^
Si je comprends bien, la fusion fournit un niveau de fonctionnalité d'upsert. Mais la fusion est-elle plus limitée dans la capacité de correspondance que la correspondance? Comment fusionner des motifs non linéaires complexes qui nécessitent des séparations par virgule ?
Réponses
Le motif entier MERGE
sera créé si un élément du motif n'existe pas encore. Donc, pour être sûr, vous devez toujours vous assurer que chaque MERGE
modèle n'a qu'un seul élément qui peut ne pas exister.
C'est pourquoi il n'est logique de MERGE
prendre en charge les modèles qu'avec un seul terme.
Par exemple, au lieu de cela (ce qui n'est pas légal de Cypher, de toute façon):
MERGE
(a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),
(b)-[:BAR]->(d:Foo {id: 'd'})
RETURN a
vous devriez réellement faire ceci:
MERGE (a:Foo {id: 'a'})
MERGE (b:Foo {id: 'b'})
MERGE (c:Foo {id: 'c'})
MERGE (d:Foo {id: 'd'})
MERGE (a)-[:BAR]->(b)
MERGE (b)<-[:BAR]-(c)
MERGE (b)-[:BAR]->(d)
RETURN a