Это основано на том же методе, который используется для вычисления позиции элемента в списке RDF с использованием SPARQL, который описан в: Возможно ли получить позицию элемента в коллекции RDF в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 указывает длинупути.