我在 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 {...}”构造来完成我需要的操作,但我真的不明白过滤器出了什么问题。