SPARQL:找出两组中的差异和共同元素

时间:2014-11-16 08:38:34

标签: sql rdf sparql rdfs

我是SPARQL的新手,并努力实现这两个目标并需要你的帮助。我有两个类,我分别存储了python和CPP的关键字。现在我打算从这两个集合中找到共同的关键字,以及2之间的区别(意思是,python中存在而不是CPP中的关键字,反之亦然)。我已经尝试过MINUS而不是EXISTS版本的查询但没有帮助。 为了找到2组中的差异,我尝试了以下查询:

SELECT ?subject
    WHERE 
    { ?subject a python:Keywords. 
    { FILTER NOT EXISTS {?subject a cpp:Keywords} }
    }

为了找到2组中的常见元素,我尝试了以下查询:

select ?subject
where{ ?subject a python:Keywords. FILTER  EXISTS { ?object a cpp:Keywords}
}

他们都没有工作。请帮忙

2 个答案:

答案 0 :(得分:1)

SELECT ?subject
  WHERE 
  { ?subject a python:Keywords .
    ?subject a cpp:Keywords .
  }

应该为您提供常用的关键字。

SELECT ?subject
  WHERE 
  { ?subject a python:Keywords. 
    FILTER NOT EXISTS {?subject a cpp:Keywords}
  }

应返回python关键字,而不是cpp关键字。

答案 1 :(得分:1)

代码中的问题

在您的第一个查询中,问题是您已将过滤器放在另一组括号中。也就是说,你有:

SELECT ?subject
    WHERE 
    { ?subject a python:Keywords. 
    { FILTER NOT EXISTS {?subject a cpp:Keywords} }
    }

但应该改为:

SELECT ?subject
    WHERE 
    { ?subject a python:Keywords. 
      FILTER NOT EXISTS {?subject a cpp:Keywords}
    }

区别很重要,因为第一个是过滤封闭模式的匹配,实际上没有任何效果。

解决方案

之后,Abecee's answer就是您所需要的。交叉点只是两种类型的东西:

?x a :type1, :type2 

,区别在于一种类型但不是另一种类型:

?x a :type1
filter not exists { ?x a :type2 }

类似的问题和答案