API利用方法
# 札幌市LOD
札幌市ではオープンデータの相互運用性の向上を目的として一部データについてLOD形式で公開する取組をはじめました。
LODはウェブ上でデータを公開・共有するために広く用いられている方法で、相互運用性に強みがあり、異なるデータを相互に接続して扱いたい場合に最適な手段の一つです。
昨今ではオープンデータの公開方法として採用が広がっています。
## LODによるデータ記述
LODではデータを表現するのに、主語・述語・目的語の組み合わせによる「トリプル」を用います。
たとえば、施設データを表現するには、次のように記述します。
例1)札幌市役所についてトリプルでの表現
- 施設ID(主語)・名称(述語)・札幌市役所(目的語)
- 施設ID(主語)・住所(述語)・札幌市中央区北1条西2丁目(目的語)
- 施設ID(主語)・電話番号(述語)・011-222-4894(目的語)
図1)例1に相当する図
実際には、データをウェブ上で公開し共有するために、主語、述語、目的語、いずれもURIを識別子として用い、次のようなテキストデータとして記述します。
※ 目的語は文字列となるケースもあります
※ 次の例では架空のURIを用いています
例2)札幌市役所についてのLOD記述例
– <http://sparql.pf-sapporo.jp/lod/resource/施設/札幌市役所> <http://sparql.pf-sapporo.jp/vocabulary/sapporov/名称> “札幌市本庁舎” .
– <http://sparql.pf-sapporo.jp/lod/resource/施設/札幌市役所> <http://sparql.pf-sapporo.jp/vocabulary/sapporov/住所> “札幌市中央区北1条西2丁目” .
– <http://sparql.pf-sapporo.jp/lod/resource/施設/札幌市役所> <http://sparql.pf-sapporo.jp/vocabulary/sapporov/電話番号> “011-222-4894” .
LODではトリプルを記述するための技術仕様としてRDF(Resource Description Framework)を採用しています。
詳しくは、W3Cによる仕様などを参照してください。
※ 例2はN-Tripleによる記述例ですが、RDFを記述する方式としてJSONやその他の方式も存在します。
## 公開中のLOD
札幌市では観光や避難場所といった地物に関するデータと統計表の一部をLODとして公開しています。
データ構造は共通語彙基盤をベースとして、実データにあわせて応用しています。
共通語彙基盤について詳しくは、共通語彙基盤のホームページを参照してください。(https://imi.go.jp/goi/)
## 接頭辞
RDFではURIを省略して記述することがよくあります。
このドキュメントの中で使用する接頭辞についてURIとの対応を示します。
– rdf : <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
– rdfs : <http://www.w3.org/2000/01/rdf-schema#>
– xsd : <http://www.w3.org/2001/XMLSchema#>
– ic : <http://imi.ipa.go.jp/ns/core/rdf#>
– sapporov : <http://sparql.pf-sapporo.jp/vocabulary/sapporov/>
– qb : <http://purl.org/linked-data/cube#>
– dct: <http://purl.org/dc/terms/>
### 観光データのモデル
– ネームスペース : http://sparql.pf-sapporo.jp/lod/resource/<観光スポット>/2017/<観光スポットのID>
図2)観光データのモデル図
### 避難場所データのモデル
– ネームスペース : http://sparql.pf-sapporo.jp/lod/resource/<避難場所>/2017/<避難場所のID>
図3)避難場所データのモデル図
### 統計LOD
統計データについても一部をLOD化、統計LODとして公開しています。
LODはウェブ上でデータを公開・共有するための方法で世界中で広く利用されていますが、このLODを統計データに応用したのが統計LODです。
統計LODでは異なる統計表を横断的に集計等の処理をすることが可能となるなどのメリットがあります。
日本国内では独立行政法人統計センターが統計LODの取組をはじめていますが、自治体では札幌市が初めての例となります。
札幌市の統計LODはウェブ技術の標準化団体であるW3Cが策定したキューブモデルのための仕様Data Cube Vocabulary に準拠してデータを作成しています。
詳しくはData Cube Vocabularyの仕様を参照してください。(https://www.w3.org/TR/vocab-data-cube/)
#### キューブモデル
統計表をLODとして表現するにはキューブモデルを用います。
キューブモデルは統計表に含まれる各値にIDを振り出し、さらに次の4つの要素用いて記述します。
表1)キューブモデルを構成する4つの要素(参照:統計センター「統計表とキューブモデル」)
– 観測値(obsesrbation): 観測された値(例.人口の値、人口割合の値)
– 次元(dimension): 観測値を同定するもの(例.市区町村、国籍、年月日、男女別)
– 測度(mesuarement): 観測値の対象(例.人口、人口割合)
– 属性(attribute): 測度の単位(例.人、%)
図4)統計表をキューブモデルとして表現する際の各要素
図5)図4のある値をトリプルで表現した場合
※ 図4および図5は概念的な構造を示すことを目的としており、実際のデータとは異なる部分がありますので注意が必要です
#### データセット
札幌市では原則として一つの統計表と一つのデータセットとして作成しています。
表2)公開中の統計LODデータセット(2018/01/24現在)
タイトル 公開日時 作成者 ウェブサイト上のURL
人口動態 2018年1月18日 札幌市まちづくり政策局政策企画部企画課 http://www.city.sapporo.jp/toukei/jinko/jinko-dotai/jinko-dotai.html
住民基本台帳「札幌市の人口・世帯数(平成29年)」 2018年1月 札幌市まちづくり政策局政策企画部企画課 http://www.city.sapporo.jp/toukei/jinko/juuki/juuki.html#juuki
住民基本台帳 第6表「町名・条丁目別世帯数及び人口」 2018年1月 札幌市まちづくり政策局政策企画部企画課 http://www.city.sapporo.jp/toukei/jinko/juuki/juuki.html#jou-choume
住民基本台帳 第7表「町名・条丁目、年齢(5歳階級)別人口」 2017年10月 札幌市まちづくり政策局政策企画部企画課 http://www.city.sapporo.jp/toukei/jinko/juuki/juuki.html#jou-choume-5
#### スライス
統計表では同じ次元の組み合わせを持つ観測値が複数存在しますが、それらをまとめたグループをスライスと呼びます。
具体的には、スライスを定義しておくことで統計表の列や行の単位で一括で扱うことが可能となります。
#### IRIの命名規則
札幌市の統計LODでは以下のルールに従ってIRIを振り出しています。
表3)札幌市が公開する統計LODのIRI命名規則
– データセット(統計表): http://sparql.pf-sapporo.jp/lod/stats/<統計名>/<統計表のID>
– 観測値(統計表の各々のセル) : http://sparql.pf-sapporo.jp/lod/stats/<統計名>/<統計表のID>#<セルのID>
– 測度 : http://sparql.pf-sapporo.jp/vocabulary/sapporov/measure/<測度名>
– 次元 : http://sparql.pf-sapporo.jp/vocabulary/sapporov/dimension/<次元>
– 属性 : http://sparql.pf-sapporo.jp/vocabulary/sapporov/attribute/<属性名>
#### 札幌市統計LODの測度・次元・属性
##### 人口動態
データセットIRI : http://sparql.pf-sapporo.jp/lod/stats/人口動態/2017
次元
– 年度
– 性別
– エリア
測度
– 人口増加数
– 自然動態_自然増加数
– 自然動態_出生
– 自然動態_死亡
– 社会動態_社会増加数
– 社会動態_市外との移転_増加数_総数
– 社会動態_市外との移転_増加数_道内
– 社会動態_市外との移転_増加数_道外
– 社会動態_市外との移転_転入_総数
– 社会動態_市外との移転_転入_道内
– 社会動態_市外との移転_転入_道外
– 社会動態_市外との移転_転出_総数
– 社会動態_市外との移転_転出_道内
– 社会動態_市外との移転_転出_道外
– 社会動態_区間移動・その他_増加数
– 社会動態_区間移動・その他_区間移動_増加数
– 社会動態_区間移動・その他_区間移動_転入
– 社会動態_区間移動・その他_区間移動_転出
– 社会動態_区間移動・その他_職権等増減_増加数
– 社会動態_区間移動・その他_職権等増減_職権等増
– 社会動態_区間移動・その他_職権等増減_職権等減
##### 住民基本台帳
データセットIRI : http://sparql.pf-sapporo.jp/lod/stats/住民基本台帳/人口/2017
次元
– エリア
– 性別
– 月
– 日本人か外国人か
測度
– 人口
##### 町名・条丁目別人口
次元
– エリア
– 住所
– 年月日
測度
– 人口
##### 町名・条丁目別世帯数及び男女別人口(平成29年10月1日更新)
データセットIRI : http://sparql.pf-sapporo.jp/lod/stats/町名_条丁目_年齢別人口/20171001/
次元
– 条丁目
– 年齢
– 年月日
測度
– 人口
##### 町名・条丁目別人口
次元
– エリア
– 住所
– 年月日
測度
– 人口
##### 町名・条丁目別世帯数及び男女別人口
データセットIRI : http://sparql.pf-sapporo.jp/lod/stats/町名_条丁目別世帯数及び男女別人口/<公表日>
次元
– エリア
– 住所
– 性別
– 年月日
測度
– 人口
– 世帯数
## データへのアクセス方法
公開したLODへアクセスするにはデータセットのIRIにアクセスする方法とSPARQLを使ってクエリする2つの方法があります。
### データセットのIRIから入手
各データセットのデータを取得するには、データセットのURIにアクセスすればN-Triple形式のデータがダウンロードできます。
### SPARQL
札幌市のLODではSPARQLエンドポイントを公開しています。
SPARQLはRDF専用のクエリ言語でW3Cで標準化されています。
SPARQLを用いればすべてのデータセットを対象として柔軟にデータの取り出しが可能です。
SPARQLについての詳しい情報はW3Cの仕様などを参照してください。(https://www.w3.org/TR/sparql11-query/)
### ウェブブラウザを利用する
エンドポイントにブラウザからアクセスするとクエリ送信用の画面が表示されます。
”Query Text”フォームにクエリを入力して”Run Query”を押します。
”Result Format”を変更することで、HTMLの他、JSONやCSVなどで結果を受け取ることができます。
– SPARQLエンドポイント : http://sparql.pf-sapporo.jp
### curlコマンドを利用する
クエリを記述したテキストファイルを作成して”sparql.rq”として保存します。
次のようにするとjsonフォーマットの結果を受け取ることができます。
$ curl -H ‘Accept: application/sparql-results+json’ –data-urlencode
‘query@sparql.rq’ http://sparql.pf-sapporo.jp
json以外のフォーマットも指定できます。
json application/sparql-results+json
xml application/sparql-results+xml
csv text/csv
tsv text/tab-separated-values
### サンプルクエリ
例1)観光スポットの基本情報を取得
PREFIX sapporov: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/>
PREFIX ic: <http://imi.ipa.go.jp/ns/core/rdf#>
select distinct * where {
?s a sapporov:観光スポット;
ic:名称 [ic:表記 ?label];
ic:住所[ic:表記 ?address]; ic:地理座標[ic:緯度 ?lat];
ic:地理座標[ic:経度 ?long];
ic:連絡先 [ic:電話番号 ?tel];
ic:利用可能時間 [ic:開始時間 ?open];
ic:利用可能時間 [ic:終了時間 ?close].
FILTER (lang(?label)!=’en’)
} LIMIT 100
例2)避難場所情報を一覧取得
PREFIX sapporov: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/>
PREFIX ic: <http://imi.ipa.go.jp/ns/core/rdf#>
select distinct ?s ?type ?address GROUP_CONCAT(?designation ; separator=’|’)
as ?designations where {
?s a sapporov:避難場所;
ic:名称 [ic:表記 ?label];
ic:種別 ?type;
ic:住所[ic:表記 ?address].
?s sapporov:災害指定 ?designation.
} LIMIT 100
例3)2017年の人口動態から女性の人口増加数をエリア別に取得
PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX dimension: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/dimension#>
PREFIX measure: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/measure#>
select ?area ?value {
?slice qb:observation ?observation.
?slice dimension:性別 ‘女性’ .
?observation dimension:エリア ?area .
?observation measure:人口増加数 ?value .
<http://sparql.pf-sapporo.jp/lod/stats/人口動態/2017> qb:slice ?slice .
}
ORDER BY DESC(?value)
例4)札幌市の人口・世帯数(平成29年)のデータから12月の外国人人口をエリア別に集計
PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX dimension: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/dimension#>
PREFIX measure: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/measure#>
PREFIX dct: <http://purl.org/dc/terms/>
select ?area sum(?value) as ?subtotal where {
?dataset dct:title ‘札幌市の人口・世帯数(平成29年)’. ?dataset qb:slice ?slice .
?slice dimension:日本人か外国人か ‘外国人’ .
?slice dimension:エリア ?area .
?slice qb:observation ?obs .
?obs measure:人口 ?value .
?obs dimension:月 12.
}
order by desc(?subtotal)
例5)町名・条丁目、年齢(5歳階級)別人口のデータより生産年齢人口と高齢者人口の割合を取得(ただし、どちらも一人以上の場合)
PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX dimension: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/dimension#>
PREFIX measure: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/measure#>
PREFIX slicekey: <http://sparql.pf-sapporo.jp/lod/stats/町名_条丁目_年齢別人口/20171001/instance#>
select distinct ?area ?productive ?senior ?balance where {
?slice a qb:Slice;
dimension:年齢 “生産年齢”;
qb:observation ?observation .
?observation dimension:条丁目 ?area ;
measure:人口 ?productive.
?slice2 a qb:Slice;
dimension:年齢 “老年”;
qb:observation ?observation2 .
?observation2 dimension:条丁目 ?area ;
measure:人口 ?senior.
FILTER (?productive >= 1)
FILTER (?senior >= 1)
BIND ((xsd:decimal(?senior)/xsd:decimal(?productive)) as ?balance)
}
ORDER BY DESC(?balance)
LIMIT 100
例6)町名・条丁目別世帯数及び男女別人口のデータより一世帯あたりの人数が多い順に100件取得
PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX dimension: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/dimension#>
PREFIX measure: <http://sparql.pf-sapporo.jp/vocabulary/sapporov/measure#>
PREFIX slicekey: <http://sparql.pf-sapporo.jp/lod/stats/町名_条丁目_年齢別人口/20171001/instance#>
PREFIX dct: <http://purl.org/dc/terms/>
select ?address ?household ?population (xsd:decimal(?population)/
xsd:decimal(?household) as ?proportion) where {
?slice qb:sliceStructure slicekey:総数_sliceKey;
qb:observation ?obs.
?obs dimension:住所 ?address;
measure:人口 ?population.
{
select ?household ?address where {
?obsB dimension:住所 ?address;
measure:世帯数 ?household.
}
}
}
ORDER BY DESC(?proportion)
LIMIT 100