2016-11-04 59 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) } 
}