MATCH句にあるようなMERGE句のコンマ?

Aug 18 2020

以下はneo4j4で正常に機能します。

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はあるレベルのアップサート機能を提供します。しかし、マージは一致よりも一致機能が制限されていますか?カンマ区切りが必要な複雑な非線形パターンをマージするにはどうすればよいですか?

回答

1 cybersam Aug 18 2020 at 18:36

全体の MERGE場合はパターンが作成される任意のパターン内の項目がまだ存在していません。したがって、安全のために、すべてのMERGEパターンに存在しない可能性のあるアイテムが1つだけあることを常に確認する必要があります。

これがMERGE、単一の用語でパターンをサポートすることだけが理にかなっている理由です。

たとえば、これの代わりに(とにかく合法的なサイファーではありません):

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