本文へスキップ
BecomeCoder

Neo4jコース · 第5章 データを更新する · レッスン23

重複を防いで作る ― MERGE

ブラウザで完結

導入

CREATE は実行するたびに必ず新しいノードを作ります。同じクエリを2回実行すると、同じ人物が2人できてしまう、ということが起こり得ます。この問題を解決するのが MERGE です。

説明

MERGE は「指定したパターンに一致するものが既にあればそれを使い、なければ新しく作る」という動きをします。

MERGE (p:Person {name: 'Alice'})
RETURN p

このクエリを何度実行しても、name: 'Alice'Person ノードは1つしか作られません。1回目の実行では新規作成され、2回目以降は既存のノードがそのまま見つかって返されます。

flowchart TD
    Q["MERGE (p:Person {name:'Alice'})"] --> C{一致するノードは<br/>既にある?}
    C -- ある --> U["既存のノードを使う<br/>(新規作成しない)"]
    C -- ない --> N["新しいノードを作成する"]

CREATEMERGE の違いをまとめると、次のようになります。

CREATEMERGE
動き常に新規作成無ければ作成・あれば既存を使う
同じクエリを2回実行ノードが2つになるノードは1つのまま
向いている用途確実に新しく作りたいとき重複を防ぎたい・繰り返し実行されうるとき

リレーションシップにも MERGE は使えます。

MATCH (a:Person {name: 'Alice'}), (m:Movie {title: 'The Matrix'})
MERGE (a)-[:ACTED_IN]->(m)

同じデータを何度読み込んでも安全(これを**冪等(べきとう)**であるといいます)にしたいときは、CREATE ではなく MERGE を使うのが実務での基本方針です。

実際に動かしてみよう

下のエディタに Cypher を書いて「実行」を押すと、ブラウザ内の学習用グラフDBで結果が表示されます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです)。最初から「映画と俳優+小さなソーシャルグラフ」が入っているので、MATCH 系の例はそのまま結果が返ります。CREATE / MERGE / SET などで書き換えた状態は積み重なり、「グラフを初期状態に戻す」でいつでもサンプルに戻せます。

Cypher — ブラウザ内で実行(学習用グラフDB)

Cypherクエリを書いて実行できる学習用グラフDBを読み込みます(本物のNeo4jではなく、教材の範囲を再現した軽量な自作エンジンです。映画と俳優の小さなサンプルグラフが最初から入っています)。
スクロールして表示された時点でも自動で読み込まれます。