Должен ли xsd: date конвертировать для даты и времени до общей эры в SPARQL

Рассмотрим этот SPARQL, где datetime - это дата в 36 году до нашей эры:

SELECT ?date ?year WHERE {
  wd:Q1180731 wdt:P577 ?datetime .
  BIND(xsd:date(?datetime) AS ?date)
  # BIND(YEAR(?datetime) AS ?year)
}

Функция xsd:date(?datetime) не работает в экземпляре Blazegraph службы запросов Wikidata с java.lang.IllegalArgumentException: -036-01-01T00:00:00Z.

Это должно работать? Строка с YEAR не жалуется (без комментариев).

Вместо этого я придумал этот вариант:

SELECT ?date WHERE {
  wd:Q1180731 wdt:P577 ?datetime .
  BIND(REPLACE(STR(?datetime), 'T.*', '') AS ?date)
}

В этом случае результат -036-01-01. Сортировка таких дат до нашей эры может быть плохой. Есть ли у нас другие методы / функции для сортировки (строковых?) Дат до 1000 года (включая даты до нашей эры)?


person Finn Årup Nielsen    schedule 29.11.2017    source источник


Ответы (1)


Предполагается, что даты ISO 8601 будут содержать не менее четырех цифр для года (и это известно для реализаций быть не желающим иметь дело с более чем четырьмя цифрами). Это означает, что буквальная строка для вашей даты, вероятно, должна быть '-0036-01-01', а не '-036-01-01'.

Некоторые реализации не хотят рассматривать даты до нашей эры; это считается ограничением ресурсов, аналогичным нежеланию рассматривать строки размером более 10^10^10^10^10 байтов, так что, по сути, это проблема качества реализации, а не проблема соответствия.

Обратите внимание: если вы серьезно используете даты BCE, вам нужно использовать XSD. 1.1, в котором буквальный '-0036-01-01' обозначает день (по григорианскому календарю) 37 г. до н. Э., А не 36 г. до н. Э. (Год 0000 = 1 BCE, -0001 2 BCE и т. Д.) Насколько известно любому в РГ, в первую очередь, григорианские даты для периода до христианской эры используются астрономами, и, поскольку это разнесенное на единицу использование является их собственным (введено Cassini для упрощения вычислений даты), на самом деле не рекомендуется использовать -0036 для обозначения 36 BCE.

person C. M. Sperberg-McQueen    schedule 30.11.2017