LoginSignup
2
1

More than 3 years have passed since last update.

グラフDBのNeo4jで都内の路線図っぽいのを作成

Posted at

Neo4jを使用して都内の駅関係を示す

今回は、駅情報から駅と駅の繋がりをグラフDBに作成しようと思います.

駅情報のソース

今回は、以下サイトの情報を利用します.
駅データ.jp
こちらのサイトでは無料版で駅情報を取得することが可能です.
使用したデータは、駅データと接続駅データの2種類です.

Neo4jに駅ノードの作成

まず、はじめに駅データから都内の駅のみを抽出してNeo4j上にノードを作成します.

node_create.rb
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を実行したのが以下の図です.

スクリーンショット 2019-08-03 14.25.43.png

駅ノードが作成できていることがわかります.
node作成時に、uniqueキーにstation_codeでなくstation_g_cdを指定しているのは同名駅の重複を防ぐためです.

駅の接続関係を表す.

次は、駅と駅の繋がりを表すために接続駅データを用います.
ノード間にrelationship名”connection"を持たせます.

node_connection.rb
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を作成しないように気をつける必要があります.ノード作成時に複数の同名駅を纏めて保存しているので.

実行結果が以下です.(東京駅を中心に表示しています)

スクリーンショット 2019-08-03 14.32.56.png

終わり

データセットを作成するのが大変なので今回は、駅データを利用しました.

2
1
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
2
1