返回前缀名称而不是IRI的SPARQL查询

时间:2015-12-15 23:01:17

标签: rdf sparql jena

假设我有这些三元组:

@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"

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

单独使用SPARQL无法实现所需。

SPARQL SELECT查询结果包含三种值:IRI,文字和空白节点。您的问题中的查询是关于返回最接近字符串的查询,这些字符串看起来像作为查询结果的前缀名称。在SPARQL术语中,您获得的值实际上是文字,双引号在文字周围是必需的。因此,没有办法没有在每个值周围加上双引号。

前缀名称与IRI不是一个单独的名称:它只是写下 IRI的另一种方式。这意味着它不能由SPARQL查询控制,它只是以抽象形式返回结果,而是由用于格式化/转换/写入结果的任何处理器/格式化程序控制。

我不知道这在Jena中是如何工作的(我自己就是芝麻人)但通常,SPARQL引擎会在某些内部表示中返回查询结果 - 例如Java对象。然后如何呈现数据取决于您对结果的处理方式。例如,您可以使用SPARQL XML Result Format将其写入XML文件,或者您可以将其循环并将输出作为文本打印到STDOUT。重点是:结果中的任何IRI是否呈现/显示为带前缀的名称取决于您如何处理结果,查询本身