RDF4J: проанализировать результат запроса с конечной точки и сохранить его в виде файла ntriples (некорректный запрос) - PullRequest
0 голосов
/ 19 января 2019

в этой конечной точке есть возможность получить результат запроса в формате N-трипл.Я хочу сделать то же самое с библиотекой rdf4j при подключении к конечной точке и сохранить результат в файле формата ntriples.

До сих пор я использовал graphQuery (CONSTRUCT):

        .....
        String queryString = prefixes +
                " CONSTRUCT { ?sub ?hasProp ?prop } WHERE { ?sub ?hasProp ?prop FILTER(?sub = yago:Naples) } ";
        GraphQuery graphQuery = con.prepareGraphQuery(QueryLanguage.SPARQL, queryString);
        RDFWriter writer = new NTriplesWriter(System.out);
        graphQuery.evaluate(writer);

К сожалению, я получаю: [Неправильный результат запроса с сервера] (Ожидается «.», Найдено «-»).В конечной точке результат возвращается просто отлично (формат Ntriples).Может ли это быть ошибкой rdf4j?

> <http://yago-knowledge.org/resource/Naples>
> <http://yago-knowledge.org/resource/linksTo>
> <http://yago-knowledge.org/resource/S.S.C._Napoli> .
> <http://yago-knowledge.org/resource/Naples>
> <http://yago-knowledge.org/resource/linksTo>
> <http://yago-knowledge.org/resource/Treno_Alta_Velocit\u00E0> .
> <http://yago-know18:50:57.014 [main] ERROR
> o.e.r.rio.helpers.ParseErrorLogger - [Rio fatal] Expected '.', found
> '–' (386, -1) org.eclipse.rdf4j.query.QueryEvaluationException:
> Malformed query result from server    at
> org.eclipse.rdf4j.repository.sparql.query.SPARQLGraphQuery.evaluate(SPARQLGraphQuery.java:69)
>   at org.example.Connect.main(Connect.java:60) Caused by:
> org.eclipse.rdf4j.repository.RepositoryException: Malformed query
> result from server    at
> org.eclipse.rdf4j.http.client.SPARQLProtocolSession.getRDF(SPARQLProtocolSession.java:934)
>   at
> org.eclipse.rdf4j.http.client.SPARQLProtocolSession.sendGraphQuery(SPARQLProtocolSession.java:463)
>   at
> org.eclipse.rdf4j.repository.sparql.query.SPARQLGraphQuery.evaluate(SPARQLGraphQuery.java:62)
>   ... 1 more Caused by: org.eclipse.rdf4j.rio.RDFParseException:
> Expected '.', found '–' [line 386]    at
> org.eclipse.rdf4j.rio.helpers.RDFParserHelper.reportFatalError(RDFParserHelper.java:403)
>   at
> org.eclipse.rdf4j.rio.helpers.AbstractRDFParser.reportFatalError(AbstractRDFParser.java:755)
>   at
> org.eclipse.rdf4j.rio.turtle.TurtleParser.reportFatalError(TurtleParser.java:1318)
>   at
> org.eclipse.rdf4j.rio.turtle.TurtleParser.verifyCharacterOrFail(TurtleParser.java:1153)
>   at
> org.eclipse.rdf4j.rio.turtle.TurtleParser.parseStatement(TurtleParser.java:241)
>   at
> org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:201)
>   at
> org.eclipse.rdf4j.rio.turtle.TurtleParser.parse(TurtleParser.java:143)
>   at
> org.eclipse.rdf4j.http.client.SPARQLProtocolSession.getRDF(SPARQLProtocolSession.java:931)
>   ... 3 more

1 Ответ

0 голосов
/ 20 января 2019

Когда SPARQLRepository RDF4J выполняет запрос SPARQL-запроса к этой конечной точке, конечная точка отправляет обратно свой ответ в формате Turtle. К сожалению, этот ответ содержит синтаксическую ошибку. Происходит следующее:

  1. RDF4J выполняет запрос, указывая несколько приемлемых форматов результатов (включая Turtle и N-Triples);
  2. Конечная точка выполняет запрос, выбирает Turtle в качестве формата ответа и сериализует результат запроса в Turtle;
  3. RDF4J получает данные Turtle и анализирует их;
  4. проанализированный результат передается 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);

Как только вы это сделаете, остальная часть вашего кода должна работать.

...