请问有人能够解释一下SPARQL中FILTER NOT EXISTS和MINUS的区别吗?特别是当它们在其主体中不包含WHERE变量时。
例如,为什么以下查询会返回任何内容?
SELECT * {
?s ?p ?o .
FILTER NOT EXISTS { ?x ?y ?z } .
}
为什么以下查询会返回所有内容?
SELECT * {
?s ?p ?o .
MINUS { ?x ?y ?z } .
}
请问有人能够解释一下SPARQL中FILTER NOT EXISTS和MINUS的区别吗?特别是当它们在其主体中不包含WHERE变量时。
例如,为什么以下查询会返回任何内容?
SELECT * {
?s ?p ?o .
FILTER NOT EXISTS { ?x ?y ?z } .
}
为什么以下查询会返回所有内容?
SELECT * {
?s ?p ?o .
MINUS { ?x ?y ?z } .
}
FILTER NOT EXISTS
和MINUS
的区别与SPARQL使用的两种否定风格有关。根据规范:SPARQL查询语言包含两种否定风格,一种基于过滤结果,取决于图案是否在被过滤的查询解决方案上下文中匹配,另一种基于删除与另一个模式相关的解决方案。
仍然根据规范:
NOT EXISTS和MINUS代表了两种思考否定的方式,一种是基于测试数据中是否存在某个模式,给定查询模式已经确定的绑定,另一种是基于评估两个模式来删除匹配项。在某些情况下,它们可以产生不同的答案。
您问题的两个请求在规范中都有引用,并且结果以以下方式进行了解释:
SELECT * {
?s ?p ?o .
FILTER NOT EXISTS { ?x ?y ?z } .
}
SELECT * {
?s ?p ?o .
MINUS { ?x ?y ?z } .
}