Linked Open Data・統計LOD
統計LODとは
統計LODとは, 政府統計の総合窓口であるe-Statの情報を Linked Open Dataの形式で提供するサービスのことです. 国勢調査,人口推計,住民基本台帳人口移動報告,経済センサスなど, 国が調査したデータが管理されており, SPARQLのエンドポイントを介してデータの検索・取得が可能です. 今回は統計LODから東海三県における国勢調査の人口データを取得してみましょう.
ウェブページの作成
SPARQLの検索結果を表示するページを作成しましょう. 最初に index.html にリンクを追加します. 検索結果を表示するページは,lod.py というファイル名のCGIプログラムで作成します.
<ul>
<li><a href="cgi-bin/js-api.py">ジャパンサーチ 簡易Web API</a></li>
<li><a href="cgi-bin/js-sparql.py">ジャパンサーチ SPARQL</a></li>
<li><a href="cgi-bin/dbpedia.py">DBPedia</a></li>
<li><a href="cgi-bin/lod.py">統計LOD</a></li>
</ul>
SPARQLで検索
統計LODのSPARQLのエンドポイントは下記のURLです.
http://data.e-stat.go.jp/lod/sparql/alldata/query
SPARQLの検索条件は下記のように記述します. 今回取得するのは,URL,ラベル(rdfs:label), 人口(estat-measure:population),年(cd-dimension:timePeriod)の4つのデータです. ここで,対象のデータセットとして, 2010年の国勢調査を対象としています. また,検索結果から 愛知県, 岐阜県,三重県の文字がラベルに含まれるコンテンツだけを抽出しています.
SELECT ?url ?label ?population ?year WHERE{
?url qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/d0003041389>;
g00200521-dimension-2010:area g00200521-code-2010:area-all;
sdmx-dimension:refArea [
rdfs:label ?label
];
estat-measure:population ?population;
cd-dimension:timePeriod ?year;
cd-dimension:sex cd-code:sex-all;
cd-dimension:nationality cd-code:nationality-japan;
cd-dimension:age cd-code:age-all.
FILTER(
CONTAINS(str(?label), "愛知県") ||
CONTAINS(str(?label), "岐阜県") ||
CONTAINS(str(?label), "三重県")
)
}
新規に lod.py を作成し,cgi-binフォルダに配置します(実行権限の付与が必要). lod.py には下記のコードを記述します.
#!/usr/bin/env python
from SPARQLWrapper import SPARQLWrapper, JSON
print ("Content-type:text/html\n\n")
print("<!DOCTYPE html>")
print("<html>")
print("<head>")
print("<meta charset='utf-8'>")
print("<title>統計LOD</title>")
print("</head>")
print("<body>")
print("<h1>統計LOD</h1>");
print("</body>")
url = "http://data.e-stat.go.jp/lod/sparql/alldata/query"
sparql = SPARQLWrapper(url)
sparql.setReturnFormat(JSON)
prefix = """
PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX g00200521-dimension-2010: <http://data.e-stat.go.jp/lod/ontology/g00200521/dimension/2010/>
PREFIX g00200521-code-2010: <http://data.e-stat.go.jp/lod/ontology/g00200521/code/2010/>
PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX estat-measure: <http://data.e-stat.go.jp/lod/ontology/measure/>
PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/>
PREFIX cd-code: <http://data.e-stat.go.jp/lod/ontology/crossDomain/code/>
"""
query = """
SELECT ?url ?label ?population ?year WHERE{
?url qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/d0003041389>;
g00200521-dimension-2010:area g00200521-code-2010:area-all;
sdmx-dimension:refArea [
rdfs:label ?label
];
estat-measure:population ?population;
cd-dimension:timePeriod ?year;
cd-dimension:sex cd-code:sex-all;
cd-dimension:nationality cd-code:nationality-japan;
cd-dimension:age cd-code:age-all.
FILTER(
CONTAINS(str(?label), "愛知県") ||
CONTAINS(str(?label), "岐阜県") ||
CONTAINS(str(?label), "三重県")
)
}
"""
sparql.setQuery(prefix + query)
results = sparql.query().convert()
table = "<table border=`1``>"
table += "<tr>"
table += "<th>label</th>"
table += "<th>population</th>"
table += "<th>year</th>"
table += "</tr>"
for result in results["results"]["bindings"]:
url = result['url']['value']
label = result['label']['value']
population = result['population']['value']
year = result['year']['value']
table += "<tr>"
table += f"<td><a href={url}>{label}</a></td>"
table += f"<td>{population}</td>"
table += f"<td>{year}</td>"
table += "</tr>"
print(table)
print("</html>")
下記が検索結果です. 岐阜県は2,037,175人,愛知県は7,174,451人,三重県は1,812,500人 であることが確認できます.