选择每组的前X个结果

时间:2018-05-17 19:07:53

标签: grouping sparql limit data-cube

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

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

Application.StatusBar = "Please wait..."
Application.Cursor = xlWait
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

'..code..

Application.Cursor = xlDefault
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.StatusBar = False

所以我的商店里有多个<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> . 。现在我想弄清楚每个数据集的最后X qb:DataSet值。假设我想要每个特定数据集的最后5个值。

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

my:lastupdate

但是如果在每个数据集的单个SPARQL查询中完全可能的话,我有点迷失。我尝试了各种组合与子选择,LIMIT&amp; GROUP BY组合但没有任何结果导致我正在寻找的结果。

1 个答案:

答案 0 :(得分:4)

这个查询模式在现已解散的SemanticOverflow Q + A网站上进行了详细讨论,因为获得了每个国家/地区的3个最大城市,并且普遍的共识是表单&#39;获取每个主项目的前n个相关项目无法通过单个SPARQL查询进行有效管理。

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

自下而上规则唯一有用的例外是(not) exists过滤器,它们可以看到当前绑定。您可以利用这一事实来编写如下查询:

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)

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