Когда SPARQLRepository RDF4J выполняет запрос SPARQL-запроса к этой конечной точке, конечная точка отправляет обратно свой ответ в формате Turtle. К сожалению, этот ответ содержит синтаксическую ошибку. Происходит следующее:
- RDF4J выполняет запрос, указывая несколько приемлемых форматов результатов (включая Turtle и N-Triples);
- Конечная точка выполняет запрос, выбирает Turtle в качестве формата ответа и сериализует результат запроса в Turtle;
- RDF4J получает данные Turtle и анализирует их;
- проанализированный результат передается NTriplesWriter, который затем записывает его.
Однако документ результата запроса, который отправляет конечная точка, не является синтаксически допустимой Turtle, что приводит к прерыванию синтаксического анализатора Turtle RDF4J с ошибкой на этапе 3.
Проблема в этой строке в ответе (строка 386):
yago:Italian_War_of_1494–98 ,
В частности, символ между 1494
и 98
. Хотя это выглядит как знак минус (-
), что было бы совершенно законно, на самом деле это так называемый «черточка» (символ Unicode 0x2013). Это недопустимый символ в префиксном имени в Turtle.
Средство записи Turtle конечной точки должно правильно сериализовать значение, изменив его на полный URI вместо префиксного имени и используя escape-последовательность Unicode, например:
<http://yago-knowledge.org/resource/Italian_War_of_1494\u201398>
Возможно, стоит зарегистрировать отчет об ошибке с сопровождающими конечных точек с предложенным исправлением этого эффекта.
В качестве обходного пути вывод N-тройки конечной точки (если вы заставляете ее отвечать N-тройками вместо черепахи) кажется синтаксически правильным. Вы можете заставить сервер отвечать N-Triples вместо Turtle, «перезаписав» стандартный заголовок Accept
, который отправляет SPARQLRepository
RDF4J, например:
SPARQLRepository repo = new SPARQLRepository(endpoint);
// create a new map of additional http headers
Map<String, String> headers = new HashMap<String, String>();
// we set the Accept header to _only_ accept text/plain, forcing the endpoint
// to use N-Triples as the response format. This overwrites the standard
// Accept header that RDF4J sends.
headers.put("Accept", "text/plain");
repo.setAdditionalHttpHeaders(headers);
Как только вы это сделаете, остальная часть вашего кода должна работать.