使用 Jena 2.12.1 加载模型时出现 RiotException
RiotException when loading a Model using Jena 2.12.1
我创建了这个名为 RDFReader 的简单 class 用于从 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
的以下片段所示
<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 代码运行没有任何问题。所以我想知道:
- 为什么 Jena 的 2.12.1 版本会产生这个错误?
- 是否可以使用 Jena 的 2.12.1 版本而不是 2.11.0 来解决这个问题?
顺便说一下,我正在使用 eclipse Luna 4.4.1 和 java 版本“1.8.0_11”。
问题是我试图访问资源 http://dbpedia.org/resource/Pacific_Rim_(film),其中包含一个字符 0x2013(Em-dash),这在 Turtle 中当时是不合法的。
以下是两个问题的答案:
我使用的是 Jena 2.12.1,它应用了内容协商并在 RDF/XML 之前列出了 Turtle,所以它发现 DBpedia(带有 Turtle)中的资源是错误的(如前所述)。对于 2.11.0 版,它 运行 没有问题,因为该版本有一个允许解析器宽松的错误。此错误随后在 2.12.1 版中得到修复,因此读取具有非法字符的资源会启动 RiotException。
解决方案是简单地向 DBpedia 询问可以通过 http://dbpedia.org/data/Pacific_Rim_(film).rdf 访问的资源的 RDF/XML(或者 N 元组)。从 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");
}
}
我创建了这个名为 RDFReader 的简单 class 用于从 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
的以下片段所示 <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 代码运行没有任何问题。所以我想知道:
- 为什么 Jena 的 2.12.1 版本会产生这个错误?
- 是否可以使用 Jena 的 2.12.1 版本而不是 2.11.0 来解决这个问题?
顺便说一下,我正在使用 eclipse Luna 4.4.1 和 java 版本“1.8.0_11”。
问题是我试图访问资源 http://dbpedia.org/resource/Pacific_Rim_(film),其中包含一个字符 0x2013(Em-dash),这在 Turtle 中当时是不合法的。
以下是两个问题的答案:
我使用的是 Jena 2.12.1,它应用了内容协商并在 RDF/XML 之前列出了 Turtle,所以它发现 DBpedia(带有 Turtle)中的资源是错误的(如前所述)。对于 2.11.0 版,它 运行 没有问题,因为该版本有一个允许解析器宽松的错误。此错误随后在 2.12.1 版中得到修复,因此读取具有非法字符的资源会启动 RiotException。
解决方案是简单地向 DBpedia 询问可以通过 http://dbpedia.org/data/Pacific_Rim_(film).rdf 访问的资源的 RDF/XML(或者 N 元组)。从 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");
}
}