2014-09-24 95 views
0

我有以下SPARQL查询来获取与人口的每公里的最小密度和总统国家名单(领导者):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

首先,您应该将所有变量用于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 . 
+0

这正是我一直在寻找在返回一个结果的条款。但是它没有返回正确的结果。例如,格陵兰岛现任领导人是Aleqa Hammond(总理),而不是Mikaela Engell(Inatsisartut的演讲人)。因此,不是从领导者名单中获得第一个结果,是否有办法输出适当的领导者姓名?我想这只有在你的查询不仅仅是寻找领导者的时候才有可能,而且还特别针对有领导者的人的名字:总统或总理。我会接受你的答案,但如果你有时间,看看这是否可能。 – jjj 2014-09-25 14:08:47

+0

在基于单个的查询上,它会像这样工作,但我不确定如何将其实现到我自己的查询中:SELECT DISTINCT?x3 WHERE { ?x0 rdf:type dbpedia-owl:Country。 ?x0 rdfs:label“Argentina”@en。 ?x0 dbpprop:leaderTitle?x1。 ?x1 dbpprop:现任?x2。 ?x2 rdfs:label?x3。 } – jjj 2014-09-25 15:06:26