Neo4jをはじめよう - (2) データを投入する

Neo4jをはじめよう - (1) インストール - ふゆみけ〜おかわり〜

の続き

前回の最後で「Twitterのデータを投入!」とか息巻いてましたが、API制限キツくて色々めんどくさいのでここはSNA(社会ネットワーク分析)用のサンプルデータを使うことにします。

「SNAって何やねん」って人はこのエントリでも見ればいいんじゃないでしょうか。

d.hatena.ne.jp

使用するデータ

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形式に変換してやります。

gistcdd6b2ee69af071e76d9

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)

f:id:fuyumi3:20150423175015p:plain

MATCH ()-[r]->() RETURN COUNT(r)

f:id:fuyumi3:20150423175126p:plain

せっかくだから次数中心性を出してみる

MATCH (node)-[r:FRIEND]-() RETURN node, count(r) AS degree ORDER BY degree DESC LIMIT 100

f:id:fuyumi3:20150423175758p:plain

次回

次数中心性だけじゃなくて近接中心性や媒介中心性も出してみる

*1:Wikipediaでは「インターネットユーザーがブログ、記事(ジャーナル)、日記を掲載し保持できる仮想共同体の一種」と説明されており、つまりどういうことだってばよ