web-dev-qa-db-ja.com

Neo4jでのマージとユニークな作成の違い

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。

25
EdWood

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]->()
33