grouping - 选择每组前 X 个结果

标签 grouping sparql limit data-cube

我有一堆 RDF 数据立方体观测值,它们具有附加属性,在我的例子中是记录该值的日期。

该模式很简单,例如(省略其他维度/度量/属性):

<obs1> a qb:Observation ;
  my:lastupdate '2017-12-31'^^xsd:date ;
  qb:dataSet <dataSet1> .

<obs2> a qb:Observation ;
  my:lastupdate '2016-12-31'^^xsd:date ;
  qb:dataSet <dataSet1> .

<obs2_1> a qb:Observation ;
  my:lastupdate '2017-12-31'^^xsd:date ;
  qb:dataSet <dataSet2> .

<obs2_2> a qb:Observation ;
  my:lastupdate '2015-12-31'^^xsd:date ;
  qb:dataSet <dataSet2> .

所以我的商店中有多个 qb:DataSet 。现在我想找出每个数据集的最后 X 个 my:lastupdate 值。假设我想要每个特定数据集的最后 5 个值。

对于一个特定的数据集,我可以非常轻松地做到这一点:

SELECT * WHERE {

  ?observation my:lastupdate ?datenstand ;
                 qb:dataSet <dataSet1>                                                                                                                                            
} ORDER BY DESC(?datenstand) LIMIT 5    

但是,如果这在每个数据集的单个 SPARQL 查询中完全可能的话,我会有点迷失。我尝试了与子选择、LIMIT 和 GROUP BY 组合的各种组合,但没有得到我正在寻找的结果。

最佳答案

此查询模式在现已不存在的 SemanticOverflow Q+A 网站上进行了详细讨论,“获取每个国家/地区的 3 个最大的城市”,普遍的共识是查询采用 形式“获取每个主项目的前 n 个相关项目”无法通过单个 SPARQL 查询以有效的方式进行管理。

核心问题是嵌套查询是自下而上评估的,GROUP/LIMIT 子句将应用于整个结果集而不是每个组。

自下而上规则的唯一有用的异常(exception)是(not)exists过滤器,它对当前绑定(bind)具有可见性。您可以利用这一事实来编写如下查询:

select ?country ?city ?population where {

    ?country a :Country; :city ?city.
    ?city :population ?population.

    filter not exists { select * where {

        ?country :city ?_city.
        ?_city :population ?_population.

        filter ( ?_population > ?population )

    } offset 3 }

} order by ?country desc(?population)

不幸的是,这种方法通常不适用于大型现实世界数据集,因为它涉及扫描和过滤每个国家/城市组的笛卡尔积。

关于grouping - 选择每组前 X 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50398880/

相关文章:

api - Youtube API 每天最大视频上传次数

javascript - 在 Jquery 中总结和分组 JSON 对象

r - 根据 group_by 行及其列值选择行

haskell - 有没有办法在 Haskell 中对长度进行模式匹配?

limit - SPARQL 中的括号是什么?为什么链接的电影数据库限制为 2500 条记录?

java - rdf :id 的 sparql 查询

java - Sparql 与 Java Jena

MySQL:表 tbl_2_1_15 已满

apache-spark - Spark 访问前 n 行 - 采取与限制

mysql - SQL 对连接表的多个记录进行分组?