假设我们有一个如下所示的数据集:
: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
。
答案 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