Запрос SPARQL с фильтром на определенную дату

Я новичок в SPARQL и пытаюсь сделать следующее для своего задания:

Мне нужно вытащить актеров, но только тех, кто родился в определенный день. Моя проблема в том, что каждый раз, когда я пытаюсь отфильтровать по определенному целочисленному значению, я получаю «Ошибка при выполнении запроса, см. подробности в причине» (кстати, я понятия не имею, что такое «причина» в этом вопросе, нет журнала ошибок , или что-нибудь кликабельное, чтобы я действительно мог проверить, что пошло не так).

Вот мой запрос:

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX db: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?actor ?dbpediaLink ?name ?date month(?date) WHERE {
        ?actor a movie:actor .
        ?actor owl:sameAs ?dbpediaLink .
    SERVICE <http://dbpedia.org/sparql> {
        ?dbpediaLink dbpprop:name ?name .
        ?dbpediaLink dbpprop:dateOfBirth ?date
    }
    FILTER(month(?date) = 2)
}
LIMIT 10

Итак, я пытаюсь сделать так, чтобы все актеры родились в феврале, и при этом я получаю упомянутую выше ошибку.

Следующие комбинации FILTER возвращают указанную ошибку:

FILTER(month(?date) = 2)
FILTER(month(?date) > 1 && month(?date) < 3)
FILTER(month(?date) >= 2 && month(?date) <=2)

В основном все варианты возврата только людей, родившихся в феврале, возвращают ошибку. Я даже пытался явно указать целые числа как "2"^^xsd:integer (поскольку функция month() возвращает целое число), и это все равно не удалось.

Я также пытался (из-за какой-то другой проблемы) найти актеров, у которых в имени ровно 10 букв, но я также столкнулся с той же проблемой.

Кажется, что любой FILTER, который я пытаюсь сделать, который использует = или пытается FILTER с несколькими условиями (используя &&), терпит неудачу.

Я застрял на этом последние 2 дня... Я что-то пропустил?

Вероятно, я должен упомянуть, что я использую локально развернутый сервер Fuseki с дампом LMDB и запускаю запросы по адресу http://localhost:3030


person mercin    schedule 07.02.2015    source источник


Ответы (1)


Начнем с того, что ваш запрос имеет недопустимый синтаксис, вы не можете поместить month(?date) непосредственно в предложение SELECT, так как вы должны заключить в него круглые скобки - ( и ) - и псевдоним, используя AS, например --

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX db: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?actor ?dbpediaLink ?name ?date (month(?date) AS ?month) WHERE {
        ?actor a movie:actor .
        ?actor owl:sameAs ?dbpediaLink .
    SERVICE <http://dbpedia.org/sparql> {
        ?dbpediaLink dbpprop:name ?name .
        ?dbpediaLink dbpprop:dateOfBirth ?date
    }
    FILTER(month(?date) = 2)
}
LIMIT 10

Упомянутая «причина» — это исключение, которое привело к показанному вам исключению. Если вы используете код для отправки запроса, поймайте исключение и проверьте метод getCause(), чтобы увидеть, есть ли другой объект исключения.

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

Проблема вряд ли связана с фильтром, поскольку FILTER определяется спецификацией SPARQL для обработки любых ошибок при оценке выражений как false.

Если проблема заключается не только в вашем плохом синтаксисе, то наиболее вероятным виновником является предложение SERVICE в вашем запросе, которое просит Fuseki пойти и запросить некоторую информацию из http://dbpedia.org/sparql. SERVICE определяется таким образом, что при сбое связи с удаленной службой завершается сбоем весь запрос. Так что, вероятно, вы не можете получить доступ к этой службе со своего компьютера, или есть ошибка на стороне DBPedia, вызывающая проблему (что не является чем-то неслыханным).

Можете ли вы перейти по этому URL-адресу в своем браузере? Если да, то сможете ли вы успешно выполнить часть запроса, которая появляется в предложении SERVICE, используя там веб-интерфейс?

Обратите внимание, что вы можете добавить ключевое слово SILENT после ключевого слова SERVICE, что заставит механизм запросов продолжать работу, даже если запрос на удаленную службу не будет выполнен, например. --

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX db: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT ?actor ?dbpediaLink ?name ?date month(?date) WHERE {
        ?actor a movie:actor .
        ?actor owl:sameAs ?dbpediaLink .
    SERVICE SILENT <http://dbpedia.org/sparql> {
        ?dbpediaLink dbpprop:name ?name .
        ?dbpediaLink dbpprop:dateOfBirth ?date
    }
    FILTER(month(?date) = 2)
}
LIMIT 10
person RobV    schedule 08.02.2015
comment
Большое спасибо, добавление SILENT решило мою проблему, хотя я не знаю, почему. Если запрос к dbpedia не удался, как мне получить даты, используемые в FILTER ? В результате я получил именно то, что мне было нужно, 10 актеров, которые родились в феврале. - person mercin; 08.02.2015
comment
@mercin - Ваше добавление SILENT могло показаться исправлением, но, скорее, просто совпало с каким-то другим изменением (возможно, DBpedia была перезапущена, или был исправлен сбой сети и т. Д.) ... - person TallTed; 28.08.2017