2015-02-23 31 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