[英]Query to find all the path between two nodes in a OWL ontology
我是Sparql的新手。 我有OWL格式的汽車本體。 我正在嘗試編寫一個查詢,該查詢使用我的兩個節點的名稱並顯示它們之間的所有現有路徑。 例如下圖: 本體圖的示例 ,如果輸入節點是G和E,則它們之間的路徑可以是G cbe,G cadbe,G cathing,G h I e
我已經使用apache Jena從Eclipse連接到我的本體。 現在,我需要編寫上述查詢。 有沒有可以幫助我編寫查詢的示例?
這不是SPARQL發光的用例。 盡管SPARQL使用圖作為隱喻,但是對於實現經典圖算法而言,它並不是理想的選擇。
在某些情況下,使用多個迭代查詢來實現事情可能是最簡單的。 在其他情況下,使用SPARQL構造包含相關個體和屬性聲明的子圖可能更容易,然后將其用作常規算法之一的輸入。
請注意, 查找兩個節點之間的所有路徑的問題是NP難題 ,因此減少需要考慮的節點數量是一件好事。 您可能需要尋找最短的k條最短路徑-ESWC 2016挑戰賽有關該主題的結果現在已經可用 ; 不幸的是,這些文件目前還沒有自存檔或開放訪問。
根據三重存儲和圖形的結構的實現,它可能是可行的尋找每一個C找到所有參與A和B之間的一些路徑的三元組使得貓頭鷹:??topObjectProperty + C和C貓頭鷹:topObjectProperty + b 。 這種查詢也有可能導致服務器崩潰,或者您的DBA將您綁在椅子上,並對UPS零件進行惡意處理。
某些系統提供了擴展,使實現這些算法更加容易-例如AllegroGraph對一流路徑具有非標准支持。
我認為最好的方法是為它實現一個算法! 我認為使用SPARQL或某些查詢方法無法完成此任務。 我已經在Java和Jena中實現了以下算法,以找到連接OWL本體中的一組節點的所有定向路徑。 您可以使用兩個必需的節點作為輸入。
給定一個圖G= (V, E)
為:
給定一組頂點,我們稱它們為vSet
; 包含頂點vRoot
; 我們需要遵循以下條件找到vSet
元素之間的所有路徑pSet
:
pSet
某些路徑來源的頂點。 pSet
必須具有從其源和目的地vSet
,並且不能包含任何其它頂點vSet
。 下面的算法類似於BFS,它從vRoot
(根據上面的1)開始,每次迭代用一條邊增長當前路徑,直到到達vSet
另一個頂點v1
vSet
; 然后存儲此到達路徑,並開始從v1
開始增長一組新路徑。
這是偽代碼:
output = ∅;
maxLengthPaths = ∅;
1. add all edges that vRoot is there source to maxLengthPaths
2. while size(maxlengthpaths) != ∅ do
(a) paths := ∅;
(b) extendedPaths := ∅;
(c) foreach path p in maxLengthPaths do
i. if (destination of p in vSet)
1. add p to output
2. for each edge e that destination of p is its source
A. add e to extendedPaths
ii. else
1. add p to paths
iii. for path p1 in paths
1. for each edge that destination of p1 is its source
A. extend p1 by a edge and add it to extendedPaths
(d) maxLengthPaths = extendedPaths
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.