SPARQL组只有一个变量

时间:2017-11-02 23:33:38

标签: group-by sparql rdf

我正在尝试列出世界上每个国家最大的湖泊进行学校运动。我正在使用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的情况下列出变量。

1 个答案:

答案 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 Ba​​sin”这样的地区。