Вычислить длину пути между узлами?

Как я могу получить длину пути между двумя узлами? Например, с учетом организационной иерархии, как я могу определить, насколько далеко отделены родители и организация-потомок? Рассмотрим следующие сценарии:

  1. OrgA -hasSubOrganization-> OrgB, OrgC

    Это очень упрощенный случай, когда я хочу получить все непосредственные субординации сущности. Следовательно, длина пути равна 1.

  2. OrgA -> OrgB -> OrgC

    или общий случай

     OrgA -> OrgB - - - - - - - - OrgZ 

Я хочу рекурсивно пересечь график и найти каждую организацию, принадлежащую другой организации, через свойство hasSubOrganization . Чтобы получить все рекурсивные суб-организации, я могу использовать пути свойств , например, оператор + :

 OrgA hasSubOrganization+ ?subOrg 

Это даст мне все суборганизации вплоть до листовых узлов. Но моя конечная цель – создать иерархию организации, но информация об «количестве узлов / шагов / уровней / хмелях от суборганизации» теряется. Это означает, что я не могу воссоздать структуру org для визуализации.

Как я могу захватить информацию о «количестве узлов» в дополнение к названию суборганизации?

2 Solutions collect form web for “Вычислить длину пути между узлами?”

Это основано на том же методе, который используется для вычисления позиции элемента в списке RDF с использованием SPARQL, который описан в: Возможно ли получить позицию элемента в коллекции RDF в SPARQL?

Если у вас есть такие данные:

 @prefix :  . :orgA :hasSuborganization :orgB, :orgC, :orgD. :orgB :hasSuborganization :orgE, :orgF. :orgE :hasSuborganization :orgG. :orgG :hasSuborganization :orgH. 

который описывает такую ​​иерархию:

иерархия организации

то вы можете использовать такой запрос:

 prefix :  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 указывает длину пути.

Вы не можете сделать это, используя подходящие пути, так как рабочая группа специально решила не делать эту информацию доступной, поскольку она значительно усложняет реализацию.

Если вы хотите сгенерировать иерархию, вероятно, будет так же эффективно делать целую серию запросов SPARQL, где каждый запрос расширяет один лист иерархии и вообще не использует пути свойств, если ваша цель – просто визуализировать иерархию

Могут быть другие подходы, использующие API-интерфейс Jena Ontology – я бы рекомендовал просить их список рассылки jena-users@incubator.apache.org для получения дополнительной экспертной помощи

Interesting Posts
Давайте будем гением компьютера.