Запятые в предложении MERGE, как в предложении MATCH?
В neo4j 4 отлично работает следующее:
MATCH (a)-->(b)<--(c), (b)-->(d)
RETURN a
Но следующее возвращает ошибку:
MERGE (a)-->(b)<--(c), (b)-->(d)
RETURN a
Текст ошибки: 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)"
^
Если я правильно понимаю, слияние обеспечивает определенный уровень функциональности обновления. Но разве слияние более ограничено в возможности сопоставления, чем сопоставление? Как объединить сложные нелинейные паттерны, требующие разделения запятыми ?
Ответы
Весь MERGE
шаблон будет создан , если какой - либо элемент в структуре еще не существует. Итак, на всякий случай вы всегда должны убедиться, что в каждом MERGE
шаблоне есть только один элемент, который может не существовать.
Вот почему имеет смысл MERGE
поддерживать шаблоны только одним термином.
Например, вместо этого (что в любом случае не является законным Cypher):
MERGE
(a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),
(b)-[:BAR]->(d:Foo {id: 'd'})
RETURN a
вы действительно должны сделать это:
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