Чтение 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());