• 検索結果がありません。

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キーワードと併用でき ます。