Vírgulas na cláusula MERGE como existem na cláusula MATCH?
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
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 MERGE
padrão tem apenas um item que pode não existir.
É por isso que só faz sentido MERGE
oferecer 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