Des virgules dans la clause MERGE comme dans la clause MATCH?

Aug 18 2020

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

1 cybersam Aug 18 2020 at 18:36

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 MERGEmodèle n'a qu'un seul élément qui peut ne pas exister.

C'est pourquoi il n'est logique de MERGEprendre 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