确定SPARQL中的日期时间

时间:2017-01-18 20:51:06

标签: datetime sparql

我有一张图表,我试图按周计算过滤报告。例如,我希望找到周二发生的所有实例。有没有办法将日期时间字段格式化为星期几,或者直接在日期时间字段中按星期几来过滤?

7 个答案:

答案 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)

SPARQL Query Results Page

相关问题