如何在 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))
如何在 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))