Не удается получить фильмы с высокими идентификаторами из LinkedMDB с помощью SPARQL
Я выполняю следующий запрос в конечной точке LinkedMDB SPARQL, и он работает. С его помощью я получаю всю необходимую информацию о режиссере фильма с идентификатором 72, который называется " Титаник", поэтому я получаю информацию о Джеймсе Кэмероне.
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
SELECT ?director?nombre_director?id_director WHERE {
?pelicula mdb:filmid ?id .
?pelicula <http://data.linkedmdb.org/resource/movie/director> ?director .
?director <http://data.linkedmdb.org/resource/movie/director_name> ?nombre_director .
?director <http://data.linkedmdb.org/resource/movie/director_directorid> ?id_director .
FILTER (?id = 72).
}
В фильмах с более высоким идентификатором, например, в примере Star Trek с идентификатором 44396, если я заменю 72 на 44396, запрос не даст результатов. Запись явно имеет каталог, идентификатор и имя. Почему не работает измененный запрос?
1 ответ
SPARQL позволяет писать 72
как сокращение для буквального "72"^^xsd:integer
, Как вы уже видели, вы можете получить фильм с удостоверением личности "72"^^xsd:integer
без проблем. Тем не менее, другой фильм, который вы ищете, имеет идентификатор "44396"^^xsd:int
(обратите внимание, что тип данных xsd:int
не xsd:integer
). Я не знаю, почему тип данных отличается, но этого достаточно, чтобы помочь нам получить то, что мы хотим:
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
SELECT ?director?nombre_director?id_director WHERE {
?pelicula mdb:filmid "44396"^^xsd:int .
?pelicula <http://data.linkedmdb.org/resource/movie/director> ?director .
?director <http://data.linkedmdb.org/resource/movie/director_name> ?nombre_director .
?director <http://data.linkedmdb.org/resource/movie/director_directorid> ?id_director .
}
director nombre_director id_director
----------------------------------------------
db:director/9025 "J.J. Abrams" 9025
Обратите внимание, что вместо filter
Я просто поместил фактическое желаемое значение в шаблон запроса. Я считаю, что это немного проще, и если механизм запросов не оптимизирован, он может работать лучше (так как он не создает большой набор результатов, а затем отфильтровывает вещи). Фактически, это может объяснить, почему семантически эквивалентный запрос, использующий переменную и фильтр, не возвращает результатов, если существует ограничение на количество результатов, которые может вернуть запрос. (Но это чисто предположение.) В любом случае следующий запрос не работает, но я думаю, что он должен:
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
SELECT ?director?nombre_director?id_director WHERE {
?pelicula mdb:filmid ?id .
?pelicula <http://data.linkedmdb.org/resource/movie/director> ?director .
?director <http://data.linkedmdb.org/resource/movie/director_name> ?nombre_director .
?director <http://data.linkedmdb.org/resource/movie/director_directorid> ?id_director .
filter ( ?id = "44396"^^xsd:int )
}