如何在 SPARQL 中获取一天中几个小时的时间间隔值
How to get values for time intervals of hours in one day in SPARQL
我有一个简单的 RDF 图,其形式如下
v:order1 v:time "2016-01-18T04:00:01.536"^^xsd:dateTime .
v:order1 v:value "3118915.75"^^xsd:string .
...
v:orderN v:time "2016-01-18T04:59:58.536"^^xsd:dateTime .
v:orderN v:value "4117779.00"^^xsd:string .
图表记录特定时间戳的值;因此,一天产生大量数据
对于 SPARQL 1.1,我需要从每小时的最后一个 v:orderN
和第一个 v:Order1
值中获取一个小时的时间间隔的差异。任何想法我怎样才能实现这一目标?
我们可以使用的一个最小示例总是有很大帮助。将来,请提供我们可以 运行 查询的数据,并让我们知道期望的结果是什么。由于您没有另外指定,我将假设数据集只查看一天范围内的日期,这样我们就可以根据小时对这些日期进行分组,而不必担心特定的日期日期。这是一些数据,在 04 小时,从 10 变为 12(因此差异为 2),在 05 小时,从 40 变为 50(因此差异为 10)。另请注意,我使用的是 xsd:decimal 值,因为谈论字符串的差异并没有多大意义。
@prefix v: <urn:ex:> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
v:order1 v:time "2016-01-18T04:00:01.536"^^xsd:dateTime .
v:order1 v:value "10.0"^^xsd:decimal .
v:order2 v:time "2016-01-18T04:32:58.536"^^xsd:dateTime .
v:order2 v:value "11.00"^^xsd:decimal .
v:order3 v:time "2016-01-18T04:59:58.536"^^xsd:dateTime .
v:order3 v:value "12.00"^^xsd:decimal .
v:order4 v:time "2016-01-18T05:00:01.536"^^xsd:dateTime .
v:order4 v:value "40.00"^^xsd:decimal .
v:order5 v:time "2016-01-18T05:59:58.536"^^xsd:dateTime .
v:order5 v:value "50.00"^^xsd:decimal .prefix v: <urn:ex:>
查询非常简单。要查找一个小时内的最新值,您只需查找在同一小时内没有更晚值的条目。对于一个小时内的最早值也是如此。然后你只需计算差异。
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
select ?hour (?latest - ?earliest as ?difference) {
{ select (hours(?time) as ?hour) ?earliest {
?order v:time ?time ; v:value ?earliest
filter not exists {
?order_ v:time ?time_
filter (hours(?time_) = hours(?time) && ?time_ < ?time)
}
}
}
{ select (hours(?time) as ?hour) ?latest {
?order v:time ?time ; v:value ?latest
filter not exists {
?order_ v:time ?time_
filter (hours(?time_) = hours(?time) && ?time < ?time_)
}
}
}
}
---------------------
| hour | difference |
=====================
| 04 | 2.00 |
| 05 | 10.00 |
---------------------
我有一个简单的 RDF 图,其形式如下
v:order1 v:time "2016-01-18T04:00:01.536"^^xsd:dateTime .
v:order1 v:value "3118915.75"^^xsd:string .
...
v:orderN v:time "2016-01-18T04:59:58.536"^^xsd:dateTime .
v:orderN v:value "4117779.00"^^xsd:string .
图表记录特定时间戳的值;因此,一天产生大量数据
对于 SPARQL 1.1,我需要从每小时的最后一个 v:orderN
和第一个 v:Order1
值中获取一个小时的时间间隔的差异。任何想法我怎样才能实现这一目标?
我们可以使用的一个最小示例总是有很大帮助。将来,请提供我们可以 运行 查询的数据,并让我们知道期望的结果是什么。由于您没有另外指定,我将假设数据集只查看一天范围内的日期,这样我们就可以根据小时对这些日期进行分组,而不必担心特定的日期日期。这是一些数据,在 04 小时,从 10 变为 12(因此差异为 2),在 05 小时,从 40 变为 50(因此差异为 10)。另请注意,我使用的是 xsd:decimal 值,因为谈论字符串的差异并没有多大意义。
@prefix v: <urn:ex:> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
v:order1 v:time "2016-01-18T04:00:01.536"^^xsd:dateTime .
v:order1 v:value "10.0"^^xsd:decimal .
v:order2 v:time "2016-01-18T04:32:58.536"^^xsd:dateTime .
v:order2 v:value "11.00"^^xsd:decimal .
v:order3 v:time "2016-01-18T04:59:58.536"^^xsd:dateTime .
v:order3 v:value "12.00"^^xsd:decimal .
v:order4 v:time "2016-01-18T05:00:01.536"^^xsd:dateTime .
v:order4 v:value "40.00"^^xsd:decimal .
v:order5 v:time "2016-01-18T05:59:58.536"^^xsd:dateTime .
v:order5 v:value "50.00"^^xsd:decimal .prefix v: <urn:ex:>
查询非常简单。要查找一个小时内的最新值,您只需查找在同一小时内没有更晚值的条目。对于一个小时内的最早值也是如此。然后你只需计算差异。
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
select ?hour (?latest - ?earliest as ?difference) {
{ select (hours(?time) as ?hour) ?earliest {
?order v:time ?time ; v:value ?earliest
filter not exists {
?order_ v:time ?time_
filter (hours(?time_) = hours(?time) && ?time_ < ?time)
}
}
}
{ select (hours(?time) as ?hour) ?latest {
?order v:time ?time ; v:value ?latest
filter not exists {
?order_ v:time ?time_
filter (hours(?time_) = hours(?time) && ?time < ?time_)
}
}
}
}
---------------------
| hour | difference |
=====================
| 04 | 2.00 |
| 05 | 10.00 |
---------------------