【问题标题】:Reading RDF does not work读取 RDF 不起作用
【发布时间】:2023-04-09 22:29:02
【问题描述】:

我正在尝试制作一个 foaf 文件:

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;

public class Testbed {
    public static void main(String[] args) {
        Model model = ModelFactory.createDefaultModel();

        try {
                model.read("http://www.csail.mit.edu/~lkagal/foaf", "RDF/XML"); 
        }
        catch(Exception ex) {
            System.out.println(ex.toString());
        }
    }
}

我收到以下异常:

org.apache.jena.riot.RiotException: [line: 1, col: 50] 空格 publicId 和 systemId 之间是必需的。

我不明白这个异常是什么意思。我该如何解决。我是否使用了错误的格式(看起来不像“TURTLE”或任何其他格式)?

我的环境(Windows 10 x64,apache-jena-3.1.1):

java 版本 "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b15) Java HotSpot(TM) 64 位服务器虚拟机(内部版本 25.112-b15,混合模式

【问题讨论】:

  • 您的代码在我的机器上运行良好。你确定你的错误,因为给定 URL 的文件没有 1:50 字符。
  • 在两台不同的电脑上测试过同样的错误。
  • 这可能是引用文件的错误吗?
  • 我可以用 jena 3.1.1 重现您的问题,但它适用于 jena 3.1.0。因此,直接的解决方法可能是降级 Apache Jena(如果可能的话)。

标签: java rdf apache-jena foaf


【解决方案1】:

URL http://www.csail.mit.edu/~lkagal/foaf 实际上是重定向到http://people.csail.mit.edu/lkagal/foaf。存在重定向是错误的原因。

该问题已在Jena 的开发分支中报告并修复(错误[JENA-1263])。

分析

Apache Jena 使用Apache HttpClient 进行连接处理。特别是Jena 3.1.0 使用HttpClient 4.2.6,在Jena 3.1.1 中更新为HttpClient 4.5.2

正如@potame 指出的那样,使用Jena 3.1.0 不存在问题,原因是它创建了一个默认支持各种功能的连接,包括自动跟随重定向(它使用new SystemDefaultHttpClient())。

相反,随着HttpClient 的更新,Jena 3.1.1 中的代码被修改为创建一个更小的连接类型,它无法跟随重定向(它使用HttpClients.createMinimal())。

发生的情况是,它没有到达您的 foaf 文件,而是检索重定向消息:

name="[xml]",ch=DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://people.csail.mit.edu/lkagal/foaf">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at www.csail.mit.edu Port 80</address>
</body></html>

然后尝试用Apache Xerces 解析它,这实际上是引发异常的那个(你可以通过使用ex.printStackTrace() 而不是System.out.println(ex.toString()) 看到):

...
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:282)
at org.apache.xerces.impl.XMLScanner.reportFatalError(XMLScanner.java:1467)
at org.apache.xerces.impl.XMLScanner.scanExternalID(XMLScanner.java:1001)
...

解决方案

  • 使用直接 URL,http://people.csail.mit.edu/lkagal/foaf
  • 使用以前版本的Jena
  • 使用Jena的开发分支
  • Jena 提供您自己的“可重定向”连接,以代替默认连接;你可以在使用model.read之前调用HttpOp.setDefaultHttpClient方法,例如:

    HttpOp.setDefaultHttpClient(HttpClientBuilder.create().build());
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多