LoginSignup
51
53

More than 5 years have passed since last update.

RubyとグラフデータベースNeo4jでソーシャルデータをいじくる

Last updated at Posted at 2015-06-02

Neo4jって何?

Neo4jはJavaで実装された、 オープンソースの最も人気のあるグラフデータベースです。
グラフデータベースでは、データセット全体をひとつの巨大な高密度ネットワーク構造としてモデル化します。

How-to-participate-in-GovHack_html_m6006eaf3.jpg

細かい説明は、ここを見てください。

Neo4jでできること

グラフデータをそのままの構造でデータベースに保存することができて、そのグラフデータを元に検索やデータの引き出しなどができます。

グラフデータベースの構造は至ってシンプルで、以下の3つで構成されています。

  • node:関係を持つ対象
  • relation:方向を有する関係性
  • property:ノードとリレーションシップが持つ属性

具体的に、弊社で運営しているTalentBaseのデータ構造をグラフデータベースで管理したらどんなことが出来るかをまとめてみます。

TalentBaseの場合、
- node:ユーザー、企業、求人
- relation:社員、いいね!、フォロー、応募、応援、気になる、保有、メッセージ送付、評価など
- property:ノードやリレーションが持つ特性全て
という具合になります。

この状態をそのままDBに持てるってのは、幸せなことです。

実際のデータで使ってみる

まずはgemをインストール

gem 'neography'                                                                                                                                                        
gem 'neo4j-cypher'
bundle install
neo4j_test.rb
#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をシェアするというアクションがあるので、
シェアのログデータを使ってグラフデータベースに登録してみます。

neo4j_test.rb
#上のコードに追記
JobShare.find_each do |job_share|
  #userからjobに対してshareというrelationを持たせる
  @neo.create_relationship(:share,node_user,node_job)
end

これでnodeとrelationの登録が完了。
少しグラフらしくなってきてこんな感じ。

求人シェアグラフ.png

このグラフデータからだと、userAがjob1とjob2をシェアしてて、他のグラフデータも見てみると、次はjob3をシェアするんじゃないか?ってことをレコメンドできたりします。

同様にして、うちの会社(アトラエ)の社員同士のいいね!データを登録してみるとこんな感じ。

アトラエ社員同士のいいね!.png

このデータからは、誰が誰をfacebook上で気にしているかとか、社内の人間関係に近いことが分かってきます。

relationにもpropertyを持たせたり、indexを持たせたりすることができて、nodeやrelationで検索や探索が出来るようになります。

具体的には、
userAとuserBが共にシェアしてる求人とか、
userAの友達とuserBの友達が両方シェアした記事とか、
userAとuserBが両方好きと言っている異性とか、
ノード間の関係性で表すことのできるあらゆるデータをグラフのまま扱うことが出来るのが、ステキ!

まとめ

ノードと関係性をもつデータを持っていて、そのグラフデータを活用して分かることを増やしたり、ユーザーに対する価値を高めたいという思いのある人には有用なデータベースだと思います。

しかもrubyやpythonなどで使えるwrapperもあるので、かなり扱いやすいです。

複数のノード間の複数の関係性を持つ際に、そのグラフデータから新しいことを発見したり、新しい関係性を見つけたり提案できたりするデータベースとして、具体的に利用してみたいと思いました。

51
53
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
53