Neo4jを使用して都内の駅関係を示す
今回は、駅情報から駅と駅の繋がりをグラフDBに作成しようと思います.
駅情報のソース
今回は、以下サイトの情報を利用します.
駅データ.jp
こちらのサイトでは無料版で駅情報を取得することが可能です.
使用したデータは、駅データと接続駅データの2種類です.
Neo4jに駅ノードの作成
まず、はじめに駅データから都内の駅のみを抽出してNeo4j上にノードを作成します.
require 'csv'
require 'neography'
@neo=Neography::Rest.new({:authentication =>'basic',:username =>"neo4j",:password =>"****"})#Neo4jへの接続情報
i=0
CSV.foreach("./stations.csv") do |row| #station.csvは駅データをcsvに変換したものです.
if row[6]=="13" then #row[6]は、都道府県コード(pref_cd)で、pref_cd=13が東京です.
station_code=row[0]
station_g_cd=row[1]
station_name=row[2]
line_cd=row[5]
e_sort=row[14]
node1=@neo.create_unique_node("Tokyo_of_Station_Test","station_id",station_g_cd ,{"station_name"=>station_name,"station_g_cd"=>station_g_cd,"line_cd"=>line_cd,"e_sort"=>e_sort})
#駅ノードを作成
@neo.add_label(node1,"Tokyo_of_Station_Test")#labelを付けます.
@neo.add_node_to_index("Tokyo_of_Station_Test", "station_code", station_code, node1)
end
i+=1
end
p i
こちらで駅データのノード作成が完了です.
MATCH (n:Tokyo_of_Station_Test) RETURN n LIMIT 25を実行したのが以下の図です.
駅ノードが作成できていることがわかります.
node作成時に、uniqueキーにstation_codeでなくstation_g_cdを指定しているのは同名駅の重複を防ぐためです.
駅の接続関係を表す.
次は、駅と駅の繋がりを表すために接続駅データを用います.
ノード間にrelationship名”connection"を持たせます.
require 'csv'
require 'neography'
@neo=Neography::Rest.new({:authentication =>'basic',:username =>"neo4j",:password =>"****"})#Neo4jへの接続です.
CSV.foreach("./station_connect.csv") do |row| #station_connectは接続駅データのcsvです.
n= @neo.get_node_index("Tokyo_of_Station_Test","station_code",row[1])#indexからノードを取得します.
begin
no1= n[0]#始点ノード
s1=no1["data"]["station_g_cd"].to_i
n2=@neo.get_node_index("Tokyo_of_Station_Test","station_code",row[2])
no2=n2[0]#終点ノード
s2=no2["data"]["station_g_cd"].to_i
if s1>s2#Uniqueキー作成
connect=s1,"->",s2
else
connect=s2,"->",s1
end
@neo.create_unique_relationship("Tokyo_of_Station_Test","station_connct",connect,:connection,no1, no2)
rescue
#Error処理
end
end
こちらで駅の接続関係を保存することができました.(Neo4jは無向グラフをサポートしていません.無向グラフを利用したい場合は一方向のリレーションを結んでおき、データ照会を行なう際にリレーションの向きを無視するよう照会する方法が推奨されています。)
relationshipを設定する際には、重複してrelationを作成しないように気をつける必要があります.ノード作成時に複数の同名駅を纏めて保存しているので.
実行結果が以下です.(東京駅を中心に表示しています)
終わり
データセットを作成するのが大変なので今回は、駅データを利用しました.