我有一堆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组合但没有任何结果导致我正在寻找的结果。
答案 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)
不幸的是,这种方法通常不适用于大型真实世界的数据集,因为它涉及扫描和过滤每个国家/城市群的笛卡尔积。