首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Sesame中的一组谓词到达相同的对象

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

Stack Overflow用户
提问于 2016-01-16 16:38:06
回答 1查看 49关注 0票数 1

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

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

芝麻或模型结构有任何可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-17 01:47:21

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

查询将使用属性路径表达式来表示此路径。由于您想知道是否存在一个路径为给定的起点和终点,我认为“是”或“否”的答案是足够好的。因此,我们可以执行布尔问询:

代码语言:javascript
运行
复制
ASK WHERE { :s (:p1|:p2|:p3)+ :o . }

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

由于不能在Model上直接执行SPARQL查询,因此需要在执行查询之前创建内存中的Repository并将Model添加到其中,如下所示:

代码语言:javascript
运行
复制
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();
}

或者,您可以通过一个简单的递归方法实现路径遍历。

代码语言:javascript
运行
复制
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);

实际的方法如下:

代码语言:javascript
运行
复制
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;
}      

...you可能需要扩展这一点(使用访问的中间节点列表以避免无限循环),但它说明了我希望的基本原则。无论如何,使用SPARQL查询要容易得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34829374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档