概要
以前に【SPARQL】独自の型の値をFilterで絞り込みしたいの記事で、SPARQLにおける型の話を取り上げました。
今回はデータの取得形式について少し書いてみたいと思います。
やりたいこと
今回も法人情報のデータを取得できるAPI、gBizINFOの財務データを例にします。
以下のように財務データを取得するクエリを発行した場合、
PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
PREFIX ic: <http://imi.go.jp/ns/core/rdf#>
SELECT ?cID ?name ?sihyou ?value
FROM <http://hojin-info.go.jp/graph/zaimu>
WHERE {
?s hj:法人活動情報 ?o .
?o ic:名称/ic:表記 ?name .
?o ic:ID/ic:識別値 ?cID .
?o hj:数量コレクション/hj:数量 ?c .
?c hj:指標 ?sihyou .
?c ic:数値 ?value .
FILTER(?cID= "1180301018771")
}
limit 100
以下のように、1つの勘定につき1レコードのような形式で取得されます。
{
"cID": {
"type": "literal",
"value": "1180301018771"
},
"name": {
"type": "literal",
"value": "トヨタ自動車株式会社"
},
"sihyou": {
"datatype": "http://imi.go.jp/ns/core/rdf#コード型",
"type": "literal",
"value": "http://hojin-info.go.jp/code/財務情報/純資産額"
},
"value": {
"datatype": "http://www.w3.org/2001/XMLSchema#decimal",
"type": "literal",
"value": "12590891000000"
}
},
{
"cID": {
"type": "literal",
"value": "1180301018771"
},
"name": {
"type": "literal",
"value": "トヨタ自動車株式会社"
},
"sihyou": {
"datatype": "http://imi.go.jp/ns/core/rdf#コード型",
"type": "literal",
"value": "http://hojin-info.go.jp/code/財務情報/売上高"
},
"value": {
"datatype": "http://www.w3.org/2001/XMLSchema#decimal",
"type": "literal",
"value": "12201444000000"
}
}
これを1レコード1勘定ではなく、1レコードに複数の勘定をまとめて取得するということを実現したいです。
対応
こちらの6.3 複数のオプションのグラフ・パターンの記載にある通り、OPTIONAL
句を使うことで実現できそうです。
OPTIONAL
はSQLで言うところの、外部結合のような役割を果たす機能です。今回の財務データの例でいくと、イメージ的には会社情報に対し、純資産額と売上高を左外部結合するような処理になります。
クエリサンプル
上記の財務データの例に示した内容で、純資産額と売上高を列形式で取得するクエリです。
PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
PREFIX ic: <http://imi.go.jp/ns/core/rdf#>
SELECT ?cID ?name ?netAssetName ?netAssetValue ?salesName ?salesValue
FROM <http://hojin-info.go.jp/graph/zaimu>
WHERE {
?s hj:法人活動情報 ?o .
?o ic:名称/ic:表記 ?name .
?o ic:ID/ic:識別値 ?cID .
OPTIONAL{
?o hj:数量コレクション/hj:数量 ?c .
?c ic:数値 ?netAssetValue .
?c hj:指標 ?netAssetName .
FILTER(?netAssetName = "http://hojin-info.go.jp/code/財務情報/純資産額"^^ic:コード型)
} .
OPTIONAL{
?o hj:数量コレクション/hj:数量 ?c2 .
?c2 ic:数値 ?salesValue .
?c2 hj:指標 ?salesName
FILTER(?salesName = "http://hojin-info.go.jp/code/財務情報/売上高"^^ic:コード型)
} .
FILTER(?cID= "1180301018771")
}
limit 100