SPARQL 不同的运算符

Par*_*mar 2 sparql

SPARQL 查询

我有一些 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)?

的语义究竟是什么!=?我怎样才能克服这个问题?

Jee*_*tra 5

的语义!=正是它的左参数不等于它的右参数。但是 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在第一个图中找到的作者也不会出现在第二个图中。