比较艺术家中的时间变量

时间:2014-10-18 01:10:11

标签: sparql virtuoso

我在virtuoso上工作并且遇到了比较时间变量的问题

我的数据在ttl文件中,非常简单,如下所示:

@prefix attr: <http://my.com/attr_> .
@prefix : <http://my.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

:t99255 attr:ts "2007-01-14 20:01:55"^^xsd:dateTime .
:t99255 attr:te "2008-10-04 14:33:09"^^xsd:dateTime .
:t99257 attr:ts "2009-05-02 04:35:11"^^xsd:dateTime .
:t99257 attr:te "2099-12-31 15:59:59"^^xsd:dateTime .

然后我将其加载到名为test的图形中。我运行查询“sparql select * from where {?s?p?o};”并获得4条以上的记录。

但是,当我运行以下查询时:

sparql
PREFIX  :       <http://my.com/>
PREFIX  attr:   <http://my.com/attr_>
PREFIX  xsd:    <http://www.w3.org/2001/XMLSchema#>

SELECT ?triple_0 ?t_ts ?t_te
FROM <gstest>
WHERE {
    ?triple_0 attr:ts ?t_ts .
    ?triple_0 attr:te ?t_te .
    FILTER ( ?t_ts < ?t_te )
};

我只得到一个结果只有一个结果“t99255”。我想问题是“2099-12-31 15:59:59”不是virtuoso的有效日期时间。所以我用“2020”代替“2099”,然后我有两个记录。

任何人都知道virtuoso中xsd:dateTime的值范围?

由于

1 个答案:

答案 0 :(得分:1)

语法问题

如果这实际上是您的数据:

@prefix attr: <http://my.com/attr_> .
@prefix : <http://my.com/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

:t99255 attr:ts "2007-01-14 20:01:55"^^xsd:dateTime .
:t99255 attr:te "2008-10-04 14:33:09"^^xsd:dateTime .
:t99257 attr:ts "2009-05-02 04:35:11"^^xsd:dateTime .
:t99257 attr:te "2099-12-31 15:59:59"^^xsd:dateTime .

那么你可能无法加载它,因为它没有声明xsd:前缀。您可能实际上并未加载任何数据。您是否从select * where { ?s ?p ?o }

等查询中获得了结果

图名称问题

  

然后我将其加载到名为test

的图形中

但是,您的代码是

SELECT ?triple_0 ?t_ts ?t_te
FROM <gstest>

那可能是个问题。你可以试试

select ?g ?s ?p ?o where {
  graph ?g { ?s ?p ?o }
}

确保您在图表中获得了预期的三元组。

关于查询和比较

您不需要将已经是日期时间的值转换为日期时间。即,而不是

FILTER ( xsd:dateTime(?t_ts) < xsd:dateTime(?t_te) )

你可以这样做:

FILTER ( ?t_ts < ?t_te )

例如,这是一个将?t_ts?t_te绑定到每个日期时间的查询,并仅返回有序对:

select ?t_ts ?t_te where {
  values ?t_ts { "2007-01-14 20:01:55"^^xsd:dateTime 
                 "2008-10-04 14:33:09"^^xsd:dateTime
                 "2009-05-02 04:35:11"^^xsd:dateTime
                 "2099-12-31 15:59:59"^^xsd:dateTime }
  values ?t_te { "2007-01-14 20:01:55"^^xsd:dateTime 
                 "2008-10-04 14:33:09"^^xsd:dateTime
                 "2009-05-02 04:35:11"^^xsd:dateTime
                 "2099-12-31 15:59:59"^^xsd:dateTime }
  filter ( ?t_ts < ?t_te ) 
}
order by ?t_ts ?t_te

SPARQL Results

t_ts                       t_te
----------------------------------------------------
2007-01-14T20:01:55+02:00  2008-10-04T14:33:09+02:00
2007-01-14T20:01:55+02:00  2009-05-02T04:35:11+02:00
2007-01-14T20:01:55+02:00  2099-12-31T15:59:59+02:00
2008-10-04T14:33:09+02:00  2009-05-02T04:35:11+02:00
2008-10-04T14:33:09+02:00  2099-12-31T15:59:59+02:00
2009-05-02T04:35:11+02:00  2099-12-31T15:59:59+02:00

这些是我在DBpedia上运行该查询时的结果,它正在运行Virtuoso的安装。