group-by - SPARQL 仅按一个变量分组

标签 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

我得到了国家及其最大湖泊的面积,这是理想的结果,但没有湖泊的名称。我只想在表中列出湖的名称。因此,当我将 ?label 添加到选择中时,它会提示

Variable ?label is used in the result set outside aggregate and not mentioned in GROUP BY clause



如果我将 ?label 添加到 GROUP BY,那么它与 ?country 和 ?label 一起分组,它试图获得最大值。这导致列出所有可能的湖泊(当它按国家和湖泊分组时,每个组都有一个元素,因为国家湖泊组合总是唯一的),这不是我想要的。

我试图通过使用不同类型的连接和子查询来解决这个问题,但无济于事。 SAMPLE 也不起作用,因为它只是从该国随机选取一个湖泊,而不是最大的湖泊。 为了清楚起见,我不是在寻求答案,而是在问是否有可能列出变量而不添加到 GROUP BY 的方法。

最佳答案

这个答案并没有真正回答我最初的问题,即我是否可以选择一个变量而不在 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 检查以删除一些地区,如“纽瓦克盆地”。

关于group-by - SPARQL 仅按一个变量分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47086244/

相关文章:

jquery - 如何将 SPARQL 查询的结果重用于另一个查询?

java - 替换耶拿 SPARQL 查询中的变量

珀尔 : Error during installion of a module of CPAN

java - 从字符串中读取 rdf 模型

三列MySQL Group数据

mysql - 当需要 group by 中的最大值时,mysql WHERE IN SELECT GROUP BY 的替代方案

sparql - SPARQL 1.1 中的属性路径过滤器

sql-server - 按日期零结果计数组

mysql - 按 count(*) 和 0 而不是空分组

java - ShEx 验证 - 结果形状图中的 Reason 和 appInfo 为空