2011-03-04 312 views
6

如何檢索兩個節點之間的路徑長度?例如,給定一個組織層次結構,我怎樣才能確定父母和子孫組織的分離程度?請考慮以下方案:計算節點之間的路徑長度?

  1. OrgA -hasSubOrganization-> OrgB, OrgC

    這就是我想要得到一個實體的所有直接下屬組織的非常簡單的情況。因此,路徑長度爲1。

  2. OrgA -> OrgB -> OrgC

    或一般情況下

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

欲遞歸遍歷向下的曲線,並找到每個組織通過hasSubOrganization屬於另一組織屬性。爲了讓所有的下級單位,遞歸,我可以使用property paths,例如,在+操作:

OrgA hasSubOrganization+ ?subOrg 

這會給我所有的下級單位,一直到葉節點。但是我的最終目標是構建組織層次結構,但關於「節點數量/步驟/級別/跳過子組織」的信息已丟失。這意味着我無法重新創建可視化的組織結構。

除了子組織的名稱外,如何捕獲「離開節點數」信息?

+0

這不是一個簡單的在線查詢,但是這個_can_可以實現。 [是否可以在SPARQL中的RDF集合中獲取元素的位置?](http://stackoverflow.com/q/17523804/1281433)簡化爲相同類型的查詢,並且答案有一個響亮的「是」。 – 2013-09-24 20:23:09

回答

12

這是基於用於計算在描述中使用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. 

描述這樣一個層次結構:

organization hierarchy

那麼你可以使用這樣的查詢:

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方式選擇數表示路徑的長度。

+5

需要注意的是,如果從X到Y存在多條路徑,則會崩潰。計數將包括來自兩條路徑的所有節點。 – 2014-04-21 13:41:47

1

由於工作組專門選擇不提供此信息,因爲它使實現變得更加複雜,所以不能使用順序路徑執行此操作。

如果您想要生成一個層次結構,則可能會同樣高效地進行一系列SPARQL查詢,其中每個查詢都會擴展層次結構的一個葉,而如果您的目標只是將可視化層次結構

可能還有其他方法使用Jena Ontology API - 我建議在他們的郵件列表上詢問[email protected]。組織更多的專家幫助

+0

謝謝你。我在semanticoverflow.com問了同樣的問題,也有人回答你說的http://www.w3.org/TR/sparql11-property-paths/#Outstanding_Issues。我想我會做的是使用屬性路徑來獲取所有&然後做後期處理來生成層次結構。 – Chantz 2011-03-06 04:06:01

+0

聽起來很不錯。是的,我在SemanticOverflow上看到了您的問題,但其他人已經在那裏回答了,所以沒有看到我複製的答案 – RobV 2011-03-06 17:35:27

+1

這個_can_可以使用[計算RDF列表中元素的位置](http ://stackoverflow.com/q/17523804/1281433)。 – 2013-09-24 20:41:49

相關問題