Когда SPARQLRepository RDF4J выполняет запрос SPARQL-запроса к этой конечной точке, конечная точка отправляет свой ответ в формате Turtle. К сожалению, этот ответ содержит синтаксическую ошибку. Происходит следующее:
Однако документ результата запроса, который отправляет конечная точка, не является синтаксически допустимой 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>
It возможно, стоит зарегистрировать отчет об ошибках с сопровождающими конечных точек с предложенным исправлением этого эффекта.
В качестве обходного пути вывод N-триплетов конечной точки (если вы заставляете ее отвечать N-триплетами вместо черепахи) кажется синтаксически правильным. Вы можете заставить сервер отвечать N-тройками вместо Turtle, «перезаписав» стандартный заголовок Accept
, который отправляет RDF4J SPARQLRepository
, например:
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);
Как только вы это сделаете, Остальная часть вашего кода должна работать. [+1121]
COM является развитый OLE. OLE был рядом интерфейсов и механизмов хранения данных для упрощения обмена данными между приложениями. COM был естественным расширением использования интерфейсов не только для обмена данными, но и функциональность во время выполнения - где на данные выходили фактические механизмы для упрощения использования. Я всегда изображал его примерно как различие между C и C++, где с C, можно совместно использовать заголовочные файлы и структуры, и с C++ Вы совместно используете инкапсулировавшие объекты.
Как что-то вроде мыльницы, я все еще пропускаю Структурированное хранилище OLE, так как существует что-то хорошее о совместном использовании непрозрачного хранения данных между сотрудничающими системами. При наблюдении, поскольку перетаскивание/буфер обмена все еще зависит от него, интересно, какова замена .NET будет?
Технология OLE предшествует COM как отдельному объекту существенным количеством времени. Перед этим OLE был реализован как способ Встроить и Связать Объекты. Классическим примером является классический пример встраивания электронной таблицы в рамках документа слова. Базовая технология COM была включена так, чтобы другие языки, такие как VB могли взаимодействовать с теми объектами также.
Затем исторически, у нас было много программистов типа сервера, которые считали эти прохладные вещи как независимость языка, подсчет ссылок и модели потоков с завистью, но действительно не заботились слишком много о технологии встраивания вообще. Логическая вещь сделать состояла в том, чтобы разделить базовую функциональность сервера как COM - это был более естественно API низкого уровня.
Обе технологии все еще существуют. OLE отчасти соединен с или может совпасть с ActiveX в эти дни.