6.2 XQuery または JavaScript によるトリプルのクエリ
6.2.6 search API を使用したクエリ
6.2.6.2 cts:triple-range-query
トリプルインデックスへの検索アクセスは、cts:triple-range-query関数を通じて提供 されます。この例の
1
番目のパラメータは、主語の空のシーケンスです。「Lamar Alexander」という名前の人物を検索するため、述語および目的語の各パラメータが
sameTerm演算子とともに指定されています。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $query := cts:triple-range-query((),
sem:iri("http://xmlns.com/foaf/0.1/name"), "Lamar Alexander",
"sameTerm")
return cts:search(fn:collection()//sem:triple, $query)
6.2.6.3 cts:search
ビルトインの検索関数は、テキスト検索を実行するために使用する
XQuery
関数です。次の例では、cts:searchは
XML
ドキュメントのinfo:govtrack/billsコレクションに対 してクエリを実行し、ドキュメントに「Guam
」という語が含まれる法案の数を特定し ています(指定された文字列のcts:word-query)。xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $search := cts:search(//sem:triple,
cts:and-query((cts:collection-query("info:govtrack/bills"), cts:word-query("Guam"))))[1]
return cts:remainder($search)
=>
16
cts:queryと比較演算子の組み合わせを使用できます。次の例のcts:triple-range-query
関数は、cts:search内で使用されています。これにより、foaf:nameが「Lamar
Alexander」に等しいか、Alexander
の主語IRI
に画像IRI
を提供するfoaf:imgプロパティが含まれるsem:triple要素を探します。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
declare namespace dc = "http://purl.org/dc/elements/1.1/";
cts:triple-range-query((), sem:curie-expand("foaf:name"),
"Lamar Alexander", "sameTerm"), cts:triple-range-query(
sem:iri("http://www.rdfabout.com/rdf/usgov/congress/people/A000360"), sem:curie-expand("foaf:img"), (), "="))))
SPARQL
式およびSPARQL 1.1
のINおよびNOT IN演算子でシーケンスを構築することで、cts:query値のシーケンスを
1
番目の引数として想定するcts:and-queryなどのビル トイン関数を効率的に利用できます。また、順序を指定するために、cts:orderコンストラクタをcts:searchのオプションと して使用することもできます。これにより指定したインデックスを使用して検索結果を 並べることができるため、パフォーマンスの向上と予測可能性が実現されます。『Query
Performance and Tuning Guide
」を参照してください。6.2.6.4 cts:contains
cts:contains関数は、FILTERおよびBIND節内に出現する
SPARQL
式で使用できます。例 については、「FILTERキーワード」(95ページ)を参照してください。cts:containsでは任意の値を
1
番目の引数にできるため、クエリのトリプルパターンでバインドされた変数を
1
番目の引数として渡すことができます。トリプルパターンで は、トリプルインデックスの参照時に返される結果の数を減らすため、全文インデック スを使用します。次に例を示します。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
fn:count(sem:sparql('
PREFIX cts: <http://marklogic.com/cts#>
SELECT DISTINCT * WHERE
{ ?s ?p ?o .
filter cts:contains(?o, cts:word-query("Environment")) } '))
=>
53
次の例は、法案番号「hr543」があるかどうかを検証するシンプルなクエリです。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
cts:contains(collection("info:govtrack/bills")//sem:subject, cts:word-query('hr543'))
=>
true