我正在尝试列出世界上每个国家最大的湖泊进行学校运动。我正在使用this dbpedia endpoint。这就是我所拥有的:
select ?country (MAX(?area) AS ?maxarea)
where {
?lake rdfs:label ?label .
?lake rdf:type dbo:Lake .
?lake dbo:areaTotal ?area .
?lake dbo:country ?country .
FILTER (lang(?label) = 'en') .
}
group by ?country
我得到了这个国家和最大湖的面积,这是理想的结果,但没有湖的名字。我只想在表格中列出湖泊的名称。所以当我向select添加?label时,它会抱怨
变量?标签用于聚合外部的结果集,而不在GROUP BY子句中提及
如果我将?标签添加到GROUP BY,那么它将使用?country和?标签进行分组,它会尝试获取最大值。这导致列出所有可能的湖泊(当按国家和湖泊分组时,每个群体都有一个元素,因为乡村湖泊组合总是独一无二的)这不是我想要的。
我尝试通过使用不同类型的连接和子查询来解决这个问题无济于事。 SAMPLE也不起作用,因为它只是选择了一个来自该国的随机湖泊而不是最大的湖泊。 为了说清楚,我不是要求答案,但我问是否有可能在不添加GROUP BY的情况下列出变量。
答案 0 :(得分:1)
这个答案并没有真正回答我原来的问题,即如果我可以在GROUP BY中选择一个变量而不使用它。据我所知,我可以用子查询列出它,但我不能只在GROUP BY中使用变量。
我使用这样的子查询解决了练习题:
select ?country ?area ?lake
where {
?lake rdfs:label ?label .
?lake rdf:type dbo:Lake .
?lake dbo:areaTotal ?area .
?lake dbo:country ?country .
?country rdf:type dbo:Country .
FILTER (lang(?label) = 'en') .
FILTER(?maxarea = ?area)
{
select ?country (MAX(?area) AS ?maxarea)
where {
?lake rdfs:label ?label .
?lake rdf:type dbo:Lake .
?lake dbo:areaTotal ?area .
?lake dbo:country ?country .
?country rdf:type dbo:Country .
FILTER (lang(?label) = 'en') .
}
group by ?country
}
}
我添加了一个?country rdf:type dbo:country check来删除像“Newark Basin”这样的地区。