SPARQL 过滤器中“not”的错误行为,具有等于和绑定

Wrong behavior of "not" in SPARQL filter with equals and bound

提问人:Wizzard 提问时间:10/31/2023 最后编辑:M. JustinWizzard 更新时间:10/31/2023 访问量:31

问:

我在sparql的过滤器中发现了奇怪的“not”行为。为了演示我准备了一个简单的例子,这里是数据:

@prefix tst:      <http://data.test.org/resource/ontology/tst#> .
@base             <http://data.test.org/resource/ontology/tst> .

tst:Item1
    a                              tst:Book ;
    tst:relatedArticle               tst:Article1 ;
    tst:author   tst:Author1  .

tst:Article1
    a                                     tst:Article ;    
    tst:author        tst:Author1 .

tst:Item2
    a                              tst:Book ;
    tst:relatedArticle               tst:Article2 .

tst:Article2
    a                                     tst:Article .
    
tst:Item3
    a                              tst:Book ;
    tst:relatedArticle               tst:Article3 ;
    tst:author   tst:Author1  .

tst:Article3
    a                                     tst:Article ;    
    tst:author        tst:Author2 .

tst:Item4
    a                              tst:Book ;
    tst:relatedArticle               tst:Article4 ;
    tst:author   tst:Author1  .

tst:Article4
    a                                     tst:Article .

tst:Item5
    a                              tst:Book ;
    tst:relatedArticle               tst:Article5  .

tst:Article5
    a                                     tst:Article ;    
    tst:author        tst:Author1 . 

有 5 个项目类型为 Book,每个项目都适用于自己的文章。书籍和文章都有作者,所以我想找到作者不匹配的所有项目。所以我添加简单的请求

PREFIX tst: <http://data.test.org/resource/ontology/tst#>
SELECT  ?itemId
WHERE
  { ?itemId   a      tst:Book
    OPTIONAL
      { ?itemId tst:author  ?bookAuthor}
    OPTIONAL
      { ?itemId tst:relatedArticle/tst:author ?articleAuthor}
    FILTER ( ! ( ( ( ! bound(?bookAuthor) ) && ( ! bound(?articleAuthor) ) ) || ( ?bookAuthor = ?articleAuthor ) ) )
  }

它只返回 item3,好吧,我认为可能是我错过了过滤器中的某些内容,所以我删除了过滤器中的“!”,例如,除了现在它之外,一切都是一样的:

...FILTER ( ( ( ( ! bound(?bookAuthor)...
       

这返回了我期望的 item1 和 item2,这是可以的。 但是,如果我想反转这个过滤器并使用!它不返回 item3、item4、item5,而只返回 item3? 发生了什么事情?

我能够使用“减去 {...}”结构来做我需要的事情,但我真的不明白过滤器有什么问题。

过滤器 sparql 相等性

评论

0赞 UninformedUser 10/31/2023
为什么你认为它应该返回?你的否定确实否定了整个过滤器表达式,通过多次应用德摩根定律,这导致item4item5FILTER ( ( ( ( bound(?bookAuthor) ) || ( bound(?articleAuthor) ) ) && ( ?bookAuthor != ?articleAuthor ) ) )
0赞 UninformedUser 10/31/2023
连词 () 的第一部分要求必须绑定至少一个 和。但是:第二部分要求 - 这就是重点,如果两个变量中的一个没有绑定,那么这部分会导致错误,实际上会导致 .现在检查例如:它有一个作者,但其相关文章没有作者,因此,是错误的,因此,&&?bookAuthor?articleAuthor?bookAuthor != ?articleAuthorFALSEitem4?bookAuthor != ?articleAuthorFALSE
0赞 Wizzard 10/31/2023
“?bookAuthor != ?articleAuthor 是错误的,因此,FALSE” 好吧,想象它是 FALSE,那么第一部分也是 FALSE,因为对于 item4 “(!true && !false)”,所以整个过滤器都在里面“!(...)"将是“假或假”,然后是“!(false) -> true“,因此应显示 item4。而“not”应用于内部结构(),因此应首先对其进行评估,然后再进行反转。
0赞 Wizzard 10/31/2023
“ 如果两个变量中的一个没有绑定,那么这部分会导致错误,实际上会导致 FALSE。不,这不是真的,它会导致一些其他状态,这些状态没有转换为布尔值,只是以某种方式从结果集中删除。这就是问题所在。

答:

0赞 Wizzard 10/31/2023 #1

好的,我找到了它的原因,它不在布尔代数中,它与 SPARQL 如何处理未绑定值之间的比较有关。 事实上,它将处于某种“未绑定”的布尔状态,不会产生错误,并且只有在不需要时才会阻止整个布尔值的计算。但是,如果这个“无界”状态需要计算整个布尔值,那么它不会是假的,而是使整个布尔值“无界”,并且它不能被反转或任何东西。 为了更好地说明,请检查图片。example