如何通过marklogic使用推理在文档中搜索类似的列?

时间:2016-09-01 10:56:11

标签: marklogic marklogic-8

假设我有两个xml文档: 文件1:

<item>
  <item_id> 001 </item_id>
  <color>blue</color>
</item>

文件2:

<item>
  <item_ref_id>abc</item_ref_id>
  <color>blue</color>
</item>

现在进行推理,我将三元组定义为:

<item_ref_id> <http://www.w3.org/2002/07/owl#sameAs> <item_id>

如果我编写SPARQL查询以获取带有<item_id> = abc的document2,它应该可以工作。 这可以通过推理,我们如何通过MarkLogic做这种事情。 为实现这一目标需要多少三倍?

更新我用作的方法:

 import module namespace sem = "http://marklogic.com/semantics" at         
 "/MarkLogic/semantics.xqy";

 declare namespace s = "http://www.w3.org/2005/sparql-results#";

for $doc in sem:query-results-serialize(sem:sparql( "SELECT ?s WHERE 
{?s <http://www.w3.org/2002/07/owl#sameAs>    
<productId>}"),"xml")//s:uri/text()

return cts:element-value-query(xs:QName($doc), '001')

我从中得到的结果是:     cts:element-value-query(fn:QName(“”,“id”),“001”,(“lang = en”),1)
    cts:element-value-query(fn:QName(“”,“productId”),“001”,(“lang = en”),1)

我对此几乎没有问题: 1.我的方法是否正确解决了我上面提到过的这种情况? 2.我无法使用sparql查询的结果并扩展搜索文档的查询,请您更新我在做错的内容?

4 个答案:

答案 0 :(得分:2)

但是,您也可以在MarkLogic文档搜索中使用相同的三元组。处理搜索呼叫时,您可以根据item_id识别搜索。然后,您可以使用从SPARQL调用返回的值扩展item_id

select * { ?s <http://www.w3.org/2002/07/owl#sameAs> <item_id> }

然后运行扩展的搜索查询。

- 另外 -

您在更新的问题中分享的代码几乎就在那里,您已成功从productId推断为id。您只需将元素查询包装到查询中,并将其传递给cts:search。类似的东西:

import module namespace sem = "http://marklogic.com/semantics" at         
 "/MarkLogic/semantics.xqy";

declare namespace s = "http://www.w3.org/2005/sparql-results#";

let $qnames :=
  for $id in sem:query-results-serialize(sem:sparql( "SELECT ?s WHERE 
    {?s <http://www.w3.org/2002/07/owl#sameAs     
      <item_id>}"),"xml")//s:uri/text()

  return xs:QName($id)

return cts:search(collection(), cts:element-value-query($qnames, '001'))

HTH!

答案 1 :(得分:1)

您只能推断RDF数据,因此您必须将XML结构转换为三元组。然后,您可以定义如下规则:

rule "item_ref_id" construct {
  ?s <item_id> ?o
} {
  ?s <item_ref_id> ?o
}

之后,您只需在运行SPARQL时选择规则即可使用它。

HTH!

答案 2 :(得分:0)

我以这种方式为上述场景添加了关系:

(item1 uri)---&gt;有独特的 - &gt; id ---&gt;与&lt; --- productid&lt; ----具有唯一性&lt; ---(item2 uri)

相同

item_id ---&gt; (hasValue-def)---&gt; 001

item_ref_id ---&GT; (hasValue-def)----&gt; ABC

添加以下三元组后,我可以使用item_id为这两个项目搜索项目,使用推理为:

import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy";
declare namespace s = "http://www.w3.org/2005/sparql-results#";


for $doc in sem:query-results-serialize(
sem:sparql("SELECT * WHERE {?s <has-unique-key as#>/<https://www.w3.org/TR/2002/WD-owl-ref-20021112/#hasValue-def>/<http://www.w3.org/2002/07/owl#sameAs>*  <001>}"),     "xml")//s:uri/text()
return fn:doc($doc)

答案 3 :(得分:0)

@grtjn

我已经获得了该解决方案的解决方案,它解决了查询以搜索这两个ID的问题,请检查一下:

Document1:

<item>
  <item_id> 001 </item_id>
  <color>blue</color>
</item>

Document2:

<item>
  <item_ref_id>abc</item_ref_id>
  <color>blue</color>
</item>

Triple:

<sem:triple>
  <sem:subject>item_ref_id</sem:subject>
  <sem:predicate>http://www.w3.org/2002/07/owl#sameAs</sem:predicate>
  <sem:object>item_id</sem:object>
</sem:triple>

使用上面的结构,我运行以下查询(从解决方案中修改),并使用item_id解析两个id的文档:

import module namespace sem = "http://marklogic.com/semantics" 
at "/MarkLogic/semantics.xqy";
declare namespace s = "http://www.w3.org/2005/sparql-results#";

for $id in  sem:query-results-serialize(
sem:sparql( "SELECT ?s WHERE {?s <http://www.w3.org/2002/07/owl#sameAs> <item_id>}"),"xml")//s:uri/text() 


return cts:search(collection(),cts:and-query((
cts:element-value-query(xs:QName($id), '001'))
))

如果我也通过'abc'进行搜索,它也能正常工作。

感谢您对如何使用它的想法,它帮助我解决了这个问题。