使用 sparql 获取项目在 rdf 类型序列中的位置

Get position of item in rdf type sequence with sparql

我在 rdf 中有一个这样编码的序列:

_:blanknode <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq>.
_:blanknode <http://www.w3.org/1999/02/22-rdf-syntax-ns#_0> uri:a.
_:blanknode <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1> uri:b.
_:blanknode <http://www.w3.org/1999/02/22-rdf-syntax-ns#_2> uri:c.

现在我想知道给定 uri 在此列表中的位置。 有没有类似的东西:

SELECT ?position
WHERE {
_:blanknode <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq>.
uri:a <http://www.w3.org/1999/02/22-rdf-syntax-ns#_?position> _:blanknode
}

作为解决方法,我认为我可以使用:

<http://www.w3.org/1999/02/22-rdf-syntax-ns#_0> uri:value "1".
<http://www.w3.org/1999/02/22-rdf-syntax-ns#_1> uri:value "2".
and so on...

查询:

SELECT ?position
WHERE {
_:blanknode <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq>.
uri:a ?seqUri _:blanknode.
?seqUri uri:value ?position
}

但必须有更优雅的方式

您可以使用 REPLACE 函数删除 URI 的命名空间部分,然后将结果转换为整数,如下所示:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX uri: <http://example.org/> 

SELECT (xsd:integer(REPLACE(str(?prop), 
           "http://www.w3.org/1999/02/22-rdf-syntax-ns#_", "")) as ?pos)
WHERE { [] a rdf:Seq; 
           ?prop uri:a . 
}

结果:

pos
---
0