純粋な 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
のための別のバインディングです)。?mid
[] :list/rdf:rest* ?mid

Jena ARQ 拡張機能との比較
質問者は、RDF リストを操作するために Jena の 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).
}
この答えは、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 を使用できることがわかっている場合は、拡張機能を使用します。