Как экранировать специальные символы в именах с префиксом SPARQL? - PullRequest
1 голос
/ 25 марта 2019

Я делаю запросы в DBPedia с использованием SPARQL и Python.

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

Я пыталсячтобы убрать его с помощью обратной косой черты (как в коде ниже), но он не работает.

Я прочитал, что могу указать весь URI, но он тоже не работает (но, возможно, я сделал это неправильно).

Кто-нибудь имеет другой вариант или может привести пример того, как я могу написать свой запрос со всем URI, учитывая запрос, который у меня уже есть?

query = """
    PREFIX : <http://dbpedia.org/resource/>
    SELECT DISTINCT ?s ?p ?o WHERE {
       {
           ?s ?p ?o
           FILTER (?s=:Grimaldi_\(crater\))

       }
    }
    """

Вот ошибка Iполучить:

QueryBadFormed: QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed.

Response: b"Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '\\' (0x5c) in SPARQL expression at '\\'\n\nSPARQL query:\n\n#output-format:application/sparql-results+json\n\n PREFIX : <http://dbpedia.org/resource/>\nSELECT DISTINCT ?s ?p ?o WHERE {\n {\n ?s ?p ?o\n FILTER (?s=:Grimaldi_\\(crater\\))\n\n }\n}\n"

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Полный URI определенно работает , так как -

SELECT DISTINCT ?s ?p ?o WHERE {
   {
       ?s ?p ?o
       FILTER ( ?s = <http://dbpedia.org/resource/Grimaldi_(crater)> )
   }
}

В Virtuoso v7 есть открытая ошибка обработки префиксных имен с экранированием обратной косой черты (например, ваш *).1007 * с PREFIX : <http://dbpedia.org/resource/>, или более распространенный dbr:Grimaldi_\(crater\) с PREFIX dbr: <http://dbpedia.org/resource/>).Пожалуйста, добавьте свой голос к выпуску github , чтобы помочь повысить его приоритет.

Экранирование с обратной косой чертой в именах с префиксами теперь работает так же, как и в Virtuoso 7 (07.20.3230,с commit 5f68a2e2f2, 2019-04-01 ), который поддерживает экземпляр DBpedia.

1 голос
/ 02 апреля 2019

Мы исправили эту проблему (которая была характерна только для версии 7.x, а не для самой последней версии 8.x) и применили ее к экземплярам Virtuoso за экземплярами DBpedia-Snapshot и DBpedia-Live.

Запрос:

PREFIX : <http://dbpedia.org/resource/>
SELECT DISTINCT ?s ?p ?o WHERE {
       {
           ?s ?p ?o
           FILTER (?s=:Grimaldi_\(crater\))

       }
    }

Live DBpedia-Snapshot SPARQL Определение запроса: Ссылка

Live DBpedia-Live SPARQL Определение запроса: Ссылка

Еще один пример, основанный на запятой (,) в URL.Обратите внимание, что исходный запрос был изменен для добавления обратной косой черты (\), чтобы он работал.

Запрос:

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX grs: <http://www.georss.org/georss/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT ?label ?country ?isPartOf ?_type ?capital ?lcity ?geopoint
WHERE {
        { dbr:Eraring\,_New_South_Wales rdfs:label ?label  .  FILTER(LANGMATCHES(LANG(?label), "en"))}
          UNION{OPTIONAL{dbr:Eraring\,_New_South_Wales dbo:country ?country} }
          UNION{OPTIONAL{dbr:Eraring\,_New_South_Wales dbo:isPartOf ?isPartOf}}
          UNION{OPTIONAL{dbr:Eraring\,_New_South_Wales <http://purl.org/linguistics/gold/hypernym> ?_type}}
          UNION{OPTIONAL{dbr:Eraring\,_New_South_Wales dbo:capital ?capital}}
          UNION{OPTIONAL{dbr:Eraring\,_New_South_Wales dbo:largestCity ?lcity}}
          UNION{OPTIONAL{dbr:Eraring\,_New_South_Wales grs:point ?geopoint}}
  }

LiveОпределение запроса SPARQL: Ссылка

...