Невозможно выполнить SPARQL Select Query с использованием интерфейса REST GraphDB
У меня есть экземпляр graphDB, работающий на VPS, и я хочу получить список организаций с отношением hasUnit. Следующий запрос выполняется нормально на странице выполнения SPARQL:
PREFIX org: <http://www.w3.org/ns/org#>
SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count)
WHERE{
?s org:hasUnit ?o .
} GROUP BY ?s
но когда я пытаюсь получить результаты, используя интерфейс REST, я получаю сообщение об ошибке "MALFORMED QUERY: org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException: QName" org: hasUnit 'использует неопределенный префикс "
вот моя просьба URI:
http://23.101.230.37:7200/repositories/CSIRO?query= SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count) WHERE{
?s org:hasUnit ?o . } GROUP BY ?s
Следующий запрос выполняется нормально, хотя:
http://23.101.230.37:7200/repositories/CSIRO?query= SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count) WHERE{
?s ?p ?o . } GROUP BY ?s
1 ответ
Проблема, как указывает сообщение об ошибке, заключается в том, что префикс пространства имен org:
не определено в вашем запросе.
Обратите внимание, что в запросе, который вы пробовали в интерфейсе Workbench, это первая строка:
PREFIX org: <http://www.w3.org/ns/org#>
Но эта строка отсутствует в запросе, который вы делаете через вызов REST API. Чтобы исправить, запустите запрос SPARQL с этой строки, когда вы делаете вызов REST:
http://23.101.230.37:7200/repositories/CSIRO?query=PREFIX org: <http://www.w3.org/ns/org#> SELECT (?s AS ?Organization) (COUNT(?o) AS ?Count) WHERE{ ?s org:hasUnit ?o . } GROUP BY ?s
Отредактируйте примечание, что фактический запрос SPARQL должен быть в форме urlencoded, когда вы помещаете его в URL в качестве параметра, подобного этому - хотя некоторые клиентские инструменты могут обработать это для вас. Я оставил его незакодированным для удобства чтения.
Кстати, причина, по которой вы не получаете эту ошибку во втором запросе, заключается в том, что во втором запросе вы не используете предикат с org:
префикс.
Каждый ресурс в RDF и SPARQL идентифицируется IRI. Например, в своем запросе вы используете идентификатор свойства http://www.w3.org/ns/org#hasUnit
, Префикс пространства имен - это способ ввести сокращение, чтобы вы не каждый раз записывали полный IRI. В этом примере org:
становится сокращением для http://www.w3.org/ns/org#
таким образом, идентификатор свойства может быть записан сокращенно (как префиксное имя) как org:hasUnit
,