SPARQL代数:排除基于三元组的节点 [英] SPARQL algebra: Excluding nodes based on triples they have

查看:7
本文介绍了SPARQL代数:排除基于三元组的节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用此图表:

:thing1 a :Foo ;
    :has :A ;
    :has :B .

:thing2 a :Foo ;
    :has :B ;
    :has :A .

:thing3 a :Foo ;
    :has :A ;
    :has :B ;
    :has :C .

我想选择:thing1:thing2,但不是:thing3

以下是我编写的有效的SPARQL查询。有没有更好的方法来做到这一点?

SELECT ?foo WHERE {
    ?foo a :Foo ;
        :has :A ;
        :has :B .
    MINUS {
        ?foo a :Foo ;
            :has :A ;
            :has :B ;
            :has ?anythingElse .
        FILTER(?anythingElse != :A && ?anythingElse != :B)
    }
}

推荐答案

不存在减号IS筛选器的替代筛选器:

SELECT ?foo WHERE {
    ?foo a :Foo ;
        :has :A, :B .
   FILTER NOT EXISTS {
       ?foo :has ?other .
       FILTER (?other NOT IN (:A, :B))
    }
}

粗略地说,就是Find All?使用:A和:B,然后检查它们是否没有其他:有值。

在执行效率方面,有一些优化将一些负模式变成Filter不存在,反之亦然,也有共享公共子模式的可能性。

如果没有那么智能的优化器,过滤器NOT EXISTS可能会更快,因为"?foo a:foo;;has:a,:b"。不重复,并且筛选器只考虑已通过"?foo a:foo;;has:a,:b."的项目。

只有一种方法可以知道,当所有影响(包括缓存)结合在一起时,应尝试对真实数据进行实况处理。

这篇关于SPARQL代数:排除基于三元组的节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆