使用SPARQL获得有限的答案

时间:2016-11-04 05:00:56

标签: sparql rdf owl

我有一个RDF商店,里面有人员名单和他们居住的城市/州:

:P1 :hasLivedIn :NewYork

:P2 :hasLivedIn :NewYork
:P2 :hasLivedIn :California

现在,我想使用SPARQL向我列出所有住在特定城市的人(例如newYork)

当我使用它时:

select * where { ?p :hasLivedIn :NewYork } 

给了我两个:P1和:P2但我只想要:P1因为只有:P1只存在 :NewYork。

我无法使用过滤器将城市列入黑名单,因为城市和州太多了。有没有办法在SPARQL中执行此操作?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以计算?p所居住的位置数量。仅当它只存在一个时才输出?p,即:NewYork

SELECT ?p WHERE {
     ?p :hasLivedIn :NewYork . 
     ?p :hasLivedIn ?anywhere
}
GROUP BY ?p
HAVING (COUNT(?anywhere) == 1)

答案 1 :(得分:1)

GROUP_HAVING答案很好。

也可以使用NOT EXISTS

完成
SELECT ?p WHERE {
     ?p :hasLivedIn :NewYork .
     FILTER NOT EXISTS 
        { ?p :hasLivedIn ?anywhere. FILTER(?anywhere != :NewYork) }
}

答案 2 :(得分:1)

对@YMomb提供的查询的替代查询使用否定SPARQL 1.1:

SELECT  ?p
WHERE
  { ?p  :hasLivedIn  :NewYork
    FILTER NOT EXISTS { ?p  :hasLivedIn  ?place
                        FILTER ( ?place != :NewYork )
                      }
  }