1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SPARQL】レコード単位で保持されるデータを列の形式で取得したい

Posted at

概要

以前に【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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?