2

我想用这个简单的代码解析一个 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 中的异常:RDF/XML 输出中只能包含格式正确的绝对 URIrefs:<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 in QUERY:该字符违反了 URIs/ 的语法规则虹膜。

我怎样才能避免这种情况?显然,某些 URI 违反了 URI 的语法规则,所以我是否需要预处理我的输入数据,或者是否可以使用 Jena 进行配置?

4

1 回答 1

1

更新的答案

正如 Joshua Taylor 所指出的(一旦他的格式使查询更具可读性),问题在于数据中的 URI 完全被破坏了。RDF/XML 的限制之一是只能输出格式正确的 URI,并且如错误所示,在您的情况下它们不是。

要么您需要预处理输入,要么您需要让数据生产者修复他们的数据。Jena 没有内置任何支持来修复此类损坏的数据。

原始答案 - 将相对 URI 设为绝对

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

但是,当您写出数据时(在 RDF/XML 中,因为您没有指定要输出的特定格式)Jena 需要使 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 写入数据来防止其他代码更改数据。

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

于 2013-10-23T10:19:59.830 回答