[neo4j] neo4jでノード間のリンクの付け替えを行う処理

備忘録のエントリです。

グラフDBを復習がてらに使った際に気になったことなのですが、ノード間のリンクを簡単に貼り直す方法は無いかなというのが問題意識です。結論から言うと既存のリンクを削除&新たなリンクを作るしかなさそうでした。

ユースケースの例

例えば開発部に所属する田中さんが、運用部に移籍するというケースを想定してみます。

「田中さんが開発部に所属」というのをneo4jのcypherで書くと、例えばこんな感じ


create (:Division {name:"開発部"}), (:Division {name:"運用部"}), (:Person {name:"田中"})

match (p:Person), (d:Division {name:"開発部"}) merge (p)-[:所属]->(d) return p,d

この状態から、運用部に移籍=開発部に張っているリンクを運用部に付け替える処理です。リンク先の”name”属性を変えるだけだとダメだろうなあと思いつつ、ダメ元で試したら、やはりダメ。


match (n:Person {name:"田中"})-[r:所属]->(d) set d.name="運用部"

既存の「開発部」ノードの名前の属性値が変わるだけになってしまいました。

リファレンスを見た感じだと、リンク先を直接に変更できる記法を見つける事が出来ず、一度対象のリンクを切って、新しいノードへのリンクを作るのが泥臭いですが、確実なのでしょう。cypher一発で実行しようとすると次のような感じでしょうか。


match (p:Person)-[r:所属]->(old:Division), (new:Division)
where p.name = "田中" and old.name ="開発部" and new.name="運用部"
delete r
create (p)-[:所属]->(new)

 

これでひとまず望む形となりました。もっと良いcypherの書き方があるのかもしれませんが、まずはこんなところで。