如何在SPARQL中增加日期?

时间:2016-04-17 15:55:34

标签: sparql virtuoso

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

(我可以接受/忽略或纠正使用私人功能)

更新

由于建议的解决方案不适用于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'可以正常工作,但结果中的所有三个日期都是如此?

2 个答案:

答案 0 :(得分:2)

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

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 |
-----------------------------------------------------------------------------------

答案 1 :(得分:0)

经过一番尝试,我发现解决方案对我来说很好。在这里,我将在今天和未来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))