これは、 Is it possible to get the position of an RDF Collection in an RDF Collection in SPARQL? で説明されている、SPARQL を使用して RDF リスト内の要素の位置を計算するために使用されるのと同じ手法に基づいています。
次のようなデータがある場合:
@prefix : <http://example.org> .
:orgA :hasSuborganization :orgB, :orgC, :orgD.
:orgB :hasSuborganization :orgE, :orgF.
:orgE :hasSuborganization :orgG.
:orgG :hasSuborganization :orgH.
これは、次のような階層を表しています。
次に、次のようなクエリを使用できます。
prefix : <http://example.org>
select ?super ?sub (count(?mid) as ?distance) {
?super :hasSuborganization* ?mid .
?mid :hasSuborganization+ ?sub .
}
group by ?super ?sub
order by ?super ?sub
次のような結果を得るには:
$ sparql --query query.rq --data subs.n3
----------------------------
| super | sub | distance |
============================
| :orgA | :orgB | 1 |
| :orgA | :orgC | 1 |
| :orgA | :orgD | 1 |
| :orgA | :orgE | 2 |
| :orgA | :orgF | 2 |
| :orgA | :orgG | 3 |
| :orgA | :orgH | 4 |
| :orgB | :orgE | 1 |
| :orgB | :orgF | 1 |
| :orgB | :orgG | 2 |
| :orgB | :orgH | 3 |
| :orgE | :orgG | 1 |
| :orgE | :orgH | 2 |
| :orgG | :orgH | 1 |
----------------------------
ここでの秘訣は、X から Y への任意のパスが、X から何らかの中間ノード Z への (おそらく空の) パスとして表示できることを認識することです (空でないということは、X を Z として選択できることを意味します) Z から Y へ。Z を選択する可能な方法の数は、パスの長さを示します。