1

假设 (s,p,o) 和列表,我想在 Sesame 中使用模型结构并检查是否可以使用主题 s、谓词列表并在最后达到 o。

例如我们说有一条路径,如果对于 (s,p,o) 和 {p1,p2,p3},存在以下三元组:(s,p1,o1) , (o1,p2,o2), (o2,p3,o)

Sesame 或 Model 结构中是否有任何可能性?

4

1 回答 1

2

可能最简单的方法是通过 SPARQL 查询。

查询将使用属性路径表达式来表达此路径。由于您想知道给定起点和终点是否存在路径,因此我假设“是”或“否”的答案就足够了。所以我们可以做一个布尔 ASK 查询:

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

如果在和true之间存在任意长度的路径,该路径由属性、和的某种组合组成,这将返回。:s:o:p1:p2:p3

由于您不能直接在 a 上执行 SPARQL 查询Model,因此您需要在执行查询之前创建一个内存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 查询要容易得多。

于 2016-01-17T01:47:21.127 回答