Neo4jをはじめよう - (2) データを投入する
Neo4jをはじめよう - (1) インストール - ふゆみけ〜おかわり〜
の続き
前回の最後で「Twitterのデータを投入!」とか息巻いてましたが、API制限キツくて色々めんどくさいのでここはSNA(社会ネットワーク分析)用のサンプルデータを使うことにします。
「SNAって何やねん」って人はこのエントリでも見ればいいんじゃないでしょうか。
使用するデータ
SNABook/chapter3 at master · maksim2042/SNABook · GitHub
上述した勉強会で使った『オープンソースで学ぶ社会ネットワーク分析』という本の3章のデータを使います。
LiveJournal.comとかいうSNS(?)*1から、とあるユーザーの友人、友人の友人、友人の友人の友人……を深さ3で取得したデータ。
node数は87,250、edge数は143,120と、遊び用のデータとしてはなかなかいい感じな規模感。
サンプルデータをNeo4に投入
csvに変換
では、このデータセットをneo4jに投入してみましょう。サンプルデータはPajekというネットワーク分析ツールで使うデータ形式で保存されており、このままではロードできません。
neo4jで外部ソースからインポートするにはcsvファイルを使います。
12.8. Importing CSV files with Cypher - - The Neo4j Manual v2.2.1
そこで、今回はnetworkxというPythonのネットワーク分析用ライブラリを使って、Pajekのデータ形式をneo4jが読み込めるcsv形式に変換してやります。
nodeとedgeで別ファイルで、結果はこんな感じに。
nodes.csv
id,name 17872,zhuravl 19609,kir_a_m 51320,vizu_buduwee 21481,na_stasja 66039,aernmru ...
edges.csv
start,end,weight zhuravl,milavalyacat,1.0 zhuravl,a_u,1.0 kir_a_m,cheger,1.0 vizu_buduwee,johnjthunderer,1.0 ...
cypherで読み込み
あとはこいつをcypherを使って読み込みます。
前回のエントリ通りvagrantで仮想マシンを立ち上げていれば、Vagrantfileと同じディレクトリにこのcsvファイルを設置すれば仮想マシン上からも/vagrant
でアクセス可能ですね。
ブラウザ経由でアクセスして次のコマンドを叩いてやりましょう。
LOAD CSV WITH HEADERS FROM "file:///vagrant/nodes.csv" AS csvLine CREATE (n:Person {id: toInt(csvLine.id), name: csvLine.name})
LOAD CSV WITH HEADERS FROM "file:///vagrant/edges.csv" AS csvLine MATCH (m:Person), (n:Person) WHERE m.name = csvLine.start AND n.name = csvLine.end CREATE (m)-[r:FRIEND {weight: toFloat(csvLine.weight)}]->(n)
データのインポートには結構メモリを食うようで、vagrantのデフォルトで割り当てられているメモリ(300Mぐらいだったか?)だと「ヒープが溢れたよ」ってエラーになって成功しません。カッとなってVagrantfileを書き換えて2G割り当てたら成功しました。
正常に読み込めたか確認する
MATCH (n) RETURN COUNT(n)
MATCH ()-[r]->() RETURN COUNT(r)
せっかくだから次数中心性を出してみる
MATCH (node)-[r:FRIEND]-() RETURN node, count(r) AS degree ORDER BY degree DESC LIMIT 100
次回
次数中心性だけじゃなくて近接中心性や媒介中心性も出してみる