Проблема dotNetRdf с escape-последовательностями Unicode / неспособность Jena Fuseki загрузить апостроф в URI - PullRequest
1 голос
/ 06 апреля 2019

Я занимаюсь разработкой веб-приложения, и мне нужно поддерживать хранение данных RDF на моем сервере Jena Fuseki из нескольких источников данных (дампы БД / URI). Я столкнулся с проблемой с dotNetRdf. Я использую новейшую версию (2.2.0), загруженную в виде пакета NuGet. Я думаю, что проблема может быть вызвана неудачной обработкой escape-последовательностей Юникода при синтаксическом анализе.

Сначала я пытался привести пример из документации dotNetRdf (раздел: Чтение данных RDF, ссылка ниже), когда я получал ошибку при разборе. Код ошибки следующий:

IGraph g = new Graph();
g.LoadFromUri(new Uri("http://dbpedia.org/resource/Barack_Obama"));

Это должно быть функционально эквивалентно образцу кода в документации (https://github.com/dotnetrdf/dotnetrdf/wiki/UserGuide-Reading-RDF#reading-rdf-from-uris), Я просто использую метод расширения.

Я получаю исключение VDS.RDF.Parsing.RdfParseException с сообщением:

[Line 2233 Column 42 to Line 2233 Column 83] 
Unexpected Token <b>'Integer'</b> encountered, expected a Property Value
describing one of the properties of an Object Node

2233-я строка из данного ресурса DBpedia должна быть следующей:

"Barack Hussein Obama II (US /b\u0259\u02C8r\u0251\u02D0k hu\u02D0\u02C8se\u026An o\u028A\u02C8b\u0251\u02D0m\u0259/; born August 4, 1961) is an American politician who is the 44th and current President of the United States. He is the first African American to hold the office and the first president born outside the continental United States. Born in Honolulu, Hawaii, Obama is a graduate of Columbia University and Harvard Law School, where he was president of the Harvard Law Review. He was a community organizer in Chicago before earning his law degree. He worked as a civil rights attorney and taught constitutional law at the University of Chicago Law School between 1992 and 2004. While serving three terms representing the 13th District in the Illinois Senate from 1997 to 2004, he ran unsuccessfully in the Democratic primary for the United States Hou"@en ,

Между столбцами 42 и 84 есть несколько escape-последовательностей Юникода, и поэтому я предполагаю, что dotNetRdf неправильно их анализирует ?! (поскольку есть примечание о неожиданном целом числе.)

Я видел несколько вопросов StackOverflow, в которых обсуждалась неспособность DBpedia предоставить правильные данные, но эти вопросы, похоже, несколько устарели, это уже 2019. Поэтому я думаю, что DBpedia не проблема. У меня очень мало опыта работы с данными RDF, но мне здесь все в порядке.


Во-вторых, я попытался загрузить контент через HttpClient .NET, указав некоторые заголовки Accept (в моем случае text / turtle ), а затем попытался загрузить данные в экземпляр IGraph, вызвав IGraph.LoadFromString (. ..) метод. Не помогло Та же проблема, но другое исключение.

В-третьих - я наконец нашел обходной путь ! Я загрузил содержимое в строковую переменную (как было сказано - через HttpClient), а затем я использовал класс VDS.RDF.Parsing.Notation3Parser. Это сработало, но ... возникла другая проблема - когда я пытался сохранить график в своем триплет-магазине Jena Fuseki, я получил исключение RdfStorageException с внутренним исключением (WebException: удаленный сервер возвратил 400 неверных запросов).

Сообщение об исключении:

A HTTP error (HTTP 400 Parse error: [line: 10, col: 50] 
The declaration for the entity "ns5" must end with '>'.) 
occurred while saving a Graph to the Store.
Empty response body, see aformentioned status line or the inner exception for further details

Так, вероятно, данные даже не были правильно проанализированы? Будет ли это вообще возможно?

Вот упрощенный обходной код:

string content = /* get content via HttpClient */;

IGraph g = new Graph();
IRdfReader reader = new Notation3Parser();
reader.Load(g, new StringReader(content));

string connectionStr = "...";
var store = new PersistentTripleStore(new FusekiConnector(connectionStr));
...
store.UnderlyingStore.SaveGraph(g); // this call causes the mentioned RdfStorageException

Я использовал метод расширения, чтобы сохранить IGraph в файл, чтобы увидеть, что находится в IGraph (содержимое файла доступно прямо здесь: https://pastebin.com/nULJtjXu) и снова - когда я посмотрел 10-ю строку, которая вызывает проблему , есть escape-последовательность Юникода:

@prefix ns5:    <http://dbpedia.org/resource/Buyer\u0027s_Remorse:> .

(Примечание: \ u0027 - это апостроф ('))

Это странно, потому что в HTTP-ответе, возвращаемом DBpedia, есть много escape-последовательностей Юникода, и при первом появлении синтаксический анализ не завершается неудачно.

Так что, возможно, более вероятно, что у моей Йены Фусеки есть проблема с загрузкой данных с апострофом в URI?

Любая помощь с моей проблемой будет высоко ценится

1 Ответ

0 голосов
/ 06 апреля 2019

Ошибка Fuseki, вероятно, вызвана ошибкой в ​​модуле записи RDF / XML dotNetRDF.

Когда вы записываете свой IGraph в файл, похоже, что вы использовали писатель Turtle или Notation3. Но когда dotNetRDF общается с Fuseki, он использует средство записи RDF / XML. Таким образом, содержимое вашей пастбины не является тем, что отправляется в Fuseki.

Я получаю такую ​​же ошибку от Fuseki при отправке файла RDF / XML, например:

<!DOCTYPE RDF [
  <!ENTITY ns5 'http://dbpedia.org/resource/Buyer's_Remorse:' >
]>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>

Этот файл не содержит данных, он просто устанавливает сущность XML, как это принято в RDF / XML. Файл недействителен, потому что апостроф в середине объявления сущности не экранирован. (Это XML, поэтому его нужно экранировать как &apos;.)

Вы можете проверить проблему, записав IGraph в файл с помощью средства записи RDF / XML.

Я подал отчет об ошибке для dotNetRDF по этому поводу.

...