Select 每组前 X 个结果
Select top X results per group
我有一堆具有附加属性的 RDF 数据立方体观察,在我的例子中是记录该值的日期。
模式很简单,例如(省略其他dimension/measure/attributes):
<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 网站上作为 'get the 3 largest cities for each country' 进行了详细讨论,普遍的共识是 [=20] 形式的查询=]'get the top n related items for each master item' 无法通过单个 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)
不幸的是,这种方法在大型现实世界数据集上通常不可行,因为它涉及扫描和过滤每个 country/city 组的笛卡尔积。
我有一堆具有附加属性的 RDF 数据立方体观察,在我的例子中是记录该值的日期。
模式很简单,例如(省略其他dimension/measure/attributes):
<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 网站上作为 'get the 3 largest cities for each country' 进行了详细讨论,普遍的共识是 [=20] 形式的查询=]'get the top n related items for each master item' 无法通过单个 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)
不幸的是,这种方法在大型现实世界数据集上通常不可行,因为它涉及扫描和过滤每个 country/city 组的笛卡尔积。