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

Concat values to use as subject in SPARQL Queries (MarkLogic)

我试图通过连接我的主题、谓词和对象以用作新的 "subject" 节点来在 MarkLogic 中执行 SPARQL 查询。我试图通过下面的查询来做到这一点

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

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

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!