概要
以前に【SPARQL】レコード単位で保持されるデータを列の形式で取得したいで、外部結合のような機能を持つOPTIONAL
句について紹介しました。外部結合に似た機能ですので、このOPTIONAL句で指定した項目がレコードにない場合もあります。そのようなとき、対象のレコードを除外したい場合どうすれば良いかというのをメモ書きします。
対応
Excluding Blank Nodes from SPARQL query resultsのstackoverflowの記事にある通り、isBlank
関数を使えば空の項目を除外できそうです。OPTIONAL句で取得した項目を、FILTER句でisBlank
で判定すればよさそうですね。
クエリサンプル
今回もgBizINFOの財務データを例にします。財務データでは売上高を取得できますが、登録されている会社とされていない会社があります。
以下は、売上高を登録されていない会社をisBlank
の判定で除外し、結果を取得するクエリです。
PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
PREFIX ic: <http://imi.go.jp/ns/core/rdf#>
SELECT ?companyId ?companyName ?address ?salesAmount
FROM <http://hojin-info.go.jp/graph/zaimu>
WHERE {
?s hj:法人活動情報 ?o .
?o ic:ID/ic:識別値 ?companyId .
?o ic:名称/ic:表記 ?companyName .
?o ic:住所/ic:表記 ?address .
OPTIONAL {
?o hj:数量コレクション/hj:数量 ?c2 .
?c2 ic:数値 ?salesAmount .
?c2 hj:指標 ?salesAmountName .
FILTER(?salesAmountName = "http://hojin-info.go.jp/code/財務情報/売上高"^^ic:コード型)
}
FILTER(!isBlank(?salesAmount))
}
ORDER BY ASC(?salesAmount)
LIMIT 10