在SPARQL查询(MarkLogic)中用作主题的Concat值

时间:2019-03-11 09:46:20

标签: concatenation sparql marklogic

我试图通过隐含我的主题,谓词和宾语以用作新的“主题”节点,在MarkLogic中进行SPARQL查询。我尝试使用下面的查询

SELECT *
WHERE {
   ?subject </in/relationship/with> ?object .
   BIND(concat(?subject, "/in/relationship/with", ?object) AS ?relationship
   ?relationship </current/status> ?status
}

但是,此查询不起作用,因为?relationship现在每行包含一个字符串,导致查询的输出完全为空。因此,我想知道是否可以做到这一点,以及是否可以将字符串转换为SPARQL可以查询的对象。

1 个答案:

答案 0 :(得分:2)

Stanislav是正确的,您需要将字符串包装在IRI()中。这里是直接在QC中运行的代码段。在一个空数据库上运行它不会污染您的其他数据:

xdmp:document-insert('/triples.xml', <triples>{
  sem:triple(sem:iri("http://my/subject1"), sem:iri("/in/relationship/with"), sem:iri("http://my/subject2")),
  sem:triple(sem:iri("http://my/subject1/in/relationship/with/http://my/subject2"), sem:iri("/current/status"), "My status")
}</triples>)
;
sem:sparql('
  SELECT *
  WHERE {
    ?subject </in/relationship/with> ?object.
    BIND(IRI(CONCAT(?subject, "/in/relationship/with/", ?object)) AS ?relationship)
    ?relationship </current/status> ?status.
  }
')

这是否是明智的方法可能取决于。请记住,MarkLogic在将关联数据保存在文档中方面特别强大,您可以嵌入三元组,或者也可以使用TDE从中投射三元组,从而使您可以结合文档搜索的优势,并将相关数据保持在一起,同时仍然允许使用SPARQL对事实进行推理。

HTH!