MATCH 절에있는 것처럼 MERGE 절에 쉼표가 있습니까?

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

내가 올바르게 이해한다면 merge는 upsert 기능 수준을 제공합니다. 그러나 일치보다 일치 기능에서 병합이 더 제한됩니까? 쉼표로 구분해야하는 복잡한 비선형 패턴을 어떻게 병합 합니까?

답변

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