gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:34:24 24 4
gpt4 key购买 nike

假设我有以下 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 bindings 是 ?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 的对象),并且是 ?mid 的另一个绑定(bind),因为模式 [] :list/rdf:rest* ?mid ):

graphical representation of RDF list

与 Jena ARQ 扩展的比较

提问者还发布了 an answer它使用 Jena 的 ARQ 扩展来处理 RDF 列表。该答案中发布的解决方案是

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

这个答案取决于使用 Jena 的 ARQ 并启用扩展,但它更加简洁和透明。不明显的是一个人是否有明显更好的性能。事实证明,对于小列表,差异并不是特别显着,但对于较大的列表,ARQ 扩展具有更好的性能。纯 SPARQL 查询的运行时间很快变得非常长,而使用 ARQ 扩展的版本几乎没有区别。
-------------------------------------------
| num elements | pure SPARQL | list:index |
===========================================
| 50 | 1.1s | 0.8s |
| 100 | 1.5s | 0.8s |
| 150 | 2.5s | 0.8s |
| 200 | 4.8s | 0.8s |
| 250 | 9.7s | 0.8s |
-------------------------------------------

这些特定值显然会根据您的设置而有所不同,但总体趋势应该在任何地方都可以观察到。由于将来情况可能会发生变化,因此这是我正在使用的特定版本的 ARQ:
$ arq --version
Jena: VERSION: 2.10.0
Jena: BUILD_DATE: 2013-02-20T12:04:26+0000
ARQ: VERSION: 2.10.0
ARQ: BUILD_DATE: 2013-02-20T12:04:26+0000

因此,如果我知道我必须处理重要大小的列表并且我有可用的 ARQ,我会使用扩展。

关于rdf - 是否可以在 SPARQL 的 RDF 集合中获取元素的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17523804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com