我试图通过隐含我的主题,谓词和宾语以用作新的“主题”节点,在MarkLogic中进行SPARQL查询。我尝试使用下面的查询
SELECT *
WHERE {
?subject </in/relationship/with> ?object .
BIND(concat(?subject, "/in/relationship/with", ?object) AS ?relationship
?relationship </current/status> ?status
}
但是,此查询不起作用,因为?relationship
现在每行包含一个字符串,导致查询的输出完全为空。因此,我想知道是否可以做到这一点,以及是否可以将字符串转换为SPARQL可以查询的对象。
答案 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!