6.1 SPARQL を使用したトリプルのクエリ
6.1.9 クエリ節
6.1.9.3 FILTER キーワード
SPARQLクエリの結果は、複数の手法で制限できます。返されるマッチング結果の数を
制限する場合は、FILTER、DISTINCT、またはLIMITキーワードを使用できます。
1つあるいは複数のSPARQLのFILTERキーワードを使用すると、結果を制約する変 数を指定できます。FILTER制約は、WHERE節の波括弧の内側に配置します。論理、
算術、または比較演算子の記号(大なり(>)、小なり(<)、等価(=)など)を含める ことができます。FILTER制約では、マッチングクエリの結果を返すためにブール型条 件が使用されます。また、isURI、isBlankなど、使用できるビルトインのSPARQL テストも多数用意されています。
次の表は、FILTER制約で使用されるSPARQL単項演算子の一部を示したものです。
注: 演算子の詳細なリストについては、「SPARQL Query Language for RDF」
の「Operator Mapping」を参照してください。
次の例は、変数?bd(人の誕生日)に意味を与えるクエリパターンです。クエリパ ターンのFILTER節では、この変数の値と1999年1月1日という日付とを比較し、
この日付よりも後に生まれた人々を返します。
PREFIX onto: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
演算子 型 結果の型
! xsd:boolean xsd:boolean
+ 数値 数値
- 数値 数値
BOUND() 変数 xsd:boolean
isURI() RDFターム xsd:boolean
isBLANK() RDFターム xsd:boolean
isLITERAL RDFターム xsd:boolean
STR() リテラル/IRI 単純リテラル
LANG() リテラル 単純リテラル
DATATYPE() リテラル IRI
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns>
SELECT ?s
WHERE {?s rdf:type foaf:Person .
?s onto:birthDate ?bd .
FILTER (?bd > "1999-01-01"^^xsd:date) }
SPARQLキーワードaは、共通の述語rdf:typeのショートカットであり、リソース
のクラスを指定します。例えば、WHERE節は次のように記述できます。
WHERE {?s a foaf:Person .
?s onto:birthDate ?bd .
regex関数を使用すると、FILTER節を正規表現パターンで表現できます。例えば以
下のようになります。
SELECT ?s ?p ?o WHERE {?s ?p ?o
FILTER (regex (?o, "Lister", "i")) }
このSPARQLクエリは、目的語の位置のテキストに、大文字/小文字の区別なしで文
字列Listerが含まれるすべてのマッチング結果を返します。iフラグを使用すると、
正規表現のマッチは大文字/小文字の区別なしで実行されます。
注: このタイプのFILTERクエリは、fn:match XQuery関数と同等です。
SPARQLでは正規表現が最適化されません。最適化された全文検索を実
行するにはcts:containsを使用してください。
正規表現言語は、「XQuery 1.0 and XPath 2.0 Functions and Operators」のセクション 7.6.1「Regular Expression Syntax」で定義されています。
SPARQLクエリでのビルトイン関数の使用
FILTER、BINDのほか、SELECTステートメント内の式が含まれる、関数を使用でき
るSPARQLクエリでは、SPARQL関数以外にも、XQueryやJavaScriptのビルトイン関
数が使用できます。例えば、プレフィックスfn、cts、math、xdmpを持つ関数が使 用できます。
ビルトイン関数とは、XQueryの場合は「import module」、JavaScriptの場合は「var
<module> = require」を使用せずに呼び出すことができる関数です。SPARQLクエリで使
用する場合、このような関数のことを拡張関数と呼びます。ビルトイン関数のリスト は、http://docs.marklogic.comで「Server-Side JavaScript APIs」(または「Server-Side
XQuery APIs」)を選択すると確認できます。また、ビルトインのリストは、「MarkLogic
Built-In Functions」および「W3C-Standard Functions」にあります。詳細については、「セ
マンティック関数を使用したクエリ」(127 ページ)を参照してください。
SPARQLの拡張関数は、http://www.w3.org/2005/xpath-functions#nameとい
う形式のIRI(例えば
http://www.w3.org/2005/xpath-functions#starts-with)で識別されます。「name」は関数のローカル名、#より前の文字列は関数のプレ フィックスIRIです。一般的にfn、cts、math、xdmpと結合されたプレフィックス
IRI(または「/」や「#」で終わらない他のあらゆるプレフィックスIRI)の場合は、
プレフィックスIRIに#を付け、その後に関数のローカル名を続けます。例えば次のよ うになります。http://marklogic.com/cts#contains.
ctsなどのビルトイン関数にアクセスするには、SPARQLクエリでPREFIXを使用し ます。次の例では、cts:containsはPREFIXを使用することで追加され、その後は
FILTERクエリの一部として含められています。
PREFIX cts: <http://marklogic.com/cts#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT *
WHERE{ ?s ?p ?o .
FILTER cts:contains(?o, cts:or-query(("Monarch",
"Sovereign")))
FILTER(?p IN (dc:description, rdfs:type)) }
これは「Monarch」または「Sovereign」という語の全文検索であり、述語は説明
(description)またはタイプ(type)です。2番目のFILTER節ではINを使用して、
フィルタを適用する述語を指定しています。結果には、(王国、州、または領域で)
「Monarch」(君主)の肩書を持つ人々と、Monarch butterfly(オオカバマダラ)、Monarch
Islands(モナーク諸島)など「Monarch」という説明が含まれる項目が含まれます。
次の例では、SPARQLクエリでXPath関数starts-withを使用して、説明が「Chief」
で始まる人々の役割または肩書を返します。この関数をインポートするには、FILTER クエリの一部としてIRIを含めます。
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?desc
WHERE {?s dc:description ?desc
FILTER (<http://www.w3.org/2005/xpath-functions#starts-with>( ?desc,"Chief" ) )}
注: FILTERキーワードは、OPTIONALおよびUNIONキーワードと併用でき ます。