Ошибка запятой при поиске на SPARQL, DBpedia - PullRequest
0 голосов
/ 23 января 2019

При выполнении запроса, выдающего ошибку, синтаксическая ошибка в «,» перед «_New_South_Wales».

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}}
  }

полный отчет об ошибках выглядит следующим образом.

Virtuoso 37000 Ошибка SP030: компилятор SPARQL, строка 21: синтаксическая ошибка в «,» перед «_New_South_Wales» SPARQL-запрос: #выходной формат: application / sparql-results + json определить входные данные: default-graph-uri PREFIX owl: PREFIX xsd: PREFIX rdfs: PREFIX rdf: PREFIX foaf: PREFIX dc: PREFIX: PREFIX dbpedia2: PREFIX dbpedia: PREF skif: PREF sk: PREFIX dbp: PREFIX dbr: PREFIX grs: PREFIX geo: SELECT? Label? Country? IsPartOf? _Type? Capital? Lcity? Геопункт WHERE {{dbr: Eraring, _New_South_Wales rdfs: label? Label.ФИЛЬТР (LANGMATCHES (LANG (? Label), "en"))} UNION {ДОПОЛНИТЕЛЬНО {dbr: Eraring, _New_South_Wales dbo: страна? Страна}} UNION {ДОПОЛНИТЕЛЬНО {dbr: Eraring, _New_South_Wales dbo: isPartOf? IsPartOf} UNIONДОПОЛНИТЕЛЬНО {dbr: Eraring, _New_South_Wales? _Type}} UNION {ДОПОЛНИТЕЛЬНО {dbr: Eraring, _New_South_Wales dbo: capital? Capital}} UNION {ДОПОЛНИТЕЛЬНО {dbr: Eraring, _New_South_Wales dbo: mostCity? Lcity}} UNION {ERA, _New_South_Wales grs: point? Геопункт}}}

вот ссылка, по которой вы можете проверить этот запрос самостоятельно. snorql

1 Ответ

0 голосов
/ 25 января 2019

Вы пытаетесь использовать префиксные имена в своем запросе, и в сообщении об ошибке указывается

dbr:Eraring,_New_South_Wales

в качестве источника ошибки, в частности запятая приводит к сбою синтаксического анализатора.

Итакдавайте посмотрим на рекомендацию W3C:

4.1.1.1 Имена с префиксами

Ключевое слово PREFIX связывает метку префикса с IRI.Префиксное имя представляет собой метку префикса и локальную часть, разделенные двоеточием ":".Префиксное имя сопоставляется с IRI путем объединения IRI, связанного с префиксом и локальной частью.Метка префикса или локальная часть могут быть пустыми.Обратите внимание, что локальные имена SPARQL допускают начальные цифры, а локальные имена XML - нет.Локальные имена SPARQL также допускают не алфавитно-цифровые символы, разрешенные в IRI через символ обратной косой черты (например, ns: id \ = 123).Локальные имена SPARQL имеют больше синтаксических ограничений, чем CURIE.

Учитывая, что ошибка возникает в локальном имени, а запятая является не алфавитно-цифровым символом, наиболее важной частью здесь является

Локальные имена SPARQL также допускают не алфавитно-цифровые символы, разрешенные в IRI через символ обратной косой черты (например, ns: id \ = 123).

Это означает, что мы можем использоватьзапятая, но должна выходить из нее через \, т.е. мы должны написать

dbr:Eraring\,_New_South_Wales

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

SELECT * { dbr:Eraring\,_New_South_Wales ?p ?o }

завершается неудачно с

Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '\' (0x5c) in SPARQL expression at '\'

Опция, которая всегда работает, - это просто использовать полный IRI.

Запрос, который работает наКонечная точка DBpedia равна

PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
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 {
 VALUES ?s {<http://dbpedia.org/resource/Eraring,_New_South_Wales>} 
 ?s rdfs:label ?label . 
 FILTER(LANGMATCHES(LANG(?label), "en")) 
 OPTIONAL{?s dbo:country ?country} 
 OPTIONAL{?s dbo:isPartOf ?isPartOf} 
 OPTIONAL{?s <http://purl.org/linguistics/gold/hypernym> ?_type} 
 OPTIONAL{?s dbo:capital ?capital} 
 OPTIONAL{?s dbo:largestCity ?lcity} 
 OPTIONAL{?s grs:point ?geopoint} 
}

. Вы можете видеть, что я немного изменил запрос:

  • , нет необходимости в предложениях UNION - все, что вам нужно, это получить опциональныйданные, если существуют, поэтому OPTIONAL является правильным SPARФункция QL
  • Я использовал ключевое слово VALUES для встроенных данных
...