Запрос Marklogic с RDF4J SPARQLRepository

Я пытаюсь запросить сервер marklogic (версия 8) через их конечную точку sparql и sparqlrepository из rdf4j (2.1.4), но конечная точка marklogic, похоже, не принимает эти запросы sparql.

Пример кода:

String sparqlEndpoint = "http://url/v1/graphs/sparql";
SPARQLRepository repo = new SPARQLRepository(sparqlEndpoint);
repo.initialize();
repo.getConnection().hasStatement(null, null, null, false);

Это приводит к следующей ошибке:

«errorResponse»: {«statusCode»: 400, «status»: «Bad Request», «messageCode»: «REST-UNSUPPORTEDPARAM», «message»: «REST-UNSUPPORTEDPARAM: (err: FOER0000) Конечная точка не поддерживает параметр запроса : недопустимые параметры: queryLn, вывод для запроса "}}

Какие-либо предложения?


person ChristophE    schedule 13.01.2017    source источник


Ответы (2)


Как объясняется в ответе Дэвида Энниса, проблема в том, что клиент конечной точки RDF4J SPARQL отправляет несколько параметров в своих запросах, которые не являются частью W3C Протокол SPARQL 1.1; они являются частью RDF4J REST API (расширение протокола SPARQL).

В то время как большинство реализаций конечных точек SPARQL просто игнорируют параметры, которые не являются частью стандарта (или регистрируют предупреждение), MarkLogic реализует более строгую политику и категорически отказывается отвечать на такие запросы.

Решение в вашем случае - перейти на RDF4J 2.2. Улучшение # 721, которое касается отправки в Конечные точки SPARQL, не относящиеся к RDF4J, были реализованы в этом новом выпуске, и (при условии, что MarkLogic в остальном соответствует стандартам) это должно решить проблему связи с вашей конечной точкой MarkLogic.

person Jeen Broekstra    schedule 04.02.2017

MarkLogic не принимает параметр queryLn (язык запросов).

Языками являются SARQL и StructuredQueries, и для передачи этих двух языков используются разные параметры.

См. Документацию здесь: https://docs.marklogic.com/REST/GET/v1/graphs/sparql

Я предлагаю вам найти способ подавить параметр queryLn в коде, выполняющем вызов ..

person David Ennis    schedule 13.01.2017
comment
Проблема, зарегистрированная как ошибка в RDF4J: github.com/eclipse/rdf4j/issues/721. Возможно, MarkLogic мог бы быть более снисходительным и просто проигнорировать параметр :) - person Jeen Broekstra; 14.01.2017
comment
Является ли базовый ответ приемлемым и полным для объема вопроса? Если да, отметьте это как так, чтобы мы держали Stack Overflow в чистоте. Для любой системы опасно игнорировать неизвестные параметры, которые вызывающий считает необходимыми. Для меня более логично, что соединительная система будет придерживаться API, как описано в документации. Вместо того, чтобы игнорировать параметры, MarkLogic может рассматривать queryLn как необязательный параметр, в котором есть только одно допустимое значение (SPARQL). Это совершенно отличается от разрешения клиенту подключаться к API и думать, что он отправляет полезные параметры, которые просто игнорируются. - person David Ennis; 14.01.2017
comment
queryLn - это параметр, специфичный для собственного REST API RDF4J. Дело не в том, что клиент ошибочно думает, что это то, что поймет API MarkLogic, это просто некоторая избыточная информация, которая включается для серверов на основе RDF4J, но не имеет значения в стандартном протоколе SPARQL. Регистрация предупреждения является разумной, но нет причин полностью отказывать в запросе: сервер получает достаточно информации для выполнения запроса (и, насколько я знаю, в протоколе SPARQL нет требования, чтобы только задокументированные параметры посланы). - person Jeen Broekstra; 15.01.2017