【问题标题】:RiotException when loading a Model using Jena 2.12.1使用 Jena 2.12.1 加载模型时出现 RiotException
【发布时间】:2015-02-13 08:23:29
【问题描述】:

我创建了一个名为 RDFReader 的简单类,用于从 DBpedia 的 URI 加载模型:

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;

public class RDFReader {
    public static Model readFromURL(String URL){
      try{
         return (new FileManager()).loadModel(URL);
      }catch(Exception e){
         e.printStackTrace();
      }
      return null;  
     }

    public static void main(String[] args) {
      RDFReader.readFromURL("http://dbpedia.org/resource/Pacific_Rim_(film)");
    }   
}

我使用了 Jena v2.12.1,如下面我的 pom.xml 的 sn-p 所示

    <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-core</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>jena-arq</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>

通过使用 Jena v2.12.1 运行此代码,我得到了下一个异常:

org.apache.jena.riot.RiotException: [line: 21, col: 17] Unknown char: –(8211;0x2013)
at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
at org.apache.jena.riot.lang.LangEngine.raiseException(LangEngine.java:163)
at org.apache.jena.riot.lang.LangEngine.nextToken(LangEngine.java:106)
at org.apache.jena.riot.lang.LangTurtleBase.triples(LangTurtleBase.java:249)
at org.apache.jena.riot.lang.LangTurtleBase.triplesSameSubject(LangTurtleBase.java:191)
at org.apache.jena.riot.lang.LangTurtle.oneTopLevelElement(LangTurtle.java:44)
at org.apache.jena.riot.lang.LangTurtleBase.runParser(LangTurtleBase.java:90)
at org.apache.jena.riot.lang.LangBase.parse(LangBase.java:42)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:182)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:906)
at org.apache.jena.riot.RDFDataMgr.parse(RDFDataMgr.java:687)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:210)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:183)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:121)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:112)
at org.apache.jena.riot.adapters.RDFReaderRIOT.read(RDFReaderRIOT.java:77)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:253)
at com.hp.hpl.jena.util.FileManager.readModelWorker(FileManager.java:377)
at com.hp.hpl.jena.util.FileManager.loadModelWorker(FileManager.java:308)
at com.hp.hpl.jena.util.FileManager.loadModel(FileManager.java:260)
at edu.polito.rdf.utils.RDFReader.readFromURL(RDFReader.java:12)
at edu.polito.rdf.utils.RDFReader.main(RDFReader.java:20)

但是使用 Jena v2.11.0 代码运行没有任何问题。所以我想知道:

  1. 为什么 2.12.1 版本的 Jena 会产生这个错误?
  2. 是否可以使用 Jena 的 2.12.1 版本而不是 2.11.0 来解决这个问题?

顺便说一句,我正在使用 eclipse Luna 4.4.1 和 java 版本“1.8.0_11”。

【问题讨论】:

  • 请显示数据中的行。看起来 0x2013 用于前缀名称,这在 Turtle/RDF 1.1 中是非法的来自 jena 开发大师,有一个稍微好一点的错误消息: Failed to find a prefix name or keyword: –(8211;0x2013)
  • 根据 Jena 的文档,com.hp.hpl.jena.util.FileManager 类中的方法 loadModel(String URL) 从文件(在我的情况下为 DBpedia)加载模型,默认使用语法 RDF/XML。在我的示例中,我有 RDF dbpedia.org/data/Pacific_Rim_(film).rdf
  • 你有:“dbpedia.org/resource/Pacific_Rim_(film)”——没有“.rdf”。所以 Jena 应用内容协商并在 RDF/XML 之前列出 Turtle。
  • 最好还是使用 RDFDataMgr.loadModel(这一切都在同一台机器上完成)。
  • @AndyS 我已经尝试使用 RDFDataMgr.loadMode 并得到了相同的异常。

标签: rdf jena dbpedia


【解决方案1】:

问题是我试图访问资源http://dbpedia.org/resource/Pacific_Rim_(film),其中包含一个字符 0x2013(Em-dash),该字符在 Turtle 中是不合法的。

以下是这两个问题的答案:

  1. 我使用的是 Jena 2.12.1,它应用内容协商并在 RDF/XML 之前列出 Turtle,因此它发现 DBpedia(带有 Turtle)中的资源是错误的(如前所述)。使用 2.11.0 版本时,它可以毫无问题地运行,因为该版本有一个错误,允许解析器宽松。此错误随后在 2.12.1 版本中得到修复,因此读取具有非法字符的资源会引发 RiotException。

  2. 解决方案只是向 DBpedia 询问可通过http://dbpedia.org/data/Pacific_Rim_(film).rdf 访问的资源的 RDF/XML(或者 N-triples)。从 DBpedia 获取 RDF/XML 的最终代码是:

注意:正如@AndyS 所建议的,我使用了RDFDataMgr.loadModel(String URI)

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;

public class RDFReader {
   public static Model readFromURL(String URL){
        return RDFDataMgr.loadModel(URL);
   }

   public static void main(String[] args) {
        Model model =      RDFReader.readFromURL("http://dbpedia.org/data/Pacific_Rim_(film).rdf");
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2018-08-03
    • 2020-06-02
    相关资源
    最近更新 更多