SPARQL不同运算符 SPARQL查询

SPARQL不同运算符 SPARQL查询,sparql,Sparql,我有一些SPARQL查询,如下所示: SELECT DISTINCT ?name1 WHERE { GRAPH <blabla> { ?k swrc:author ?x . ?x foaf:name ?name1 . } . GRAPH <blabla2> { ?l swrc:author ?y .

我有一些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) . 
    }
选择不同的名称1
在哪里{
图表
{
k swrc:作者?x。
x foaf:名称?名称1。
} .
图表
{   
l swrc:作者?y。
y foaf:姓名?姓名2。
} .
过滤器(?x!=?y)。
}
我想获得仅存在于第一个图形
blabla
中的名称

问题 与直觉相反,我得到了一些实际上属于交叉点的名字。这是因为b(集合A的)=b(集合b的)

问题:
的语义到底是什么=?我怎样才能超越这个问题?

的语义
=的左参数与右参数不相等。但是,过滤器会针对每个可能的值组合进行计算-因此,在制定查询时,它将返回
?x
的所有名称值,其中
?y
的某些值不等于该值

如果只想获取
?x
的名称值,而
?y
的所有值都不等于该值,则应使用
不存在
子句:

SELECT DISTINCT ?name1 
WHERE {
 GRAPH <blabla>
 {
   ?k swrc:author ?x.
   ?x foaf:name ?name1. 
 }
 FILTER NOT EXISTS { 
     GRAPH <blabla2>
     {   
       ?l swrc:author ?x.
     }
  }
选择不同的名称1
在哪里{
图表
{
k swrc:作者?x。
x foaf:名称?名称1。
}
筛选器不存在{
图表
{   
l swrc:作者?x。
}
}
}


注意,使用这种方法实际上可以完全去掉变量
?y
:您可以更改条件,只检查在第一个图中找到的author
?x
在第二个图中是否也出现

命名图只是三元组的集合。它不“拥有”三元组中出现的资源。RDF资源可以是URI、空白节点或文本。无论URI出现在哪个图形中,它都是相同的。这实际上是使用URI作为标识符的一个重要特性。这意味着你可以描述某些资源,其他人也可以。考虑到URI是相同的,无论它们出现在哪里,这似乎与你前面的问题重复,模块化了你正在使用不同的模式绑定变量的事实。这仍然是一个问题:如果你想要一个集差
{e:e在a中,e不是在B}
,你需要一个类似
..的查询。e是a的一个元素。。。筛选器不存在{…?e是B…}的元素