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

0 rdf sparql jena

假设我有这些三元组:

@prefix : <http://example.org/>.
#rdf types
:john a :Person.
:liz a :Person.
:robert a :Person.
:dan a :Person.
Run Code Online (Sandbox Code Playgroud)

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

SELECT ?x
FROM <http://localhost:3030/Exercice3/data/>
WHERE {
    ?x ?y ?z
}
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的:

<http://example.org/john>
<http://example.org/liz>
<http://example.org/robert>
<http://example.org/dan>
Run Code Online (Sandbox Code Playgroud)

但是现在我要返回主题的本地名称,也就是说:

:john
:liz
:robert
:dan
Run Code Online (Sandbox Code Playgroud)

如何在连接到 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)
}
Run Code Online (Sandbox Code Playgroud)

这就是我到目前为止所得到的:(我不希望返回字符串)

":john"
":liz"
":robert"
":dan"
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗 ?

Jee*_*tra 5

单独使用 SPARQL 是不可能的。

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

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

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