Чтение RDF не работает

Я пытаюсь использовать файл 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: [строка: 1, столбец: 50] Между publicId и systemId должны быть пробелы.

Я не понимаю, что означает это исключение. Как я могу это исправить. Я использую неправильный формат (не похож на "ЧЕРЕПАХА" или какой-либо другой формат)?

Моя среда (Windows 10 x64, apache-jena-3.1.1):

версия java "1.8.0_112" Java (TM) SE Runtime Environment (сборка 1.8.0_112-b15) 64-разрядная серверная виртуальная машина Java HotSpot (TM) (сборка 25.112-b15, смешанный режим


person Vertexwahn    schedule 13.12.2016    source источник
comment
Ваш код отлично работает на моей машине. Вы уверены в своей ошибке, поскольку в файле по данному URL-адресу нет символа 1:50.   -  person Richard-Degenne    schedule 13.12.2016
comment
Проверял на двух разных компьютерах с той же ошибкой.   -  person Vertexwahn    schedule 14.12.2016
comment
Может быть, это ошибка в одном из файлов, на которые есть ссылки?   -  person Vertexwahn    schedule 21.12.2016
comment
Я могу воспроизвести вашу проблему с jena 3.1.1, но она хорошо работает с jena 3.1.0. Поэтому немедленным обходным решением может быть понижение версии Apache Jena (если это возможно).   -  person potame    schedule 23.12.2016


Ответы (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, который был обновлен до HttpClient 4.5.2 в Jena 3.1.1.

Как указано в @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 ваше собственное соединение с возможностью перенаправления, которое будет использоваться вместо соединения по умолчанию; вы можете сделать это, вызвав метод HttpOp.setDefaultHttpClient перед использованием model.read, например:

    HttpOp.setDefaultHttpClient(HttpClientBuilder.create().build());
    
person Loris Securo    schedule 24.12.2016