java - 使用 SPARQL 查询将数据类型 dataTime 插入本体中

标签 java rdf sparql jena ontology

我正在尝试使用以下 SPARQL 命令手动将数据插入 owl 文件中:

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 .

最佳答案

如果您打印创建的查询字符串,您应该很快就能看到它是无效的,即

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 即换行符,因为这将帮助解析器为您提供比 第 1 行第 96 列更有意义的错误消息以及更精确的错误位置 通过现有查询得到。

通常,如果您需要将常量注入(inject)查询/更新中,最好使用 Parameterized SPARQL String Jena 中的支持,这大大减少了出错的可能性,并且不像您当前的方法那样容易受到 SPARQL 注入(inject)的影响。

关于java - 使用 SPARQL 查询将数据类型 dataTime 插入本体中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28667736/

相关文章:

java - 继承DatabaseManager类或使其成为单例对象来实现DAO模式哪个更好?为什么?

java - 如何在按下按钮时添加不同类别的面板

sparql - MarkLogic 8 和 SPARQL

filter - 在 SPARQL 查询中对图使用 FILTER

sparql - 如何使用 Sesame 查询 SPARQL 端点,例如 DBPedia?

java - 使用 JAX-RS 处理 REST API 中的错误

syntax - 是否有语法来定义 Turtle RDF 中匿名节点之间的循环引用?

rdf - 只允许一个查询字符串

xml - 为什么我的 OWL 推理器没有给我预期的结果?

java - 哈希表。怎么运行的?