SPARQL代数:排除基于三元组的节点 [英] SPARQL algebra: Excluding nodes based on triples they have
本文介绍了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
。
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屋!
查看全文