如何在SPARQL中获取一天中小时的时间间隔值

时间:2016-08-25 15:51:51

标签: sparql rdf rdfs

我有一个简单的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值获得一小时的时间间隔差异。任何想法我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我们可以使用的最小示例总是有很大帮助。将来,请提供我们可以运行查询的数据,并告诉我们所期望的结果。由于您没有另外指定,我将假设数据集仅查看一天范围内的日期,以便我们可以根据小时对这些日期进行分组,而我们不必担心特定日期日期。这里有一些数据,在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      |
---------------------