阅读RDF不起作用

时间:2016-12-13 15:24:50

标签: java rdf apache-jena foaf

我正试图找一个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运行时环境(构建   1.8.0_112-b15)Java HotSpot(TM)64位服务器VM(内置25.112-b15,混合模式

1 个答案:

答案 0 :(得分:4)

网址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已更新为HttpClient 4.5.2中的Jena 3.1.1

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

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

发生的情况是,它只是检索重定向消息,而不是到达HttpClients.createMinimal()文件,而不是:

foaf

然后尝试使用Apache Xerces解析它,这实际上是引发异常的那个(您可以使用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> 而不是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) ...
  • 使用以前版本的http://people.csail.mit.edu/lkagal/foaf
  • 使用Jena
  • 的开发分支
  • Jena提供您自己的&#34;重定向功能&#34;连接,用于代替默认连接;您可以在使用Jena之前调用方法HttpOp.setDefaultHttpClient,例如:

    model.read