SPARQL 过滤器中使用 equals 和bound 的“not”的错误行为

问题描述 投票:0回答:1

我在 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 ) ) )
  }

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

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

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

我能够使用“minus {...}”构造来完成我需要的操作,但我真的不明白过滤器出了什么问题。

filter sparql equality
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.