2015-02-23 63 views
0

我手動嘗試使用以下SPARQL命令插入貓頭鷹文件中的數據:數據類型DATATIME插入與SPARQL本體查詢

qry = "PREFIX : <http://www.example.com/tempsensor#>" + 
     "INSERT DATA" + 
      "{" + 
":ind1 :locatedIn :Delhi ;" + ":onDate "+ "2014-10-01T00:10:10"^^xsd:dateTime +" ;" + ":measures 13 ;" + " :hasUnit Celsius ." + "}" ; 
     UpdateAction.parseExecute(qry,ontmod); 

在運行,我得到異常:

Encountered " <INTEGER> "10 "" at line 1, column 96. Was expecting one of: 
"graph" ... 
"}" ... 
";" ... 
"," ... 
"." ... 
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11Update._parse(ParserSPARQL11Update.java:78) 

如何我應該格式化日期時間,以便sparql將允許執行查詢。 本體使用在link

回答

1

如果您打印創建查詢字符串,你應該儘快能看到它是無效的,即

System.out.println(qry); 

的問題是,根據需要爲文字你還沒有把你的周圍日期時間常數報價在SPARQL中。

所以您的更新需要看起來更像是這樣的:

qry = "PREFIX : <http://www.example.com/tempsensor#>\n" + 
     "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" + 
     "INSERT DATA\n" + 
     "{\n" + 
     ":ind1 :locatedIn :Delhi ;\n" + 
     ":onDate \"2014-10-01T00:10:10\"^^xsd:dateTime ;\n" + 
     ":measures 13 ;" + " :hasUnit Celsius .\n" + 
     "}" ; 

注意需要使用\"逃脫引號所以Java沒有解釋它們作爲一個字符串的開始/結束。

我還添加了\n,即換行到你的字符串,因爲這將有助於解析器給你一個更有意義的錯誤信息,它帶有一個比你現有查詢獲得的line 1, column 96更精確的錯誤位置。

通常,如果您需要將常量注入到查詢/更新中,您最好在Jena中使用Parameterized SPARQL String支持,因爲您當前的方法比較容易出錯並且不容易受到SPARQL注入的攻擊。

+0

我試了相應的,但它引發異常爲:'線程中的異常'主要「com.hp.hpl.jena.query.QueryException:行5,列32:未解析的前綴名稱:xsd:datetime \t at com .hp.hpl.jena.sparql.lang.ParserSPARQL11Update._parse(ParserSPARQL11Update.java:90) \t在com.hp.hpl.jena.sparql.lang.ParserSPARQL11Update.parse $(ParserSPARQL11Update.java:45) \t在com.hp.hpl.jena.sparql.lang.UpdateParser.parse(UpdateParser.java:42) \t at com.hp.hpl.jena.update.UpdateFactory.make(UpdateFactory.java:88) ' – 2015-02-23 13:33:20

+1

@haroonrashid錯誤消息非常清楚地描述了這個問題:**「未解析的前綴名稱:xsd :約會時間」**。您可能沒有包含** xsd:**前綴。 – 2015-02-23 13:35:41

+0

@JoshuaTaylor我已經更新了我的答案,以添加缺少的前綴定義,但您指出原始查詢沒有包含它 – RobV 2015-02-23 14:38:13