java - 使用 Sesame 中的一组谓词达到相同的对象

标签 java model path sesame triples

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

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

Sesame或Model结构有没有可能?

最佳答案

可能最简单的方法是使用 SPARQL 查询。

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

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

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

因为您无法直接在 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 查询要容易得多。

关于java - 使用 Sesame 中的一组谓词达到相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34829374/

相关文章:

node.js - 是否有任何对象可以用于 node.js 的 Mapper 对象?

mysql - 由于文本类型已弃用,如何在 sailsjs 模型属性中设置文本类型

javascript - 从模型中获取数组以查看

python - 为什么 os.path.join 不使用 os.path.sep 或 os.sep?

java - 使用内置排序函数对二维数组进行排序

java - 通过输入流将字节流上传到 Google Drive

windows - 如何使用系统 (Windows) 从 Perl 调用子目录中的脚本

Java (JSP) 项目的相对路径

java - Java 电梯模拟器中的通知

java - 阻止 Google App Engine 从 appspot.com 提供服务