導入
この章の最後に、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 を多用できるようになります。
次章では、集計(count・collect など)や WITH・UNWIND といった、より高度なクエリの組み立て方を学びます。