SPARQLで重複しているデータを識別する

オープンデータプラットフォームのSPARQL Endpointには複数の自治体の情報が格納されています。
その中には同じ施設や同じ統計情報を指しているものも含まれます。
単純に羅列したり合算してしまうと、同じ施設が地図上に表示されたり、人口の総計が何倍かになってしまいます。
そこで、重複して登録されているデータを識別して除外したりする手法をご紹介します。

 

下記は2010年時点の福井県鯖江市の20歳の人の人口を取得するSPARQLクエリーとその結果です。

PREFIX odp: <http://odp.jig.jp/odp/1.0#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dcterms:<http://purl.org/dc/terms/> 
PREFIX ic: <http://imi.ipa.go.jp/ns/core/rdf#>

select ?s ?value ?publisher { graph ?g {
?s rdf:type odp:PopulationStatistics ;
   odp:refYear "2010"^^xsd:gYear ;
   odp:refArea [ 
     ic:住所 [ ic:都道府県 "福井県"@ja ; ic:市区町村 "鯖江市"@ja ] 
   ] ;
   odp:refAge [ odp:maximum 20 ; odp:minimum 20 ] ;
   odp:population [ rdf:value ?value ] ;
.
} .
?g dcterms:publisher [ rdfs:label ?publisher ] .
}
ORDER BY ?s
LIMIT 10

?s	?value	?publisher
<http://odp.jig.jp/jp/fukui/385#2010/18207/20/20/>	496	"福井県"
<http://odp.jig.jp/jp/fukui/sabae/447#2010/18207/20/20/>	496	"福井県鯖江市"
<http://odp.jig.jp/jp/go/soumu/stat/392#2010/18207/20/20/>	496	"総務省統計局"

 

結果にはそれぞれ、福井県、鯖江市、統計局が公開しているデータが出力されています。
これらを全て使って人口総計を計算してしまうと3倍の値になってしまいます。

 

そこで、owl:sameAsプロパティの値を取得して、他のデータの?sと比較します。
そうすることで同じデータを重複して処理することを避けることができるのです。

 

PREFIX odp: <http://odp.jig.jp/odp/1.0#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dcterms:<http://purl.org/dc/terms/> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX ic: <http://imi.ipa.go.jp/ns/core/rdf#>

select ?s ?sameAs ?value ?publisher { graph ?g {
?s rdf:type odp:PopulationStatistics ;
   odp:refYear "2010"^^xsd:gYear ;
   odp:refArea [ 
     ic:住所 [ ic:都道府県 "福井県"@ja ; ic:市区町村 "鯖江市"@ja ] 
   ] ;
   odp:refAge [ odp:maximum 20 ; odp:minimum 20 ] ;
   odp:population [ rdf:value ?value ] ;
   owl:sameAs ?sameAs ;
.
} .
?g dcterms:publisher [ rdfs:label ?publisher ] .
}
ORDER BY ?s
LIMIT 10

?s	?sameAs	?value	?publisher
<http://odp.jig.jp/jp/fukui/385#2010/18207/20/20/>	<http://odp.jig.jp/jp/fukui/sabae/447#2010/18207/20/20/>	496	"福井県"
<http://odp.jig.jp/jp/fukui/385#2010/18207/20/20/>	<http://odp.jig.jp/jp/go/soumu/stat/392#2010/18207/20/20/>	496	"福井県"
<http://odp.jig.jp/jp/fukui/sabae/447#2010/18207/20/20/>	<http://odp.jig.jp/jp/fukui/385#2010/18207/20/20/>	496	"福井県鯖江市"
<http://odp.jig.jp/jp/fukui/sabae/447#2010/18207/20/20/>	<http://odp.jig.jp/jp/go/soumu/stat/392#2010/18207/20/20/>	496	"福井県鯖江市"
<http://odp.jig.jp/jp/go/soumu/stat/392#2010/18207/20/20/>	<http://odp.jig.jp/jp/fukui/385#2010/18207/20/20/>	496	"総務省統計局"
<http://odp.jig.jp/jp/go/soumu/stat/392#2010/18207/20/20/>	<http://odp.jig.jp/jp/fukui/sabae/447#2010/18207/20/20/>	496	"総務省統計局"

 

?sameAsの値が他のデータの?sと同じになっているのが分かると思います。
この情報を元に重複しているデータを識別すれば、同じデータを何回も処理するのはさけることができます。

 

下記のアプリでは人口の総計と避難所の数について重複したデータを使わないようにしているので参考にしてみてください。
避難所足りてますか?

カテゴリー