2017-01-18 4 views
1

У меня есть график, который я пытаюсь отфильтровать для отчета по дням недели. Например, я хочу найти все случаи, когда они произошли во вторник. Есть ли способ форматировать поле datetime в день недели или фильтровать по дням недели непосредственно в поле datetime?Определение дня недели для даты в SPARQL

ответ

2

Вы также можете определить день недели в стандартном SPARQL, если вы предоставили немного знаний о фонах. Для запроса требуется контрольная дата, предшествующая вашим датам, и день недели на эту дату.

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?date ?dayName 
WHERE { 
    # Sample dates 
    VALUES ?date { 
    "1961-08-04"^^xsd:date 
    "1986-04-03"^^xsd:date 
    } 
    # Compute days since a reference date 
    # This works in Virtuoso, which returns the difference in days. 
    # For example, Fuseki returns xsd:duration instead. 
    BIND (?date - "1900-01-01"^^xsd:date AS ?days) 
    # Compute modulo by 7 without a modulo operator 
    BIND (floor(?days - (7 * floor(?days/7))) AS ?mod) 
    VALUES (?mod ?dayName) { 
     (0 "Monday") # 1900-01-01 was Monday 
     (6 "Tuesday") 
     (5 "Wednesday") 
     (4 "Thursday") 
     (3 "Friday") 
     (2 "Saturday") 
     (1 "Sunday") 
    } 
} 
+0

Очень удобно - и в конечном итоге это используется, поскольку это стандартный SPARQL :) – OpenDataAlex

+0

Он опирается на стандартный синтаксис, но также и на определенную семантику. Как отмечено в комментарии к запросу, разница в дате возвращает количество дней в Virtuoso, но 'xsd: duration' в Fuseki (а реализации в других магазинах RDF могут отличаться). Это делает запрос специфичным для Virtuoso и аналогичным образом ведет себя в магазинах RDF. –

4

SPARQL не имеет функции имени дня, но если конечная точка SPARQL является экземпляром Virtuoso, вы можете использовать его функции SQL. Вот query you can run against DBpedia -

SELECT 
            ?birthdate 
    (bif:dayname(?birthdate) AS ?dayname) 
WHERE 
    { <http://dbpedia.org/resource/Barack_Obama> 
     <http://dbpedia.org/ontology/birthDate> ?birthdate 
    } 

- которые получат Barack Obama's birthdate and day -

birthdate dayname 
1961-08-04 Friday 

Я думаю, это было больше, отсутствие такой функции, которая блокирует вас, чем не зная, как построить свой SPARQL FILTER?

(ObDisclaimer: OpenLink Software производит Virtuoso, и использует меня.)

+0

Действительно - и поскольку я использую Virtuoso, это также очень полезно! Я глубоко погружаюсь в SPARQL, будучи долгое время пользователем SQL, поэтому все, что я привык делать в SQL/коде, я начинаю понимать в SPARQL. – OpenDataAlex

5

SPARQL не имеет «день недели» встроенной функции, однако, большинство языков программирования имеют встроенную поддержку для получения дня недели от данного объекта календаря/даты. Например, с помощью Java и RDF4J, вы можете просто извлечь DATETIME буквальный (представлено в виде Literal объекта с xsd:dateTime типом данных), преобразовать в календарном объект Java, а затем получить день недели:

Literal value = ... ; // the RDF4J literal value from your query result 
Calendar calendar = value.calendarValue().toGregorianCalendar(); 
int weekday = calendar.get(Calendar.DAY_OF_WEEK); 

Кроме того, большинство Двигатели SPARQL предлагают возможность добавления пользовательских функций.

Таким образом, вы можете либо просто получить DateTime, либо обработать результат, чтобы получить день недели, либо вы можете создать пользовательскую функцию и добавить ее в свой механизм SPARQL. Вот учебник по how to add a custom function to SPARQL using Sesame/RDF4J.

+0

Спасибо, Jeen, вот что я думал, но хотел убедиться. :) – OpenDataAlex

+0

Обратите внимание, что этот параметр «язык программирования» выполняет фильтрацию вне механизма базы данных, что может значительно увеличить время обработки, а также объем передаваемых данных , Это может быть целесообразным компромиссом в вашем ближайшем случае, но этого часто не будет. – TallTed

Смежные вопросы