SPARQLのクエリ学習とDBpediaを理解するため思いつきでクエリを作っていく。
新潟は上越新幹線と北陸新幹線が通っていて新幹線の駅数が多いのでは??という思いつきからDBpediaで新潟県にある新幹線の駅を調べてみることに。
新幹線の駅名を取得する
まずは新幹線の駅を示すプロパティを探してみる。
日本語版DBpediaで新潟駅を見てみると、新幹線を直接指定するプロパティはないものの、dbpedia-owl:servingRailwayLineで駅を通る路線を示すものがあった。これを使って新幹線の路線→駅へと絞り込んでいく。
上越新幹線の駅を取得する。
select ?s where {
?s dbpedia-owl:servingRailwayLine dbpedia-ja:上越新幹線 .
}
<実行結果>
当然だがこのクエリでは新潟県以外の都道府県の駅も含んでいる。
それぞれの住所を見てみると以下の通り。
select ?s ?o where {
?s dbpedia-owl:servingRailwayLine dbpedia-ja:上越新幹線 ;
dbpedia-owl:address ?o .
}
<実行結果>
新潟県の駅を調べたいので住所の都道府県名からFILTERで絞り込みたかったが新潟駅や大宮駅は都道府県が入っていないことが判明。。。
どうしたものかと他の項目を見ていると、コメントに新潟県の文字が!
他の駅のコメントを確認してみる。
select ?s ?o where {
?s dbpedia-owl:servingRailwayLine dbpedia-ja:上越新幹線 ;
rdfs:comment ?o .
}
<実行結果>
結果をみると上越新幹線の各駅は全てコメントに都道府県が入っている。トリプルパターンを指定する方法として美しさは感じないがこれで妥協することに。
ここまでで駅名とその都道府県が取得できるようになった。
あとは上越新幹線のみ指定した箇所をを全ての新幹線の路線に拡張する。
dbpedia-owl:servingRailwayLineにより取得される路線には新幹線以外の路線も含まれる。
これまた邪道と思われるトリプルパターンの指定方法かもしれないが、新幹線の各路線は"〇〇新幹線"となっていることからfilterで絞り込むことに。
select ?s ?line where {
?s dbpedia-owl:servingRailwayLine ?o .
?o rdfs:label ?line .
filter contains(?line, "新幹線")
}
<実行結果>
これで全ての新幹線の路線における駅名、駅のある都道府県名が取れるようになったので2つのクエリを組み合わせて新潟県に絞り込んだ駅名の一覧を取得す
select ?s ?line ?comment where {
?s dbpedia-owl:servingRailwayLine ?o .
?o rdfs:label ?line .
filter contains(?line, "新幹線")
?s rdfs:comment ?comment .
filter contains(?comment, "新潟県")
}
<実行結果>
ということで全部で8駅新潟には新幹線の駅があることがわかりました。JRさんのページで確認したところ、見事に一致!!
感想
本当は都道府県ごとの駅数のランキングを作りたかったが、新幹線の駅を示すプロパティがない、駅の所在地の記載に都道府県が入っていない、ということからそこまでたどり着けなかった。自分でRDFの設計をする際に何を目的とするか、その際にどこに気を遣えばよいかがなんとなくわかってきた気がする。