2012-12-15 39 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