ラーメンデータベースとNeo4j

ラーメンデータベース

私はラーメンデータベースという、ラーメンのレビューサイトに参加して、日々ラーメンのレビューをアップしていたりするのだけど、レビューサイトの常として、投稿したレビューに対して他のユーザがコメントをつけたりすることができる。
なので、「コメントをつけてくれたユーザは知り合いである」として(あまりヘイトコメントはラーメンデータベースには投稿されない)、ユーザをノードに、レビューに対するコメントを関連と位置付け、グラフデータベース化して可視化してみようと思った。

元データ収集

とりあえずグラフデータベースに投入するデータを収集しなくてはならない。
いろいろ考えたが、以下のルールで収集することにした。

  • 指定したユーザ直近10件のレビューに対してコメントしたユーザをノードとして登録する。
  • コメントは関連として登録する。
  • さらにそのユーザに対してコメントしたユーザをノードとして登録する。そのコメントも関連として登録する。

要するに、「指定ユーザを基点知り合いの知り合い」までを収集する。

勿論手動ではやってられないので、ラーメンデータベースのページに記述されているHTMLをパースしてxpathで必要な情報を収集→さらにHTMLを収集という感じのプログラムを書いてみた。
このプログラムを動かすと「知り合い・知り合いの知り合い」までのユーザ情報のCSVと、ユーザ間のコメント(関連)のCSVファイルを生成する。

データロード

で、生成したCSVファイルをNeo4jのノードと関連として生成するローダを作成する。
ちょっと面倒なのが、Neo4jの関連生成。
関連を生成するときにNeo4jが管理しているノードID(ノード生成時に払い出される番号)を各ユーザ情報のオブジェクトに設定し、関連生成時には別のキーを与えて、そのノードIDを渡す必要がある。まあ、ちょっと面倒なだけで難しくはない。

検証結果

とりあえず、自分(ぬこ@横浜)を基点とした情報を収集して、Neo4jに投入した。
投入後に、Neo4jの管理ツール上で表示してみる。

ちなみに赤いノードが神奈川県を活動拠点としているユーザ。
青は東京都、緑は千葉県、黄色は埼玉県、黒はその他(または不明)を示す。
こうやってみると、俺ってほとんど神奈川と東京のユーザとしか付き合いないんだな・・・みたいなことがなんとなくわかる。

収集プログラム自体は基点ユーザを複数指定可能なので、ラーメンデータベースの有名なユーザ(注目ユーザランキングや2chで叩かれているユーザwなど)を収集して、最近のラーメンデータベース内のソーシャル分析っぽいこともできるかもしれない(ちょっと収集に時間がかかるのが現状のプログラムの欠点ではあるが・・・)。

本当の目的

本当の目的はこういう生きたデータに対してCypherクエリを使って、どういうグラフデータベースらしい検索ができるのかを検証すること。
そういう意味では、もっと多くのユーザを基点とする情報を集めておきたい。
あんまりやり過ぎるとラーメンデータベース運営に怒られるかもしれんがw