6.2 XQuery または JavaScript によるトリプルのクエリ
6.2.6 cts 検索を使用したセマンティックの使用
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
ビルトインのcts検索関数は、テキスト検索を実行するために使用する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:search(collection()//sem:triple, cts:or-query((
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関数を効果的に活用できます。
また、順序を指定するために、cts:orderコンストラクタをcts:searchのオプ ションとして使用することもできます。これにより、指定したインデックスを使用して cts検索結果を並べることができるため、パフォーマンスの向上と予測可能性が実現さ
れます。『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";
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