我有一些SPARQL查询如下所示:
SELECT DISTINCT ?name1
WHERE {
GRAPH <blabla>
{
?k swrc:author ?x .
?x foaf:name ?name1 .
} .
GRAPH <blabla2>
{
?l swrc:author ?y .
?y foaf:name ?name2 .
} .
FILTER(?x != ?y) .
}
我想获取仅存在于第一个图blabla
中的名称。
直观地反驳我得到一些实际属于交集的名字。这是因为b(集合A)= b(集合B)?
!=
的语义究竟是什么?我怎样才能超越这个问题?
答案 0 :(得分:4)
!=
的语义正是其左参数不等于其右参数。但是,对每个可能的值组合评估FILTER - 因此,在您制定它时,查询将返回?x
的所有名称值,其中某些值?y
不是等于它。
如果您只想取回?x
的{{1}}的名称值 ?y
的所有值不等于它,那么您应该使用{{1子句:
NOT EXISTS
}
请注意,使用此方法您实际上可以完全删除变量SELECT DISTINCT ?name1
WHERE {
GRAPH <blabla>
{
?k swrc:author ?x.
?x foaf:name ?name1.
}
FILTER NOT EXISTS {
GRAPH <blabla2>
{
?l swrc:author ?x.
}
}
:您将条件更改为仅检查第一个图表中找到的作者?y
是否也不会出现在第二个图表中。