Как выполнять арифметические операции в Sparql с python? - PullRequest
4 голосов
/ 20 ноября 2011

Я пишу калькулятор общественного достояния, код которого доступен по адресу: https://github.com/okfn/pdcalc/blob/master/pd/map.rdf

Код в настоящее время не может правильно определить статус произведения общественного достояния из-за проблемы, с которой столкнулсяsparql 1.0: не представляется возможным выполнить арифметическую операцию с датами, что означает, что калькулятор не может определить, например, было ли произведение опубликовано через 70 лет после смерти автора.К сожалению, ни одна из стандартных rdf-библиотек python еще не реализовала поддержку sparql 1.1. Поэтому мне было интересно, есть ли у кого-нибудь какие-либо предложения относительно того, как преодолеть это ограничение, или, может быть, знает какая-нибудь библиотека python с лучшей поддержкой sparql?1004 *

С нетерпением ждем вашего возврата!

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Даже SPARQL 1.1 не поддерживает арифметические операции с датами по умолчанию. См. Раздел Отображение оператора SPARQL : арифметические операции определены только для числовых типов данных.

Могут быть некоторые реализации SPARQL 1.1, которые предлагают расширение для этой цели, но я не сразу знаю о тех, которые имеют это встроенное сейчас, конечно, не в Python.

Лучше всего связаться с разработчиками SPARQL-движка по вашему выбору и приставить к ним, чтобы реализовать такое расширение, или в качестве альтернативы.

В качестве обходного пути, большинство движков SPARQL (даже 1.0) поддерживают операции сравнения по датам, поэтому вы можете выполнять такие вещи, как сортировка и сравнение, но вам придется выполнить некоторую пользовательскую постобработку в результате запроса.

Обновление Я только что понял, что упустил что-то довольно важное: SPARQL 1.1, конечно, поддерживает такие функции, как year(), month() и т. Д., Которые возвращают компонент года и месяца для значения datetime-значения как целое число, и которое вы могли бы использовать, чтобы сделать круговую арифметику на датах.

1 голос
/ 21 ноября 2011

Хотя вы не можете выполнять арифметические операции с датами в SPARQL 1.0, если реализация соответствует спецификации, вы, по крайней мере, сможете сравнивать даты:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT *
WHERE
{
  # Your Triple Patterns here
  FILTER( ?date > "2011-11-20T00:00:00Z"^^xsd:dateTime)
}

Теперь это по-прежнему не решает вашу проблему:вам нужно взять дату смерти автора и добавить к ней 70.Вероятно, вам нужно вычислить эту часть в вашем клиентском коде и вставить ее в ваши запросы SPARQL.Таким образом, это означает, что вам, возможно, придется выполнить два запроса - один для получения информации и один для расчета, если это общественная работа.Возможно, вы можете вычислить 2-ю часть только в коде клиента, чтобы сохранить дополнительный запрос.

Хотя это не идеально, пока не будет хорошей библиотеки Python, совместимой с SPARQL 1.1, это то, что вы застряли.

...