我有一张图表,我试图按周计算过滤报告。例如,我希望找到周二发生的所有实例。有没有办法将日期时间字段格式化为星期几,或者直接在日期时间字段中按星期几来过滤?
答案 0 :(得分:5)
SPARQL没有一周中的某一天'但是,大多数编程语言都内置了对从给定日历/日期对象中检索星期几的内置支持。例如,使用Java和RDF4J,您可以简单地检索dateTime文字(用row-reverse
数据类型表示为Literal
对象),转换为Java日历对象,然后检索工作日:
xsd:dateTime
此外,大多数SPARQL引擎都提供添加自定义功能的选项。
因此,您可以只检索dateTime并对结果进行后处理以获取星期几,也可以实际创建自定义函数并将其添加到SPARQL引擎中。这是how to add a custom function to SPARQL using Sesame/RDF4J的教程。
答案 1 :(得分:5)
如果您提供了一些背景知识,您还可以在标准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")
}
}
答案 2 :(得分: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,雇用我。)
答案 3 :(得分:2)
我使用Jindrich的解决方案,并尝试使用C1
算术(与Virtuoso不同,遵循SPARQL和XPath规范)重构它:
xsd:duration
我在Dydra上运行了查询,并且在采样日期(星期五和星期四)得到了正确的结果,但没有经过进一步测试。
答案 4 :(得分:0)
此SPARQL Results Page Link中的解决方案也适用于Virtuoso。
答案 5 :(得分:0)
当前,初始解决方案可以重新使用。按照此SPARQL Results Page的Virtuoso。
基本上是原始回复:
enum ZPositions: Int {
case background
case foreground
case player
case otherNodes
}
答案 6 :(得分:0)
这里是一个修订版本,它通过应用用于禁用查询优化器的编译指示来产生正确的解决方案。
DEFINE sql:disable-optimizations 16
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
}
BIND (xsd:date(?date) - "1900-01-01"^^xsd:date AS ?days)
BIND (bif:mod (?days, xsd:dayTimeDuration("P7D")) AS ?mod)
VALUES (?mod ?dayName) {
("PT0S"^^xsd:dayTimeDuration "Monday") # 1900-01-01 was Monday
("P1D"^^xsd:dayTimeDuration "Tuesday")
("P2D"^^xsd:dayTimeDuration "Wednesday")
("P3D"^^xsd:dayTimeDuration "Thursday")
("P4D"^^xsd:dayTimeDuration "Friday")
("P5D"^^xsd:dayTimeDuration "Saturday")
("P6D"^^xsd:dayTimeDuration "Sunday")
}
}
ORDER BY DESC (?date)