導入
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["新しいノードを作成する"]
CREATE と MERGE の違いをまとめると、次のようになります。
| CREATE | MERGE | |
|---|---|---|
| 動き | 常に新規作成 | 無ければ作成・あれば既存を使う |
| 同じクエリを2回実行 | ノードが2つになる | ノードは1つのまま |
| 向いている用途 | 確実に新しく作りたいとき | 重複を防ぎたい・繰り返し実行されうるとき |
リレーションシップにも MERGE は使えます。
MATCH (a:Person {name: 'Alice'}), (m:Movie {title: 'The Matrix'})
MERGE (a)-[:ACTED_IN]->(m)
同じデータを何度読み込んでも安全(これを**冪等(べきとう)**であるといいます)にしたいときは、CREATE ではなく MERGE を使うのが実務での基本方針です。