我有以下SPARQL查询,以获取每公里人口密度最小的国家名单及其总统(领导人):
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?country_name ?populationdensity ?leader
WHERE {
?country a dbpedia-owl:Country ;
rdfs:label ?country_name ;
prop:populationDensityKm ?populationdensity ;
dbpedia-owl:leader ?leader .
FILTER (?populationdensity < 10 && langMatches(lang(?country_name), "en")) .
}
GROUP BY ?populationdensity
ORDER BY ASC(?populationdensity)
limit 10
正如您所看到的,我按人口密度对结果进行分组,但我得到的结果包括许多人口密度重复:SPARQL Query
有人能告诉我我做错了什么吗? 我认为它与领导者名单有关,每个国家不止一个人返回。 有没有办法以某种方式将其限制为每个国家的1个领导者?
答案 0 :(得分:1)
首先,您应该将您使用的所有变量放在group by子句中。 Virtuoso目前在解析查询方面很松散,并且不允许这样做。 第二个是你需要只选择一个领导者,如果你不关心哪一个,那么你应该使用SAMPLE。如果您想要所有这些,请使用group_concat变体。
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?country_name ?populationdensity (sample(?leader) as ?ls)
WHERE {
?country a dbpedia-owl:Country ;
rdfs:label ?country_name ;
prop:populationDensityKm ?populationdensity ;
dbpedia-owl:leader ?leader .
FILTER (?populationdensity < 10 && langMatches(lang(?country_name), "en")) .
}
GROUP BY ?country_name ?populationdensity
ORDER BY ASC(?populationdensity)
limit 10
如果您想要当前的领导者,则需要更换行
dbpedia-owl:leader ?leader .
dbpprop:leaderTitle/dbpprop:incumbent ?leader .