使用Sparql返回带有嵌入式三元组的整个XML文档和doc-uri

时间:2018-07-13 22:21:18

标签: marklogic marklogic-9

我有一些带有嵌入式三元组的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;

3 个答案:

答案 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!