2015-02-07 2 views
0

Я новичок в 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 дня ... Я что-то упустил?

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

ответ

2

Чтобы начать с вашего запроса имеет недопустимый синтаксис в нем, вы не можете поставить 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 
+0

Большое спасибо, добавив, что 'SILENT' исправил мою проблему, хотя я не уверен, почему. Если запрос dbpedia не удался, как я получил даты, которые используются в 'FILTER'? Результат, который я получил, это то, что мне было нужно, 10 актеров, которые родились в феврале. – mercin

+0

@mercin. Возможно, ваше дополнение «SILENT» оказалось исправлением, а скорее совпало с некоторыми другими изменениями (возможно, DBpedia была перезапущена или был исправлен сетевой сбой и т. Д.) ... – TallTed