1
假設(s,p,o)和列表,我想在芝麻中使用模型結構並檢查是否可以使用主題s,謂詞列表和範圍o最後。 (s,p,o)和{p1,p2,p3},存在如下三元組: (s,p1,o1),(o1, p2,o2),(o2,p3,o)在芝麻中使用一組謂詞到達同一個對象
芝麻或模型結構中是否有可能?
假設(s,p,o)和列表,我想在芝麻中使用模型結構並檢查是否可以使用主題s,謂詞列表和範圍o最後。 (s,p,o)和{p1,p2,p3},存在如下三元組: (s,p1,o1),(o1, p2,o2),(o2,p3,o)在芝麻中使用一組謂詞到達同一個對象
芝麻或模型結構中是否有可能?
可能最簡單的方法是通過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查詢要容易得多。