簡體   English   中英

查詢以查找OWL本體中兩個節點之間的所有路徑

[英]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找到所有參與AB之間的一些路徑的三元組使得貓頭鷹:??topObjectProperty + CC貓頭鷹:topObjectProperty + b 這種查詢也有可能導致服務器崩潰,或者您的DBA將您綁在椅子上,並對UPS零件進行惡意處理。

某些系統提供了擴展,使實現這些算法更加容易-例如AllegroGraph對一流路徑具有非標准支持。

我認為最好的方法是為它實現一個算法! 我認為使用SPARQL或某些查詢方法無法完成此任務。 我已經在Java和Jena中實現了以下算法,以找到連接OWL本體中的一組節點的所有定向路徑。 您可以使用兩個必需的節點作為輸入。

給定一個圖G= (V, E)為:

  1. 指示
  2. 非循環的
  3. 非加權
  4. 可能在兩個頂點之間有一個以上的邊(因此,源和目的地不足以確定一個邊)。

給定一組頂點,我們稱它們為vSet 包含頂點vRoot ; 我們需要遵循以下條件找到vSet元素之間的所有路徑pSet

  1. 從vRoot必須可以訪問任何顯示為pSet某些路徑來源的頂點。
  2. 在任何路徑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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM