如何在 SPARQL 中增加日期?

How to increment dates in SPARQL?

如何在 SPARQL 中增加一般数字和特别是日期?具体来说,我有一个过滤器可以让我只找到今天出生的人: FILTER (STRLEN(STR(?born)) > 6 && (SUBSTR(STR(?born),6)=SUBSTR(STR(bif:curdate('')),6))。 如何扩展此过滤器,以便我也能得到未来两天出生的人?

(我可能会accept/ignore或更正使用私有函数)

更新

由于建议的解决方案在 DBpedia 上不起作用,我用 Virtuoso 私有函数实现了它,但除了使用 UNION,我不知道如何更改过滤器或找到另一个优雅的解决方案,以便我让人们在今天、明天和后天出生。目前这部分查询看起来像这样:

BIND ((SUBSTR(STR(?born),6)=SUBSTR(STR(now()),6,5)) as ?tday)
BIND ((SUBSTR(STR(?born),6)=SUBSTR(STR(bif:dateadd("day", 1, now())),6,5)) as ?tday1)
BIND ((SUBSTR(STR(?born),6)=SUBSTR(STR(bif:dateadd("day", 2, now())),6,5)) as ?tday2)

FILTER (STRLEN(STR(?born)) > 6)
FILTER (?tday) .

?tday 替换为 ?tday1?tday2' 效果很好,但结果中的所有三个日期如何?

如果您的端点支持持续时间算法,您可以为日期添加持续时间。例如,在这里我们可以为日期添加两天的持续时间,并查看结束日期环绕到下个月的正确行为:

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

select ?begin ?end where {
  values ?begin { "2005-02-28T00:00:00Z"^^xsd:dateTime }
  values ?duration { "P2DT0H0M0.000S"^^xsd:duration }
  bind( (?begin + ?duration) as ?end)
}
-----------------------------------------------------------------------------------
| begin                                | end                                      |
===================================================================================
| "2005-02-28T00:00:00Z"^^xsd:dateTime | "2005-03-02T00:00:00.000Z"^^xsd:dateTime |
-----------------------------------------------------------------------------------

经过一些尝试,我找到了适合我的解决方案。在这里,我把今天和接下来 7 天出生的所有人都带走了:

values ?d {0 1 2 3 4 5 6 7}

BIND ((SUBSTR(STR(?born),6) as ?bornSTR))
BIND ((SUBSTR(STR(bif:dateadd("day", ?d, now())),6,5)) as ?day)

FILTER (STRLEN(STR(?born)) > 6 &&  STR(?bornSTR) = STR(?day))