我有一些带有嵌入式三元组的XML文档。
我可以毫无问题地运行sem:sparql查询,但是我不确定如何返回嵌入式三元组所在的整个XML文档以及带有结果的文档URI。预先感谢
有人知道怎么做吗?
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy";
let $res := sem:sparql('
SELECT ?country
WHERE {
<http://example.org/news/Nixon> <http://example.org/wentTo> ?country
}
',
(),
(),
cts:and-query( (
cts:or-query( (
cts:element-value-query( xs:QName("source"), "AP Newswire" ),
cts:element-value-query( xs:QName("source"), "BBC" )
) )
) )
)
return $res;
答案 0 :(得分:0)
也许有一种更简洁的方法(较少的转换),但这是我之前在XQuery中完成的方法:
xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
at "/MarkLogic/semantics.xqy";
let $triples := sem:sparql('
SELECT *
WHERE
{ ?subject ?predicate ?object }
')
return sem:database-nodes($triples ! sem:triple(map:get(., "subject"), map:get(., "predicate"), map:get(., "object"))) ! fn:base-uri(.)
答案 1 :(得分:0)
我通过这种方式自己解决了这个问题。我希望这可以帮助其他人。我花了5个小时以上的时间仔细阅读MarkLogic文档。我想我现在已经掌握了一切。 我不确定这是最快的方法,但只花了93ms
for $id in sem:query-results-serialize( $rez , 'xml')//s:uri/text()
return
xdmp:node-uri( (cts:search(/blah//sem:triple/*[text() = $id ] , ()))[1] )
答案 2 :(得分:0)
请考虑使用cts:triple-range-query
。它可以直接在public function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->add('smsShipments',null, array(
'template' => 'sms_shipment_list.html.twig'
))
}
中使用,并与其他查询混合。尽管您的示例非常简单,但它仅允许查找单个三元组。
要查找有关尼克松访问国的所有AP Newswire和BBC报道:
cts:search
您还可以预先执行SPARQL以首先解析更复杂的SPARQL查询,然后使用三重范围查询将结果提供给cts:search。例如:查找有关尼克松访问过的特定国家的所有报告(如AP Newswire和BBC的报道):
query version "1.0-ml";
for $doc in cts:search(
collection(),
cts:and-query( (
cts:element-value-query( xs:QName("source"), ("AP Newswire", "BBC") ),
cts:triple-range-query(
sem:iri("http://example.org/news/Nixon"),
sem:iri("http://example.org/wentTo"),
()
)
) )
)[1 to 10]
return (xdmp:node-uri($doc), $doc)
请注意以上两个示例之间的细微差别。
HTH!