假设我有两个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查询的结果并扩展搜索文档的查询,请您更新我在做错的内容?
答案 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'进行搜索,它也能正常工作。
感谢您对如何使用它的想法,它帮助我解决了这个问题。