Koma di klausa MERGE seperti yang ada di klausa MATCH?

Aug 18 2020

Berikut ini berfungsi dengan baik di neo4j 4:

MATCH (a)-->(b)<--(c), (b)-->(d)
RETURN a

Tetapi yang berikut mengembalikan kesalahan:

MERGE (a)-->(b)<--(c), (b)-->(d)
RETURN a

Teks kesalahan: 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)"
                     ^

Jika saya mengerti dengan benar, penggabungan memberikan tingkat fungsionalitas upsert. Tetapi apakah penggabungan lebih terbatas dalam kemampuan mencocokkan daripada mencocokkan? Bagaimana cara menggabungkan pola non-linier kompleks yang memerlukan pemisahan koma ?

Jawaban

1 cybersam Aug 18 2020 at 18:36

The Seluruh MERGE Pola akan dibuat jika setiap item dalam pola belum ada. Jadi, untuk amannya, Anda harus selalu memastikan setiap MERGEpola hanya memiliki satu item yang mungkin saja tidak ada.

Inilah mengapa masuk akal untuk MERGEmendukung pola dengan satu istilah.

Misalnya, alih-alih ini (yang sebenarnya bukan Cypher legal):

MERGE
  (a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),
  (b)-[:BAR]->(d:Foo {id: 'd'})
RETURN a

Anda sebenarnya harus melakukan ini:

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