使用SPARQL获得有限的答案

使用SPARQL获得有限的答案,sparql,rdf,owl,Sparql,Rdf,Owl,我有一个RDF商店,上面有他们居住过的人和城市/州的列表: :P1 :hasLivedIn :NewYork :P2 :hasLivedIn :NewYork :P2 :hasLivedIn :California 现在,我想使用SPARQL为我提供一个在特定城市(例如纽约)居住过的所有人的列表 当我使用此选项时: select * where { ?p :hasLivedIn :NewYork } 给了我两个:P1和:P2,但我只想要:P1,因为只有:P1住在纽约 我不能使用过滤器将城

我有一个RDF商店,上面有他们居住过的人和城市/州的列表:

:P1 :hasLivedIn :NewYork

:P2 :hasLivedIn :NewYork
:P2 :hasLivedIn :California
现在,我想使用SPARQL为我提供一个在特定城市(例如纽约)居住过的所有人的列表

当我使用此选项时:

select * where { ?p :hasLivedIn :NewYork } 
给了我两个:P1和:P2,但我只想要:P1,因为只有:P1住在纽约

我不能使用过滤器将城市列入黑名单,因为城市和州太多了。在SPARQL中有这样做的方法吗


谢谢

您可能可以计算
?p
居住过的地方的数量。当它只生活在一个地方,即纽约时,只输出
?p

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

您可能可以计算
?p
居住过的地方的数量。当它只生活在一个地方,即纽约时,只输出
?p

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

有答案的
组是好的

也可以使用
不存在

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

答案的
组是好的

也可以使用
不存在

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

@YMomb提供的另一个查询使用否定SPARQL 1.1:

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

@YMomb提供的另一个查询使用否定SPARQL 1.1:

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