MERGEとCREATEUNIQUEの違いを理解しようとしています。私はこれらの機能を知っています:
パターンが存在しない場合は、ノードを作成できます。
MERGE (n { name:"X" }) RETURN n;
これにより、プロパティ名、空のノード「m」、および関係RELATEDを持つノード「n」が作成されます。
MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m;
このようなノードを作成することはできません。
CREATE UNIQUE (n { name:"X" }) RETURN n;
ノード「n」が存在する場合、一意を作成すると、空のノード「m」と関係がRELATEDになります。
MATCH (n { name: 'X' }) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m;
このパターンが存在する場合、何も作成されず、パターンのみが返されます。
私の見解では、MERGEとCREATE UNIQUEはまったく同じクエリですが、CREATE UNIQUEを使用すると、関係のある開始ノードを作成できません。誰かがこの問題を説明し、これらのクエリを比較することができれば、私は感謝します、thx。
CREATE UNIQUE
は、MERGE
よりもわずかにあいまいなセマンティクスを持っています。 MERGE
は、CREATE UNIQUE
よりも直感的な動作を備えた代替手段として開発されました。疑わしい場合は、通常、MERGE
が正しい選択です。
MERGE
を考える最も簡単な方法は、MATCH-or-createとして考えることです。つまり、データベース内の何かがMATCH
で使用しているパターンをMERGE
する場合、MERGE
はそのパターンを返すだけです。一致するものがない場合、MERGE
はパターン内に欠落しているすべての要素を作成します。欠落している要素は、バインドされていない識別子を意味します。
与えられた
MATCH (a {uid:123})
MERGE (a)-[r:LIKES]->(b)-[:LIKES]->(c)
「a」は、MERGEの観点から見たバインドされた識別子です。これは、サイファーがそれが表すノードを何らかの形ですでに知っていることを意味します。
このステートメントには2つの結果があります。パターン全体がすでに存在し、何も作成されないか、パターンの一部が欠落し、パターンに一致するまったく新しい関係とノードのセットが作成されます。
例
// Before merge:
(a)-[:LIKES]->()-[:LIKES]->()
// After merge:
(a)-[:LIKES]->()-[:LIKES]->()
// Before merge:
(a)-[:LIKES]->()-[:OWNS]->()
// After merge:
(a)-[:LIKES]->()-[:OWNS]->()
(a)-[:LIKES]->()-[:LIKES]->()
// Before merge:
(a)
// After merge:
(a)-[:LIKES]->()-[:LIKES]->()