6.2 XQuery または JavaScript によるトリプルのクエリ
6.2.5 CURIE を扱う
次の表では、出力に使用できるシリアライゼーションのオプションについて説明 します。
結果を表示する別の方法を選択することもできます。「結果のレンダリングの選択」
(77 ページ)を参照してください。
ns"),
map:entry("rdfs", "http://www.w3.org/2000/01/rdf-schema/"), map:entry("result-set",
"http://www.w3.org/2001/sw/DataAccess/tests/result-set/"), map:entry("rss", "http://purl.org/rss/1.0/"),
map:entry("skos", "http://www.w3.org/2004/02/skos/core/"), map:entry("vcard", "http://www.w3.org/2006/vcard/ns/"), map:entry("void", "http://rdfs.org/ns/void/"),
map:entry("xhtml", "http://www.w3.org/1999/xhtml/"), map:entry("xs","http://www.w3.org/2001/XMLSchema#") sem:curie-expandおよびsem:curie-shorten関数を使用することで、
MarkLogicでCURIEを扱うことができます。sem:curie-expandを使用すると、よ
く使用されるプレフィックスを宣言する必要がなくなります。
例えば以下のようになります。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
sem:curie-expand("foaf:name")
=>
<http://xmlns.com/foaf/0.1/name>
この例では、cts:triple-range-queryは「Lamar Alexander」という名前の人物を 探します。結果はcts:searchから返され、foaf:nameが「Lamar Alexander」に等 しいsem:triple要素が検索される点に注意してください。述語CURIEは
foaf:nameについて完全に展開されたIRIとして表示されます。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $query := cts:triple-range-query((), sem:curie-expand("foaf:name"), "Lamar Alexander", "sameTerm") return cts:search(fn:collection()//sem:triple, $query)
=>
<sem:triples xmlns="http://marklogic.com/semantics">
<sem:subject>
http://www.rdfabout.com/rdf/usgov/congress/people/A000360/
</sem:subject>
<sem:predicate>
http://xmlns.com/foaf/0.1/name
</sem:predicate>
<sem:object
datatype="http://www.w3.org/2001/XMLSchema#string">
Lamar Alexander
</sem:object>
</sem:triples>
次の例では、クエリには一連のcts:triples関数呼び出しおよび sem:curie-expandが含まれ、1917年11月20に誕生した議員の名前を調べます。該当する人物 の名前は、返されるトリプルステートメントの目的語位置(sem:triple-object)
からRDFリテラル文字列として返されます。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $person-triples := cts:triples((), sem:curie-expand("vcard3:BDAY",
map:entry("vcard3", "http://www.w3.org/2001/
vcard-rdf/3.0/")),
"1917-11-20")
let $subject := sem:triple-subject($person-triples) let $name-triples := cts:triples($subject,
sem:curie-expand("foaf:name"), ())
let $name := sem:triple-object($name-triples) return ($name)
=>
Robert Byrd
IRIをCURIEに短縮するにはsem:curie-shortenを使用します。この関数の評価で
は、プレフィックスで表現される値とコロンよりも後の部分(リファレンス)を連結し
たものでCURIEを置換します。
例えば以下のようになります。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
sem:curie-shorten(sem:iri("http://www.w3.org/1999/02/
22-rdf-syntax-ns#resource/"))
=>
rdf:resource
注: CURIEはIRIにマッピングされますが、属性の値や、IRIのみが含まれる
ように指定されているその他のコンテンツの値として使用しないでくだ さい。
例えば次のクエリでは、cts:triple-range-queryはその位置に文字列である sem:curie-shortenではなくIRI(sem:iri)があることを前提にしているため、
空のシーケンスを返します。
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $query := cts:triple-range-query((),
sem:curie-shorten(sem:iri("http://xmlns.com/
foaf/0.1/name")), "Lamar Alexander", "sameTerm") return cts:search(fn:collection()//sem:triple, $query) 代わりに、次のいずれかを使用できます。
let $query := cts:triple-range-query((),
sem:curie-expand("foaf:name"), "Lamar Alexander", "sameTerm")
または、プレフィックスを完全なIRIに展開します。
let $query := cts:triple-range-query((),
sem:iri("http://xmlns.com/foaf/0.1/name/"), "Lamar Alexander","sameTerm")
注: SPARQLで定義されているsameTerm関数は、値等価性演算を実行しま
す。これは、型の処理方法が等価演算子(=)と異なります。MarkLogic では、sameTermが=と異なるのは、型およびタイムゾーンだけです。
例えば、sameTerm(A,B)はA=Bを意味します。SPARQL用語では sameTermセマンティックを使用してSPARQLクエリ内のグラフパター ンにグラフをマッチさせることを単純含意と呼びます。詳細については、
「トリプル値とタイプ情報」(55 ページ)を参照してください。