6.2 XQuery または JavaScript によるトリプルのクエリ
6.2.5 CURIE を扱う
CURIE
は、プレフィックスとリファレンスの2
つのコンポーネントで構成されていま す。プレフィックスはコロン(:
)でリファレンスと区切られます。例えば、dc:descriptionはダブリンコアのプレフィックスであり、リファレンス
http://purl.org/dc/elements/1.1/は説明です。
最もよく使用されるプレフィックスとそのマッピングは、次に示すとおりです。
map:entry("atom", "http://www.w3.org/2005/Atom/"), map:entry("cc", "http://creativecommons.org/ns/"), map:entry("dc", "http://purl.org/dc/elements/1.1/"), map:entry("dcterms", "http://purl.org/dc/terms/"), map:entry("doap", "http://usefulinc.com/ns/doap/"), map:entry("foaf", "http://xmlns.com/foaf/0.1/"),
map:entry("media", "http://search.yahoo.com/searchmonkey/media/"), map:entry("og", "http://ogp.me/ns/"),
map:entry("owl", "http://www.w3.org/2002/07/owl/"), map:entry("prov", "http://www.w3.org/ns/prov/"),
map:entry("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-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)は