假设我有这些三元组:
@prefix : <http://example.org/>.
#rdf types
:john a :Person.
:liz a :Person.
:robert a :Person.
:dan a :Person.
我必须返回这些三元组的所有主题,所以我这样做:
SELECT ?x
FROM <http://localhost:3030/Exercice3/data/>
WHERE {
?x ?y ?z
}
我按照自己的意愿得到:
<http://example.org/john>
<http://example.org/liz>
<http://example.org/robert>
<http://example.org/dan>
但是现在我必须返回主题的本地名称,也就是说:
:john
:liz
:robert
:dan
如何在将前缀名称连接到IRI之前查询前缀名称?
我已尝试过字符串级别,但我认为有更严肃的方法来实现它:
PREFIX : <http://example.org/>
SELECT ?str
FROM <http://localhost:3030/Exercice3/data/>
WHERE {
?x ?y ?z
BIND(REPLACE(STR(?x),STR(:),STR(':')) AS ?str)
}
这是我到目前为止所得到的: (我不希望返回字符串)
":john"
":liz"
":robert"
":dan"
有人可以帮助我吗?
答案 0 :(得分:3)
单独使用SPARQL无法实现所需。
SPARQL SELECT查询结果包含三种值:IRI,文字和空白节点。您的问题中的查询是关于返回最接近字符串的查询,这些字符串看起来像作为查询结果的前缀名称。在SPARQL术语中,您获得的值实际上是文字,双引号在文字周围是必需的。因此,没有办法没有在每个值周围加上双引号。
前缀名称与IRI不是一个单独的名称:它只是写下 IRI的另一种方式。这意味着它不能由SPARQL查询控制,它只是以抽象形式返回结果,而是由用于格式化/转换/写入结果的任何处理器/格式化程序控制。
我不知道这在Jena中是如何工作的(我自己就是芝麻人)但通常,SPARQL引擎会在某些内部表示中返回查询结果 - 例如Java对象。然后如何呈现数据取决于您对结果的处理方式。例如,您可以使用SPARQL XML Result Format将其写入XML文件,或者您可以将其循环并将输出作为文本打印到STDOUT。重点是:结果中的任何IRI是否呈现/显示为带前缀的名称取决于您如何处理结果,查询本身不。