【问题标题】:Avoiding BadURIExceptions while reading Turtle file读取 Turtle 文件时避免 BadURIExceptions
【发布时间】:2013-10-23 08:51:46
【问题描述】:

我想用这个简单的代码解析一个 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 输出中只能包含格式正确的绝对 URIref:<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:字符违反URI/IRI 的语法规则。

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

【问题讨论】:

    标签: java rdf jena


    【解决方案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 写入数据来防止其他代码更改数据。

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

    【讨论】:

    • 错误消息中的 URI 看起来 是绝对的:<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:该字符违反了 URI/IRI 的语法规则。”这听起来不像是绝对 IRI 与相对 IRI 的问题。
    • (我并不是说答案一定是错误的;但如果要信任错误消息,我就会错过它与相对 IRI 和绝对 IRI 之间的联系。)
    • 好点,在重新格式化之前很难阅读问题。更新了我的答案以反映这一点
    • 是的,它不是很容易阅读。我对 OP 接受 的答案感到更惊讶;我看不出原始解决方案如何解决 OP 的问题。不过,更新后的答案很有意义。
    • @JoshuaTaylor 好吧,除非 Jena 在您提供 Base 时将 URI 视为相对的,并以某种方式形成有效的 URI??
    猜你喜欢
    • 2016-11-22
    • 2013-03-24
    • 1970-01-01
    • 2010-10-07
    • 2020-09-06
    • 1970-01-01
    • 2020-11-12
    • 2011-06-06
    相关资源
    最近更新 更多