这基于使用 SPARQL 计算 RDF 列表中元素位置的相同技术,该技术在以下内容中有所描述:Is it possible to get the position of an element in an RDF Collection in SPARQL?
如果你有这样的数据:
@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 的可能方式的数量表示路径的长度。