Sparql查询:查找具有相同属性对象的对象

时间:2014-12-22 17:32:08

标签: rdf sparql

假设我们有一个如下所示的数据集:

:person :wantsCD :cd1; :wantsCD :cd2 .
:storeA :sellsCD :cd1; sellsCD :cd2; sellsCD :cd3 .
:storeB :sellsCD :cd1; sellsCD :cd10; sellsCD :cd100 .

我有兴趣找到销售所有CD :person想要的商店,即(:storeA)。是否可以通过SPARQL查询获得此结果?当:person想要的CD的数量在运行时未知时,查询也应该起作用。我试过了:

SELECT DISTINCT ?store ?cd
WHERE { 
 :person :wantsCD ?cd.
 ?store :sellsCD ?cd.
}

但这会同时返回:storeA:storeB,因为:storeB也会销售:cd1

1 个答案:

答案 0 :(得分:1)

解决方案

  

我有兴趣找到出售所有CD的商店:人   想要,即(:storeA)。是否可以使用SPARQL获得此结果   查询?

是的,诀窍是做一些与所有商店相匹配的商品,然后筛选出那些商店没有的CD:

select ?store where {
  #-- matches every store that sells any CD.
  ?store :sellsCD []

  #-- make sure there is no CD that the person wants
  #-- that the store does not sell.
  filter not exists { 
    :person :wantsCD ?cd    #-- There is no CD that :person wants
    filter not exists {
      ?store :sellsCD ?cd   #-- that ?store does not sell.
    }
  }
}

备注

非常感谢您提供样本数据。除了您使用的;符号之外,还可以使您的生活更轻松,例如:

:person :wantsCD :cd1; :wantsCD :cd2

对于同一属性的多个对象,还有,符号。您可以将该行写为:

:person :wantsCD :cd1, :cd2