2012-12-15 38 views
4

我收到以下错误。如何验证SPARQL中的datetime对象? (Virtuoso 22007错误DT006)

Virtuoso 22007 Error DT006: Cannot convert -0359 to datetime : Incorrect month field length 

SPARQL query: 
define sql:big-data-const 0 
#output-format:text/html 
define sql:signal-void-variables 1 select ?item bif:year(xsd:dateTime(str(?dob))) as ?m{ 
?item <h://f.cm/ns/common/topic/notable_types> <h://f.cm/ns/people/person> . 
?item <h://f.cm/ns/people/person/date_of_birth> ?dob 
} limit 675 

如果我将限制更改为674,它的工作原理。

我怀疑是某个日期时间字段在某处出错,并打印?dob,其中显示其中一个值为-0359

解决方法是在应用bif函数之前验证该值。

但是,我们如何验证SPARQL中的日期时间?

回答

5

嗯,我通过谷歌发现了这个问题,因为我有同样的问题。寻找其他地方的帮助,我发现了以下解决方案:

SELECT * { 

    ?s ?p ?o 

    FILTER (datatype(?o) = xsd:datetime) 
    FILTER (coalesce(xsd:datetime(str(?o)), '!') != '!') 

} 

这对我有效。

请注意,我在SemanticWeb找到了答案。

+0

这里没有相同的方法运气。也没有运气:FILTER(正则表达式(str(?o),'^ [0-9] [0-9] [0-9] [0-9] - [01] [0-9] - [0- 3)[0-9]'))FILTER(xsd:datetime(?o)>'“+ minBirthDate +”'^^ xsd:datetime)。什么是聚合(...)在这里? – TextGeek

+0

上面的查询中的合并不顾名称的意思:它将?o的转换结果连接到带有感叹号的日期时间。如果结果只是一个感叹号,那就意味着日期时间是空的,因此,o不是有效的日期时间。由于我们对不会合并为'!'的结果进行过滤,因此我们过滤了确实是有效日期时间的值。这是否让你更清楚? –

+0

@TextGeek ...有点晚了,但你的minBirthDate真的有xsd:datetime或只是xsd:date(像我的):) FILTER(数据类型(?sdate)= xsd:date) FILTER(coalesce(xsd: date(str(?sdate)),'!')='!')' – Richard