9

2 つのノード間のパスの長さを取得するにはどうすればよいですか? たとえば、組織階層が与えられた場合、親組織と子孫組織がどの程度離れているかをどのように判断できますか? 次のシナリオを検討してください。

  1. OrgA -hasSubOrganization-> OrgB, OrgC

    これは、エンティティの直接のサブ組織をすべて取得したいという非常に単純なケースです。したがって、パスの長さは 1 です。

  2. OrgA -> OrgB -> OrgC

    または一般的な場合

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

グラフを再帰的に走査し、プロパティを通じて別の組織に属する各組織を見つけたいと考えていhasSubOrganizationます。すべてのサブ組織を再帰的に取得するには、次の演算子などのプロパティ パスを使用できます。+

OrgA hasSubOrganization+ ?subOrg

これにより、葉ノードに至るまでのすべてのサブ組織が表示されます。しかし、私の最終的な目標は組織階層を構築することですが、「サブ組織から離れたノード/ステップ/レベル/ホップの数」に関する情報は失われています。これは、ビジュアライゼーションの組織構造を再作成できないことを意味します。

サブ組織の名前に加えて、「離れたノード数」の情報を取得するにはどうすればよいですか?

4

2 に答える 2

24

これは、 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 を選択する可能な方法の数は、パスの長さを示します。

于 2013-09-24T20:32:36.183 に答える