Sparql 如何在GraphDB中将xsd:dateTime文字转换为xsd:date?

Sparql 如何在GraphDB中将xsd:dateTime文字转换为xsd:date?,sparql,graphdb,Sparql,Graphdb,我正在尝试将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:

我正在尝试将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)
}
但正如大家在这里看到的
使用xsd:date函数。

在GraphDB中创建javascript函数,如:

PREFIX jsfn:<http://www.ontotext.com/js#>
INSERT DATA {
    [] jsfn:register '''
    function convertDate(value) {
        return new Date(value);
    }
'''
}
前缀jsfn:
插入数据{
[]jsfn:注册''
函数日期(值){
返回新日期(值);
}
'''
}
验证函数是否已注册,或者:

PREFIX jsfn:<http://www.ontotext.com/js#>
SELECT ?s ?o {
    ?s jsfn:enum ?o
}
前缀jsfn:
选择?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)
}
前缀jsfn:
前缀xsd:
选择?s?e{
值(?开始?结束){(“2011-02-02T14:45:14”^^xsd:dateTime“2011-02-04T14:45:13”^^xsd:dateTime)}
绑定(jsfn:convertDate(?start)AS?s)
绑定(jsfn:convertDate(?end)AS?e)
}
返回的结果是:

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

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


希望这有帮助。

在GraphDB中创建javascript函数,如:

PREFIX jsfn:<http://www.ontotext.com/js#>
INSERT DATA {
    [] jsfn:register '''
    function convertDate(value) {
        return new Date(value);
    }
'''
}
前缀jsfn:
插入数据{
[]jsfn:注册''
函数日期(值){
返回新日期(值);
}
'''
}
验证函数是否已注册,或者:

PREFIX jsfn:<http://www.ontotext.com/js#>
SELECT ?s ?o {
    ?s jsfn:enum ?o
}
前缀jsfn:
选择?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)
}
前缀jsfn:
前缀xsd:
选择?s?e{
值(?开始?结束){(“2011-02-02T14:45:14”^^xsd:dateTime“2011-02-04T14:45:13”^^xsd:dateTime)}
绑定(jsfn:convertDate(?start)AS?s)
绑定(jsfn:convertDate(?end)AS?e)
}
返回的结果是:

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

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


希望这有帮助。

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

一些技术说明

作为参数传递给用户定义javascript函数的RDF值进行类型转换。
org.eclipse.rdf4j.model.IRI
org.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.xmlgoriancalendar

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

  • 最后,对于xsd:boolean是一个
    boolean

  • 对于其他内容,文本的标签为
    String

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

在第一个答案的示例中,
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\u未定义
,实际上是
整数.MIN\u值
,并通过RDF4J
值工厂
构造一个文本:

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);
    }
'''
}
前缀jsfn:
插入数据{
[]jsfn:注册''
函数日期(值){
value.setTime(java.lang.Integer.MIN_值、java.lang.Integer.MIN_值、java.lang.Integer.MIN_值);
返回org.eclipse.rdf4j.model.impl.SimpleValueFactory.getInstance().createLiteral(值);
}
'''
}

HTH

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

一些技术说明

作为参数传递给用户定义javascript函数的RDF值进行类型转换。
org.eclipse.rdf4j.model.IRI
org.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中的一个,则传递的值是实例