##Neo4jって何?
Neo4jはJavaで実装された、 オープンソースの最も人気のあるグラフデータベースです。
グラフデータベースでは、データセット全体をひとつの巨大な高密度ネットワーク構造としてモデル化します。
細かい説明は、ここを見てください。
##Neo4jでできること
グラフデータをそのままの構造でデータベースに保存することができて、そのグラフデータを元に検索やデータの引き出しなどができます。
グラフデータベースの構造は至ってシンプルで、以下の3つで構成されています。
- node:関係を持つ対象
- relation:方向を有する関係性
- property:ノードとリレーションシップが持つ属性
具体的に、弊社で運営しているTalentBaseのデータ構造をグラフデータベースで管理したらどんなことが出来るかをまとめてみます。
TalentBaseの場合、
- node:ユーザー、企業、求人
- relation:社員、いいね!、フォロー、応募、応援、気になる、保有、メッセージ送付、評価など
- property:ノードやリレーションが持つ特性全て
という具合になります。
この状態をそのままDBに持てるってのは、幸せなことです。
##実際のデータで使ってみる
まずはgemをインストール
gem 'neography'
gem 'neo4j-cypher'
bundle install
#neo4jに接続する
@neo = Neography::Rest.new({:authentication => 'basic', :username => "neo4j", :password => "atrae"})
#ノードを作成する
User.find_each do |user|
node = @neo.create_node("id" => user.id) #ノードを登録
@neo.add_label(node, "User") #ラベルを登録
end
Job.find_each do |job|
node = @neo.create_node("id" => job.id) #ノードを登録
@neo.add_label(node, "Job") #ラベルを登録
end
これで、複数のラベルを持ったノードの登録が完了。
neo4jの管理画面で見るとこんな感じ。
次は各ノードの関係性(relation)を作成していきます。
TalentBaseの場合、例えばuserがjobをシェアするというアクションがあるので、
シェアのログデータを使ってグラフデータベースに登録してみます。
#上のコードに追記
JobShare.find_each do |job_share|
#userからjobに対してshareというrelationを持たせる
@neo.create_relationship(:share,node_user,node_job)
end
これでnodeとrelationの登録が完了。
少しグラフらしくなってきてこんな感じ。
このグラフデータからだと、userAがjob1とjob2をシェアしてて、他のグラフデータも見てみると、次はjob3をシェアするんじゃないか?ってことをレコメンドできたりします。
同様にして、うちの会社(アトラエ)の社員同士のいいね!データを登録してみるとこんな感じ。
このデータからは、誰が誰をfacebook上で気にしているかとか、社内の人間関係に近いことが分かってきます。
relationにもpropertyを持たせたり、indexを持たせたりすることができて、nodeやrelationで検索や探索が出来るようになります。
具体的には、
userAとuserBが共にシェアしてる求人とか、
userAの友達とuserBの友達が両方シェアした記事とか、
userAとuserBが両方好きと言っている異性とか、
ノード間の関係性で表すことのできるあらゆるデータをグラフのまま扱うことが出来るのが、ステキ!
##まとめ
ノードと関係性をもつデータを持っていて、そのグラフデータを活用して分かることを増やしたり、ユーザーに対する価値を高めたいという思いのある人には有用なデータベースだと思います。
しかもrubyやpythonなどで使えるwrapperもあるので、かなり扱いやすいです。
複数のノード間の複数の関係性を持つ際に、そのグラフデータから新しいことを発見したり、新しい関係性を見つけたり提案できたりするデータベースとして、具体的に利用してみたいと思いました。