SPARQL没有正确分组我的结果

时间:2014-09-24 17:36:08

标签: sparql dbpedia

我有以下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

enter image description here

有人能告诉我我做错了什么吗? 我认为它与领导者名单有关,每个国家不止一个人返回。 有没有办法以某种方式将其限制为每个国家的1个领导者?

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 .

this

dbpprop:leaderTitle/dbpprop:incumbent ?leader .