Vírgulas na cláusula MERGE como existem na cláusula MATCH?

Aug 18 2020

O seguinte funciona bem no neo4j 4:

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

Mas o seguinte retorna um erro:

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

Texto do erro: 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)"
                     ^

Se bem entendi, mesclar fornece um nível de funcionalidade upsert. Mas a fusão é mais restrita na capacidade de correspondência do que na correspondência? Como faço para mesclar padrões não lineares complexos que exigem separações por vírgula ?

Respostas

1 cybersam Aug 18 2020 at 18:36

A inteira MERGE padrão será criado se qualquer item no padrão ainda não existe. Portanto, por segurança, você deve sempre se certificar de que cada MERGEpadrão tem apenas um item que pode não existir.

É por isso que só faz sentido MERGEoferecer suporte a padrões com um único termo.

Por exemplo, em vez disso (que não é legal Cypher, de qualquer maneira):

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

você deve realmente fazer isso:

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