【Neo4j】複数のグラフを扱う方法 | How to treat several graphs in Neo4j database?
最近、NoSQLのグラフデータベース Neo4jを触りだしましたudonsinです。
グラフデータベースということで当然扱う対象はグラフになるのですが、
どうやら現在のNeo4jでは複数のグラフを扱う機能がないようです。
この複数のグラフを扱えないというのは、
Neo4jではデータベースに対して直接ノード(エッジ)を追加するため
どのグラフのノード(エッジ)なのかという情報が抜け落ち、
ひとつの大きなグラフにすべて追加している状態のことです。
イメージとしては、
のようにすべてノード(エッジ)がデータベースに直接乗っています。
複数のグラフを扱うためには、
下の図のようにノード(エッジ)層とデータベース層の間にグラフに相当する層が必要です。
そこで、擬似的に複数のグラフを扱うために、
ひとつのグラフに含まれるすべてのノードにエッジをもつノード(スーパーノード)を
用意して、どのノードがどのグラフに属するのかという情報をもたせます。
グラフG に属するスーパーノード s と繋がているノードは
グラフGに属するノードであることがわかり、
逆にスーパーノードからグラフGに属するノードを取得することができます。
ただ、この方法はノードがグラフに属するかは分かりますが、
エッジがグラフに属するかはトラバースしないとわからないため
エッジの参照を頻繁におこなう場合は向いていないと思われます。
そもそも他のグラフデータベースを検討することも視野に入りますが、
Cypherやグラフビジュアライゼーションが魅力的な点もあり
当面この方法で複数グラフを扱おうと思います。
別の方法として
- graphデータの参照場所を動的に変更
- graphデータを入れ替える
- ノードに属するグラフの属性を追加する
といったことも考えましたが、方法1はgraph.dbの参照先を動的に変更できない、
方法2はgraph.dbを入れ替えてもキャッシュが効いてるため反映されない、
方法3はノードに属するグラフの属性は計算量の点で却下となりました。
もっとよい方法をご存知の方がいらっしゃいましたら教えて下さいm(_ _)m