Запятые в предложении MERGE, как в предложении MATCH?

Aug 18 2020

В 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)"
                     ^

Если я правильно понимаю, слияние обеспечивает определенный уровень функциональности обновления. Но разве слияние более ограничено в возможности сопоставления, чем сопоставление? Как объединить сложные нелинейные паттерны, требующие разделения запятыми ?

Ответы

1 cybersam Aug 18 2020 at 18:36

Весь 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