我有一个图表,我试图按周计算过滤报告.例如,我希望找到周二发生的所有实例.有没有办法将日期时间字段格式化为星期几,或者直接在日期时间字段中按星期几来过滤?
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);
Run Code Online (Sandbox Code Playgroud)
此外,大多数SPARQL引擎都提供添加自定义功能的选项.
因此,您可以只检索dateTime并对结果进行后处理以获取星期几,也可以实际创建自定义函数并将其添加到SPARQL引擎中.这是一个关于如何使用Sesame/RDF4J向SPARQL添加自定义函数的教程.
如果您提供了一些背景知识,也可以确定标准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")
}
}
Run Code Online (Sandbox Code Playgroud)