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

SPARQL query that returns prefixed names instead of IRIs

假设我有这些三元组:

@prefix : <http://example.org/>.
#rdf types
:john a :Person.
:liz a :Person.
:robert a :Person.
:dan a :Person.

我必须 return 这些三元组的所有主题,所以我这样做:

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>

但是现在我要return本地的科目名称,也就是说:

: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)
}

这是我目前得到的: (我不希望 return 字符串)

":john"
":liz"
":robert"
":dan"

有人可以帮助我吗?

单独使用 SPARQL 无法实现您想要的效果。

一个SPARQL SELECT查询结果包含三种值:IRIs、文字和空白节点。您问题中的查询是关于您最接近返回看起来像前缀名称的字符串作为查询结果的查询。在 SPARQL 术语中,您返回的值实际上是文字,双引号是强制性的。所以没有办法做到这一点 没有 每个值都用双引号引起来。

带前缀的名称不是独立于 IRI 的东西:它只是 写下 IRI 的不同方式。这意味着它不能由 SPARQL 查询控制,它只是 returns 抽象形式的结果,而是由用于 format/convert/write 结果的任何 processor/formatter 控制。

我不知道这在 Jena 中具体是如何工作的(我自己就是一个芝麻人),但一般来说,SPARQL 引擎 returns 查询结果会产生一些内部表示 - 例如Java 个对象。然后如何呈现数据取决于您对结果的处理方式。例如,您可以使用 SPARQL XML 结果格式将其写入 XML 文件,或者您可以遍历它并将输出作为文本打印到 STDOUT。重点是:结果中是否有任何 IRI 作为前缀名称 rendered/displayed 取决于您如何处理结果, 而不是 由查询本身决定。