6.2 XQuery または JavaScript によるトリプルのクエリ
6.2.2 セマンティック関数を使用したクエリ
SPARQLのSELECT、ASK、およびCONSTRUCTクエリは、XQueryのsem:sparql
およびsem:sparql-values関数や、JavaScriptのsem.sparqlおよび
sem.sparqlValues関数を使用して実行できます。関数のシグネチャと説明の詳
細については、『MarkLogic XQuery and XSLT Function Reference』の「XQuery Library
Modules」に掲載されているセマンティックに関するドキュメントを参照してください。
次の例では、govtrackデータベースのトリプルインデックスに対してSPARQLクエ リを実行します。「例を実行する準備」(125 ページ)を参照してください。
注: セマンティック関数にはビルトインのものもそうでないものもあるため、
セマンティックAPIを使用するXQueryモジュールまたはJavaScriptモ ジュールごとにセマンティックAPIライブラリをインポートすることを お勧めします。
XQueryを使用する場合、importステートメントは次のようになります。
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
JavaScriptでは、importステートメントは次のようになります。
var sem = require("/MarkLogic/semantics.xqy");
6.2.2.1 sem:sparql
データベース内のRDFデータをクエリするには、SPARQL言語の場合と同様の方法で sem:sparql関数を使用します。sem:sparqlを使用するには、SPARQLクエリを文 字列として関数に渡します。
XQueryを使用する場合、クエリは次のようになります。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
sem:sparql('
PREFIX bill: <http://www.rdfabout.com/rdf/usgov/congress/
108/bills/>
SELECT ?predicate ?object
WHERE { bill:h963 ?predicate ?object } ')
JavaScriptを使用する場合、クエリは次のようになります。
var sem = require("/MarkLogic/semantics.xqy");
sem.sparql( + 'PREFIX bill:
<http://www.rdfabout.com/rdf/usgov/congress/108/bills/>' + 'SELECT ?predicate ?object' +
'WHERE { bill:h963 ?predicate ?object }' )
注: JavaScriptでは、文字列リテラルを複数の行に分けることができません。
「+」または「/」を使用して連結する必要があります。
XQueryコードは、シーケンスとして配列を返します。一方、JavaScriptコードは、
Sequenceを返します。詳細については、『JavaScript Reference Guide』の「
を参照してください。
主語が法案番号「h963」であるすべてのトリプルをクエリする例の結果は、次のように なります。
SPARQLクエリの構築の詳細については、「SPARQLクエリの構築」(78 ページ)を参
照してください。
SPARQLクエリはFLWOR
構築することもできます。次の例では、letステートメントにSPARQLクエリが含ま れています。これはSPARQLのASKクエリです。モルモン教(Latter Day Saints)の教 徒である男性政治家がいるかどうかを調べます。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $sparql := '
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns>
PREFIX politico:
<http://www.rdfabout.com/rdf/schema/politico/>
PREFIX govtrack:
<http://www.rdfabout.com/rdf/schema/usgovt/>
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0/>
'
return sem:sparql($sparql)
=>
true
6.2.2.2 sem:sparql-values
sem:sparql-values関数を使用すると、バインドのシーケンスでSPARQLクエリが 返す内容を制限できます。次の例では、議員2人を表現する主語IRIに値のシーケンス がバインドされています。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $bindings := ( map:entry("s",
sem:iri("http://www.rdfabout.com/rdf/usgov/congress/people /A000069")),
map:entry("s",
sem:iri("http://www.rdfabout.com/rdf/usgov/congress/people /G000359"))
)
return
sem:sparql-values("select * { ?s ?p ?o }",$bindings) 結果は、議員2人の値のシーケンスとして返されます。
sem:sparql-values関数は、最も外側にあるVALUESブロックのSPARQL 1.1 機能と同等であると考えることができます。詳細については、「Valuesセクション」
(105 ページ)を参照してください。
SPARQL valueクエリで変数を使用する箇所では、sem:sparql-valuesの引数として
外部バインドを渡すことで、変数を固定値に設定できます。「変数に対するバインドの 使用」(132 ページ)を参照してください。
6.2.2.3 sem:store
sem:store関数には、基準のセットが格納されます。この基準のセットは、クエリの
一部としてsem:sparqlやsem:sparql-values、sem:sparql-updateに渡して 評価を行うトリプルのセットを選択するために使用されます。sem:storeに含まれる トリプルは、現在のデータベースのトリプルインデックスからのものであり、
sem:store内のオプションおよびcts:query引数によって制約されます(例えば、
「このクエリとマッチする、ドキュメント内のすべてのトリプル」)。複数の
sem:storeコンストラクタを指定した場合、すべてのソースからのトリプルがマージ
され、一体となってクエリされます。
sem:sparql、sem:sparql-values、またはsem:sparql-updateのオプションと
してsem:storeコンストラクタを指定しなかった場合、そのクエリのデフォルトの
sem:store(デフォルトデータベースのトリプルインデックス)が使用されます。
6.2.2.4 インメモリでのトリプルの検索
sem:in-memory-storeを使用すると、インメモリでトリプルをクエリできます。
例えば以下のようになります。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $triples := sem:rdf-parse($string, ("turtle",
"myGraph")) let $query := '
PREFIX ad: <http://marklogic.com/addressbook/>
PREFIX d: <http://marklogic.com/id/>
CONSTRUCT{ ?person ?p ?o .}
FROM <myOtherGraph>
WHERE {
?person ad:firstName "Elvis" ; ad:lastName "Presley" ;
} '
for $result in sem:sparql($query, (), (), sem:in-memory-store($triples))
order by sem:triple-object($result) return <result>{$result}</result>
このクエリは、「myGraph」という名前のトリプルのグラフをインメモリで構築します。
このグラフには、名がElvisで姓がPresleyという人物が含まれます。これらのトリプル のソースは「myOtherGraph」であり、結果は順序付けられて返されます。