導入
MERGE には、「新規作成されたとき」と「既存のものが見つかったとき」でそれぞれ違う処理をしたい場合のための拡張構文があります。
説明
ON CREATE SET は新規作成された場合だけ、ON MATCH SET は既存のものが見つかった場合だけ実行されます。
MERGE (p:Person {name: 'Alice'})
ON CREATE SET p.createdAt = timestamp(), p.visits = 1
ON MATCH SET p.visits = p.visits + 1
このクエリは、いわば「アクセスカウンタ」のような動きをします。
flowchart TD
Q["MERGE (p:Person {name:'Alice'})"] --> C{既にある?}
C -- 初めて --> N["ON CREATE SET<br/>createdAt を記録・visits=1"]
C -- 既にある --> M["ON MATCH SET<br/>visits を+1する"]
- 初めて
Aliceに対してこのクエリが実行されたときは、ON CREATE SETが働き、createdAt(作成日時)を記録してvisits(訪問回数)を1に設定します。 - 2回目以降は
ON MATCH SETが働き、既存のvisitsの値に1を加算します。
timestamp() は、現在時刻をミリ秒単位の数値で返すNeo4jの組み込み関数です。「初回だけ記録したい情報」と「毎回更新したい情報」を1つのクエリで書き分けられるため、ログイン履歴やアクセス統計のような「訪れるたびに数える」処理でよく使われるパターンです。