我有一些 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) .
}
Run Code Online (Sandbox Code Playgroud)
我想获取仅存在于第一个图中的名称blabla。
反直觉我得到了一些实际上属于交集的名字。发生这种情况是因为 b(集合 A)= b(集合 B)?
的语义究竟是什么!=?我怎样才能克服这个问题?
的语义!=正是它的左参数不等于它的右参数。但是 FILTER 会针对每个可能的值组合进行评估 - 因此,当您制定查询时,它将返回?x其某些值?y不等于它的所有名称值。
如果你想找回的唯一名字-值?x对其中所有的值?y不等于它,你应该使用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.
}
}
Run Code Online (Sandbox Code Playgroud)
}
请注意,使用这种方法,您实际上可以?y完全摆脱变量:您将条件更改为仅检查?x在第一个图中找到的作者也不会出现在第二个图中。