Чтение 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) Java HotSpot(TM) 64-разрядная серверная виртуальная машина (сборка 25.112-b15, смешанный режим

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());
    
Другие вопросы по тегам