Не удается получить фильмы с высокими идентификаторами из 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 .
}

Результаты SPARQL (один)

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

Результаты SPARQL (нет)

Другие вопросы по тегам