Невозможно выполнить запрос SPARQL Select с использованием интерфейса 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, я получаю сообщение об ошибке «НЕПРАВИЛЬНЫЙ ЗАПРОС: 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

person coderdecoder    schedule 15.01.2019    source источник
comment
вы действительно не понимаете сообщение об ошибке "QName 'org:hasUnit' uses an undefined prefix"? Я нахожу это очень ясным и полезным. Но вы далеко не первый, у кого отсутствуют объявления префиксов в запросе SPARQL. С моей точки зрения, я всегда старался добавлять все используемые префиксы, чтобы сделать SPARQL самодостаточным, чтобы вы могли запускать его в любой среде без необходимости использования заранее определенных префиксов.   -  person UninformedUser    schedule 15.01.2019


Ответы (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.

person Jeen Broekstra    schedule 15.01.2019
comment
Спасибо за ответ. Мне удалось выполнить запрос, экранировав # в PREFIX. Вот сработавший запрос 23.101.230.37:7200/repositories/CSIRO?query= ПРЕФИКС org: ‹w3.org/ns/org%23 ›ВЫБРАТЬ (? s AS? Organization) WHERE {? sa org: OrganizationalUnit.} Символ # в URL-адресе запроса вызывал ошибку. Побег решил проблему. - person coderdecoder; 15.01.2019
comment
ну, вам нужно убежать / urlencode все это действительно, не только хеш, но да - person Jeen Broekstra; 15.01.2019
comment
@coderdecoder - обратите внимание, что запрос, который вы поместили здесь в комментарий, нечитаем и может содержать пропущенные символы, потому что вы не заключили его в обратные кавычки, которые говорят интерпретатору уценки не интерпретировать то, что они переносят. Думаю, вы обнаружите, что это работает точно так же, как есть - http://23.101.230.37:7200/repositories/CSIRO?query=PREFIX%20org%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2Fns%2Forg%23%3E%20SELECT%20(%3Fs%20AS%20%3FOrganization)%20(COUNT(%3Fo)%20AS%20%3FCount)%20WHERE%7B%20%3Fs%20org%3AhasUnit%20%3Fo%20%20.%20%7D%20GROUP%20BY%20%3Fs - person TallTed; 15.01.2019
comment
Привет, @JeenBroekstra, я получил missing parameter: query при запуске curl http://localhost:7200/repositories/#repo-test-1?query=CONSTRUCT+%7B%3Fs+%3Fp+%3Fo%7D+WHERE+%7B%3Fs+%3Fp+%3Fo%7D+LIMIT+a10 в онтексте graphdb, не могли бы вы посоветовать? Я использую GraphDB-Free / 9.0.0 RDF4J / 3.0.0 - person dauruy; 08.10.2019
comment
Ответ выше этого комментария правильный и должен быть принят; Я бы просто добавил, что curl упрощает urlencode sparql-запросы и тестирование через REST: curl -s -G --header "Accept: application/sparql-results+json" --data-urlencode "query=$QUERY" http://localhost:7200/repositories/$REPOSITORY, где QUERY - это ваш простой текстовый запрос SPARQL, а REPOSITORY - это репозиторий GraphDB, в котором вы хотите, чтобы запрос выполнялся. - person troyfolger; 07.03.2020