本文へスキップ
BecomeCoder

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

グラフ更新(MERGE)のまとめ ― データを安全に育てる

ブラウザで完結

導入

この章の最後に、MERGE を中心にした「データを何度実行しても安全に投入する」実務パターンをまとめます。

説明

外部データ(CSVやAPIから取得した映画情報など)をグラフに取り込む場面を考えてみましょう。同じデータを誤って2回読み込んでしまっても壊れないようにしたい、というのはよくある要求です。

MERGE (m:Movie {title: 'The Matrix'})
ON CREATE SET m.released = 1999

MERGE (p:Person {name: 'Keanu Reeves'})
ON CREATE SET p.born = 1964

MERGE (p)-[:ACTED_IN]->(m)

このクエリのポイントは、ノードもリレーションシップもすべて MERGE で書かれていることです。

  • MERGE (m:Movie {title: 'The Matrix'}) … タイトルが一致する映画が無ければ作成、あれば既存のものを使う。
  • MERGE (p:Person {name: 'Keanu Reeves'}) … 同様に、人物も重複させない。
  • MERGE (p)-[:ACTED_IN]->(m) … 2つのノードの間の ACTED_IN 関係も、既にあれば増やさない。

このパターンなら、同じクエリを100回実行しても、できあがるグラフは1回実行したときと変わりません(冪等)。実務でデータを投入するスクリプトを書くときは、「このクエリは2回目以降に実行されても大丈夫か」を常に意識し、基本方針として CREATE ではなく MERGE を使うことをおすすめします。

ただし MERGE は、CREATE に比べて「既存のものがあるかどうかの検索」を毎回行うぶん、コストが高くなります。次章の第7章で扱う**一意性制約(uniqueness constraint)**を事前に設定しておくと、この検索が高速になり、実務でも安心して MERGE を多用できるようになります。

次章では、集計(countcollect など)や WITHUNWIND といった、より高度なクエリの組み立て方を学びます。

実際に動かしてみよう

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

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

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