提问人:Wizzard 提问时间:10/31/2023 最后编辑:M. JustinWizzard 更新时间:10/31/2023 访问量:31
SPARQL 过滤器中“not”的错误行为,具有等于和绑定
Wrong behavior of "not" in SPARQL filter with equals and bound
问:
我在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? 发生了什么事情?
我能够使用“减去 {...}”结构来做我需要的事情,但我真的不明白过滤器有什么问题。
答:
评论
item4
item5
FILTER ( ( ( ( bound(?bookAuthor) ) || ( bound(?articleAuthor) ) ) && ( ?bookAuthor != ?articleAuthor ) ) )
&&
?bookAuthor
?articleAuthor
?bookAuthor != ?articleAuthor
FALSE
item4
?bookAuthor != ?articleAuthor
FALSE