Вы пытаетесь использовать префиксные имена в своем запросе, и в сообщении об ошибке указывается
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
для встроенных данных