【发布时间】:2019-10-03 09:35:44
【问题描述】:
我正在尝试将 xsd:dateTime 转换为 xsd:date 以便能够仅按日期过滤对象。 但是通过在 GraphDB 中进行以下操作
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?s ?e {
VALUES (?start ?end) {("2011-02-02T14:45:14"^^xsd:dateTime "2011-02-04T14:45:13"^^xsd:dateTime)}
BIND ( xsd:date(?start) AS ?s)
BIND ( xsd:date(?end) AS ?e)
}
我收到以下错误
org.eclipse.rdf4j.query.QueryEvaluationException: Unknown function 'http://www.w3.org/2001/XMLSchema#date'
但是正如你在这里看到的GraphDB Javascript Functions 有一个 xsd:date 函数的用法。
【问题讨论】:
-
我确定这里的文档是错误的。根据标准 SPARQL 1.1,此函数不存在:w3.org/TR/sparql11-query/#FunctionMapping 在 GraphDB 文档中,该函数也未列为扩展名:graphdb.ontotext.com/documentation/standard/devhub/…
-
但是,我可以重现错误,而
xsd:dateTime确实有效。因此,要么该功能在 RDF4J 中不再存在,要么从未存在。顺便说一句,对于 Virtuoso 来说,它会起作用,所以有时三重商店确实支持不同的附加功能 w.r.t.标准 -
@AKSW 谢谢!你能建议任何方法来解决它是 SPARQL 吗?或者在这种情况下我需要为 GraphDB 创建自定义函数,如GraphDB Javascript Functions
-
嗯,是的。我假设一个自定义的 Javascript 函数可以为你做到这一点。我仍然不确定 Javascript 函数会返回哪种类型。在最坏的情况下,您可以将日期作为字符串返回,然后调用
BIND (STRDT(jsfn:date(?start), xsd:date) as ?s) -
其他解决方法:
bind(strdt(concat(str(year(?start)),"-", str(month(?start)),"-", str(day(?start))), xsd:date) as ?s)