是否可以在SPARQL中获取RDF集合中元素的位置?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

假设我有以下Turtle声明:

@prefix : <http://example.org#> .

:ls :list (:a :b :c)

是否有一种方法可以获取集合中元素的位置?

例如,使用此查询:

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

SELECT ?elem WHERE {
 ?x :list ?ls .
 ?ls rdf:rest*/rdf:first ?elem .
}

我得到:

--------
| elem |
========
| :a   |
| :b   |
| :c   |
--------

但我想查询一下:

--------------
| elem | pos |
==============
| :a   |  0  |
| :b   |  1  |
| :c   |  2  |
--------------

有可能吗?

提问于
用户回答回答于

SPARQL 1.1方法

我已经扩展了数据,使问题变得更难一些。让我们向列表中添加一个重复元素,例如,一个额外的元素:a最后:

@prefix : <http://example.org#> .

:ls :list (:a :b :c :a) .

然后,我们可以使用这样的查询来提取每个列表节点(及其元素)以及该节点在列表中的位置。我们的想法是,我们可以用如下模式匹配列表中的所有单个节点[] :list/rdf:rest* ?node...位置但是,每个节点的中间节点数是列表头和?node...。我们可以通过将模式分解为

[] :list/rdf:rest* ?mid . ?mid rdf:rest* :node .

如果我们按?node,不同的数目?mid绑定是?node在名单上。因此,我们可以使用以下查询(该查询还获取元素(rdf:first)以获取列表中元素的位置:

prefix : <https://stackoverflow.com/q/17523804/1281433/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select ?element (count(?mid)-1 as ?position) where { 
  [] :list/rdf:rest* ?mid . ?mid rdf:rest* ?node .
  ?node rdf:first ?element .
}
group by ?node ?element
----------------------
| element | position |
======================
| :a      | 0        |
| :b      | 1        |
| :c      | 2        |
| :a      | 3        |
----------------------

这是因为RDF列表的结构是一个链接列表,如下所示?head是列表的开头(对象为:list)的另一个绑定:

用户回答回答于

我已经找到了一种使用ARQ中的属性函数库来实现它的方法。

PREFIX :     <http://example.org#>
PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>

SELECT ?elem ?pos WHERE {
 ?x :list ?ls .
 ?ls list:index (?pos ?elem).
}

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券