2016-08-25 8 views
0

У меня есть простой RDF график с помощью следующей формыКак получить значения временных интервалов часов в один день в SPARQL

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 . 

График записи значения для конкретных временных меток; поэтому за один день генерируется большое количество данных.
Мне нужно получить разницу во временном интервале в один час, от последнего v:orderN и первого значения v:Order1 каждого часа для SPARQL 1.1. Любые идеи, как я могу это достичь?

+0

Это действительно не ясно, что вы просите. Что вы подразумеваете под «RDF dataset со следующей формой»? График RDF - это пучок троек. То, что вы показали, больше похоже на строку таблицы с двумя столбцами. Неясно, что вы подразумеваете под «отличием от последнего и первого значения каждого часа». Какое значение «последнее значение часа»? Что такое «первое значение часа»? Посмотрите на [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). С данными, которые вы нам показали, какова фактическая ценность, которую вы пытаетесь получить? –

+0

Чтобы уточнить, для каждого часа в день вы хотите иметь разницу между максимальным и минимальным значениями всех значений за этот час? – AKSW

+0

Когда начинается час, он записывает значение. То же самое, когда значение заканчивается. Мне нужна разница этих значений, а не максимальные и минимальные значения. – Caleb

ответ

1

Минимальный пример, с которым мы можем работать, всегда очень помогает. В будущем, пожалуйста, предоставьте данные, с которыми мы можем запускать запросы, и дайте нам знать, каковы желаемые результаты. Поскольку вы не указали иначе, я собираюсь предположить, что набор данных учитывает только даты в пределах одного дня, поэтому мы можем группировать их только по часам, и нам не нужно беспокоиться о конкретных Дата. Вот некоторые данные, где в час 04 происходит изменение от 10 до 12 (так что разница составляет 2), а в час 05 происходит изменение от 40 до 50 (поэтому разница составляет 10). Также обратите внимание, что я использую xsd: десятичные значения, поскольку говорить о разности строк не имеет смысла.

@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  | 
---------------------