2016-01-16 59 views
1

假設(s,p,o)和列表,我想在芝麻中使用模型結構並檢查是否可以使用主題s,謂詞列表和範圍o最後。 (s,p,o)和{p1,p2,p3},存在如下三元組: (s,p1,o1),(o1, p2,o2),(o2,p3,o)在芝麻中使用一組謂詞到達同一個對象

芝麻或模型結構中是否有可能?

回答

1

可能最簡單的方法是通過SPARQL查詢。

查詢將使用屬性路徑表達式來表示此路徑。既然你想知道給定的起點和終點是否存在路徑,我認爲「是」或「否」的答案就足夠了。因此,我們可以做一個布爾ASK查詢:

ASK WHERE { :s (:p1|:p2|:p3)+ :o . } 

是否存在任何長度的路徑是由性能:p1:p2:p3的某種組合的:s:o之間這將返回true

既然你不能在Model直接執行SPARQL查詢,你需要創建一個內存Repository和做查詢前添加Model它,像這樣:

Model model = ...; // your model 

// create and initialize a temporary in-memory store 
Repository rep = new SailRepository(new MemoryStore()); 
rep.initialize(); 

try (RepositoryConnection conn = rep.getConnection()) { 
    // load the model into the repository 
    conn.add(model); 

    // execute the query 
    String query = "ASK WHERE { :s (:p1|:p2|:p3)+ :o . }"; 
    boolean pathExists = conn.prepareBooleanQuery(query).evaluate(); 
} 

或者,你可以通過一個簡單的遞歸方法來實現自己的路徑遍歷。

Model model = ...; // your model 

IRI start = ... ; // your start point :s 
IRI end = ...; // your end point :o . 
IRI p1 = ...; 
IRI p2 = ...; 
IRI p3 = ... ; 

boolean pathExists = pathExists(model, start, end, p1, p2, p3); 

結合實際的方法是這樣的:

boolean pathExists(Model m, IRI start, IRI end, IRI... properties) { 
    for(IRI p: properties) { 
     Model fromStart = m.filter(start, p, null); 
     if (fromStart.contains(start, p, end)) { 
       return true; 
     } 
     else { 
      for (Value obj: fromStart.objects()) { 
       if (obj instanceof Resource) { 
        if(pathExists(m, obj, end, properties)) { 
          return true; 
        }    
       } 
      } 
     } 
    } 
    return false; 
}  

...你可能需要延長該一點點(與到訪的中間節點的列表,以避免無限循環),但它說明了我希望的基本原則。無論如何,使用SPARQL查詢要容易得多。