Поиск диапазона дат из строковых значений в SPARQL

У меня есть тройки, организованные следующим образом.

<nc:person1> <nc:hasDate> "201701"
<nc:person2> <nc:hasDate> "201703"
<nc:person3> <nc:hasDate> "201705"
<nc:person4> <nc:hasDate> "201706"
<nc:person5> <nc:hasDate> "201606"

Здесь объектная часть тройки содержит информацию о дате в строковом формате. Первые четыре цифры даты представляют год, а последние две цифры представляют месяц. Например, в «201701» 2017 — это год, а 01 — январь месяц.

Мне нужно написать запрос SPARQL, чтобы найти все даты, которые находятся в диапазоне от марта 2017 года до июня 2017 года. Мой результат должен выглядеть следующим образом.

"201703"
"201705"
"201706"

Я думаю, мне нужно написать запрос SPARQL следующим образом:

SELECT ?date WHERE{
 ?person nc:hasdate ?date.FILTER(?)
}

Я не уверен, какое условие фильтра мне нужно написать. Не могли бы вы сообщить мне, как проанализировать строку как дату и найти диапазон дат? Заранее спасибо.


person Beautiful Mind    schedule 19.11.2017    source источник
comment
Я не думаю, что вам нужно разбирать его. Для строк даты в формате ISO должно быть достаточно прямого сравнения.   -  person Sirko    schedule 19.11.2017
comment
Спасибо за ваш ответ. Не могли бы вы дать мне знать, как написать условие фильтра?   -  person Beautiful Mind    schedule 19.11.2017
comment
Я не знаю, почему вы не используете правильные литералы даты, но лексикографическое сравнение может работать для строк даты вашего типа: FILTER(?date >= "201703" && ?date <= "201706")   -  person UninformedUser    schedule 19.11.2017


Ответы (1)


Поэтому я проверил это (просто чтобы быть уверенным), и прямое сравнение строк работает для приведенного выше примера:

SELECT ?date
WHERE {
  ?person nc:hasDate ?date .
  FILTER( (?date > "201702") && (?date < "201707") )
}

Обратите внимание, что это будет работать только для строк даты, соответствующих ISO. Другие форматы могут не работать.

person Sirko    schedule 19.11.2017