雑多なノート

プログラミング初心者がメモとかを書きます。基礎的なこともメモとして。偏食系のアニオタ。

無かったら作成,有ったら更新(Neo4j)

neo4jにはMERGEとかいう無かったら作成,有ったら更新とかいう便利なものがあるらしいので使ってみる

公式ドキュメントの和訳見てみたら例が載ってた

MERGE (n:Person {name: {value}}) ON CREATE SET n.created=timestamp() ON MATCH SET n.counter= coalesce(n.counter, 0) + 1, n.accessTime = timestamp()

MERGEで作成または検索するパターン設定でON CREATEが作成時のパラメーター設定,ON MATCH SETが更新時のパラメーター設定なんだろう
多分

ちなみにcoalesceは最初に見つけたNULLでない値を返す関数らしい
この場合だと値が未設定の場合0を設定するってことか
便利だな

とりあえずちょっと弄ってぶちこんで確認してみる

MERGE (n:Person {name: "Alice"}) ON CREATE SET n.created=timestamp() ON MATCH SET n.counter= coalesce(n.counter, 0) + 1, n.accessTime = timestamp()


f:id:vayacico:20161130190632j:plain
ノードが作成された
createdに現在の時刻(たぶん)が格納されたっぽい


2回目の実行
f:id:vayacico:20161130190646j:plain
accessTimeに時刻が設定されてカウンターが1になった



一応3回目
f:id:vayacico:20161130190653j:plain
どうやら思った通りに動いてる
これは便利だな

MATCH (a:Person {name: "Karen"}), (b:Person {name: "Alice"}) MERGE (a)-[r:LOVES]->(b) ON CREATE SET r.created=timestamp() ON MATCH SET r.counter= coalesce(r.counter, 0) + 1, r.accessTime = timestamp()

こんな感じでリレーションにも使えるみたい
便利