在阅读Turtle文件时避免BadURIExceptions

时间:2013-10-23 08:51:47

标签: java rdf jena

我想使用这个简单的代码解析Turtle文件:

public void read(String path) throws IOException {
    File sourceFile = new File(path);

    Model model = ModelFactory.createDefaultModel();
    InputStream in = new FileInputStream(sourceFile);

    model.read(in, "", "TTL");
    model.write(System.out);
}

有时会抱怨一些URI:

  

线程“main”中的异常com.hp.hpl.jena.shared.BadURIException:只有格式良好的绝对URIrefs可以包含在RDF / XML输出中:<http://thetvdb.com/?tab=episode&seriesid={/tv/tv_series_episode/season.series[/authority/thetvdb/series]}&seasonid={/tv/tv_series_episode/season[/authority/thetvdb/season]}&id=337070>代码:0 / ILLEGAL_CHARACTER在QUERY中:字符违反了URI / IRI的语法规则。

我该如何避免这种情况?显然有些URI违反了URI的语法规则 我是否需要预处理输入数据,或者是否可以使用Jena配置它?

1 个答案:

答案 0 :(得分:1)

更新答案

正如Joshua Taylor所指出的那样(一旦他的格式化使查询更具可读性),问题就是数据中的URI只是简单的破坏了。 RDF / XML的一个限制是只能输出格式正确的URI,并且错误显示在你的情况下它们不是。

您需要预处理输入,或者需要让数据生产者修复他们的数据。 Jena没有内置任何支持来修复这样的破碎数据。

原始答案 - 使相对URI绝对

您的数据中的URI没有违反任何语法规则,而是表示为相对URI,并且您没有提供基本URI来解决这些问题,因此Jena在阅读它们时将它们保留原样(尽管它会发出有关的警告这一点)。

然而,当你写出数据时(在RDF / XML中,因为你没有指定输出的特定格式),Jena需要使URI绝对。再次,因为您没有指定基本URI,它不能这样做,写入时会导致错误。

您可以解决这个问题,方法是在解析URI时或在写出URI时将URI设为绝对值。

在解析时使它们成为绝对值,为read()操作指定基本URI,例如

model.read(in, "http://example.org/", "TTL");

要在写出时将它们设为绝对值,请为write()操作指定基本URI,例如

model.write(System.out, "RDF/XML", "http://example.org/");

您不一定需要同时执行这两项操作,因此它在写入时更灵活,因为它允许您使用不同的基URI来写出数据,这会导致生成不同的输出数据。但是,如果您在阅读时执行此操作,则可以通过稍后使用不同的基URI来阻止其他代码更改数据。

NB 无论出于何种原因,语言和基本URI参数在read()write()来电之间的顺序不同。