【问题标题】:How to convert xsd:dateTime literal into xsd:date in GraphDB?如何在 GraphDB 中将 xsd:dateTime 文字转换为 xsd:date?
【发布时间】: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)

标签: sparql graphdb


【解决方案1】:

关于 GraphDB Javascript 函数的链接中的文档使用了一个不存在的函数 xsd:date。由于某种原因,它没有在发布中结束。

一些技术说明。

作为参数传递给用户定义的 javascript 函数的 RDF 值会进行类型转换。 org.eclipse.rdf4j.model.IRIorg.eclipse.rdf4j.model.BNode 的实例“按原样”传递,但字面量转换如下:

  • 如果它是整数数据类型,例如(xsd:integer, xsd:long, xsd:int, xsd:byte, xsd:short, xsd:nonPositiveInteger, xsd:negativeInteger, xsd:nonNegativeInteger, xsd:positiveInteger, xsd:unsignedLong, xsd:unsignedInt, xsd:unsignedShort和 xsd:unsignedByte) 传递的值是 long

  • 如果它是以下之一:xsd:decimal、xsd:float 或 xsd:double,则传递的值为 double

  • 如果它是以下之一:xsd:dateTime、xsd:date、xsd:time、xsd:gYearMonth、xsd:gMonthDay、xsd:gYear、xsd:gMonth 或 xsd:gDay,则传递的值是javax.xml.datatype.XMLGregorianCalendar

  • 如果是持续时间,例如其中之一:xsd:duration、xsd:dayTimeDuration 或 xsd:yearMonthDuration 传递的值是 javax.xml.datatype.Duration 的实例

  • 最后,对于 xsd:boolean 是 boolean

  • 对于其他任何内容,Literal 的标签为String

或者,返回值也被转换。 如果是org.eclipse.rdf4j.Value 的实例,则不进行任何转换。 否则,转换为 RDF 文字取决于它的类型以及 RDF4J ValueFactory 作为可以处理这些问题的 createLiteral 方法中可用的内容,包括 XMLGregorianCalendar。因此,如果没有特定的处理程序,则使用结果的字符串值来创建 Literal。

在第一个答案的示例中,jsfn:convertDate 的结果是 jdk.nashorn.internal.objects.NativeDate 类型,因此当创建结果的文字时,插件会调用其 toString 并导致类似 [Date 2011-02-02T14:45:14.000Z] 的结果

此外,插件中的脚本引擎仅限于访问以java.lang.(不包括java.lang.Thread)、org.eclipse.rdf4j.model.com.ontotext.trree.sdk. 开头的类

考虑到上述注意事项和限制,将xsd:dateTime转换为xsd:date的javascript函数需要将与时间相关的日历值字段设置为DatatypeConstants.FIELD_UNDEFINED,实际上是Integer.MIN_VALUE并通过 RDF4J ValueFactory 构造一个 Literal:

PREFIX jsfn:<http://www.ontotext.com/js#>
INSERT DATA {
    [] jsfn:register '''
    function convertDate(value) {
        value.setTime(java.lang.Integer.MIN_VALUE, java.lang.Integer.MIN_VALUE, java.lang.Integer.MIN_VALUE);
        return org.eclipse.rdf4j.model.impl.SimpleValueFactory.getInstance().createLiteral(value);
    }
'''
}

HTH

【讨论】:

  • 有趣。显然,这些细节都不能在文档中找到,所以只有像你这样的 GraphDB 开发人员才能编写自定义 Javascript 函数,这些函数返回类型文字或纯字符串之外的类似内容。
【解决方案2】:

在 GraphDB 中创建 javascript 函数,例如:

PREFIX jsfn:<http://www.ontotext.com/js#>
INSERT DATA {
    [] jsfn:register '''
    function convertDate(value) {
        return new Date(value);
    }
'''
}

验证函数是否已注册或:

PREFIX jsfn:<http://www.ontotext.com/js#>
SELECT ?s ?o {
    ?s jsfn:enum ?o
}

然后按如下方式使用:

PREFIX jsfn:<http://www.ontotext.com/js#>
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 ( jsfn:convertDate(?start) AS ?s)
    BIND ( jsfn:convertDate(?end) AS ?e)
}

返回结果是:

[日期 2011-02-02T14:45:14.000Z]

[日期 2011-02-04T14:45:13.000Z]

希望这会有所帮助。

【讨论】:

  • 好吧,[Date 2011-02-02T14:45:14.000Z] 不会是约会,对吧?据我了解,返回的文字应该是"2011-02-02"^^xsd:date
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 2010-11-20
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2016-10-31
  • 2019-10-21
  • 2011-06-15
相关资源
最近更新 更多