2016-11-04 54 views
0

有限的答案我有一个RDF存储与人名单和城市/州,他们已经住在:获取使用SPARQL

:P1 :hasLivedIn :NewYork 

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

现在,我想使用SPARQL给我的列表谁生活在一个特定的城市(如纽约)

当我用这一切的人:

select * where { ?p :hasLivedIn :NewYork } 

给了我两个:P1和:P2,但我只是想:P1因为只有:P1一直住在只有:纽约。

我不能使用过滤器将城市黑名单,因为城市和州太多了。有没有办法在SPARQL中做到这一点?

谢谢!

回答

1

完成的替代查询以由@YMomb提供的一个使用否定SPARQL 1.1:

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

你也许可以指望的位置,其中?p一直住在,而且只能输出?p的数量时,住在只有一个,即:NewYork

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

GROUP_HAVING回答是好。

它也可以与NOT EXISTS

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