¿Comas en la cláusula MERGE como las hay en la cláusula MATCH?

Aug 18 2020

Lo siguiente funciona bien en neo4j 4:

MATCH (a)-->(b)<--(c), (b)-->(d)
RETURN a

Pero lo siguiente devuelve un error:

MERGE (a)-->(b)<--(c), (b)-->(d)
RETURN a

Texto de error: 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 entiendo correctamente, fusionar proporciona un nivel de funcionalidad de actualización. ¿Pero la fusión es más restringida en la capacidad de coincidencia que la coincidencia? ¿Cómo fusiono patrones no lineales complejos que requieren separaciones por comas ?

Respuestas

1 cybersam Aug 18 2020 at 18:36

Se creará el patrón completo MERGE si algún elemento del patrón aún no existe. Por lo tanto, para estar seguro, siempre debe asegurarse de que cada MERGEpatrón tenga solo un elemento que podría no existir.

Es por eso que solo tiene sentido MERGEadmitir patrones con un solo término.

Por ejemplo, en lugar de esto (que no es Cypher legal, de todos modos):

MERGE
  (a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),
  (b)-[:BAR]->(d:Foo {id: 'd'})
RETURN a

en realidad deberías hacer esto:

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