2017-01-13 2 views
1

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

Код:

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

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

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

Любые предложения?

ответ

1

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

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

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

+1

Да, с 2.2 он работает сейчас. Благодаря! – ChristophE

4

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

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

Пожалуйста, обратитесь к документации здесь: https://docs.marklogic.com/REST/GET/v1/graphs/sparql

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

+0

Проблема зарегистрирована как ошибка в RDF4J: https://github.com/eclipse/rdf4j/issues/721. Возможно, MarkLogic может быть немного более мягким и просто игнорировать параметр, хотя :) –

+1

Является ли базовый ответ приемлемым и полным для сферы действия вопроса? Если это так, отметьте его так, чтобы мы сохраняли очистку стека. Его опасно для любой системы игнорировать неизвестные параметры, которые, по мнению вызывающего, необходимы. Для меня больше смысла, что соединительная система будет придерживаться API, как описано. Вместо того, чтобы игнорировать параметры, MarkLogic может считать queryLn «необязательным» параметром, где есть только одно допустимое значение (SPARQL). Это совсем не то, что позволяет клиенту подключаться к API и думать, что он отправляет полезные параметры, которые просто игнорируются. –

+0

'queryLn' - это параметр, специфичный для собственного REST API RDF4J. Дело не в том, что клиент ошибочно полагает, что это то, что API-интерфейс MarkLogic поймет, это просто некоторая избыточная информация, которая входит в состав серверов RDF4J, но не имеет смысла в стандартном протоколе SPARQL. Запись предупреждения является разумной, но нет причин полностью отказаться от запроса: сервер получает достаточную информацию для выполнения запроса (и насколько я знаю, в протоколе SPARQL нет требований, которые _only_ отправляются документированные параметры). –

Смежные вопросы