FILTER NOT EXISTS和MINUS之间有什么区别?

8

请问有人能够解释一下SPARQL中FILTER NOT EXISTS和MINUS的区别吗?特别是当它们在其主体中不包含WHERE变量时。

例如,为什么以下查询会返回任何内容?

SELECT * {
   ?s ?p ?o .
   FILTER NOT EXISTS { ?x ?y ?z } .
}

为什么以下查询会返回所有内容?

SELECT * {
   ?s ?p ?o .
   MINUS { ?x ?y ?z } .
}

5
这是 SPARQL 1.1 查询语言规范中的一个节,它介绍了三种查询模式:否定、NOT EXISTS 和 MINUS。这些模式可以用来检查一个图形是否包含了某些模式,并且在结果中排除那些包含了这些模式的图形。 - Stanislav Kralin
2
这个回答解决了你的问题吗?SPARQL代数:根据它们拥有的三元组排除节点 - logi-kal
非常感谢大家。 - Edoardo Sera
1个回答

2

FILTER NOT EXISTSMINUS的区别与SPARQL使用的两种否定风格有关。根据规范

SPARQL查询语言包含两种否定风格,一种基于过滤结果,取决于图案是否在被过滤的查询解决方案上下文中匹配,另一种基于删除与另一个模式相关的解决方案。

仍然根据规范:

NOT EXISTS和MINUS代表了两种思考否定的方式,一种是基于测试数据中是否存在某个模式,给定查询模式已经确定的绑定,另一种是基于评估两个模式来删除匹配项。在某些情况下,它们可以产生不同的答案。

您问题的两个请求在规范中都有引用,并且结果以以下方式进行了解释:

SELECT * {
   ?s ?p ?o .
   FILTER NOT EXISTS { ?x ?y ?z } .
}

这个请求的结果集没有解决方案,因为{ ?x ?y ?z }与任何给定的?s ?p ?o都匹配,所以NOT EXISTS { ?x ?y ?z }会消除任何解决方案。
SELECT * {
   ?s ?p ?o .
   MINUS { ?x ?y ?z } .
}

[在请求中] 使用MINUS时,第一部分(?s ?p ?o)和第二部分(?x ?y ?z)之间没有共享变量,因此不会消除任何绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接