2017-02-10 15 views
1

Я пытаюсь получить ВСЕ названия фильмов с их псевдонимами. Я использую запросы, как они (с увеличением OFFSET) и на первый, кажется, работает:Проблемы с получением всех названий фильмов из Wikidata с использованием SPARQL

SELECT ?itemLabel ?itemAltLabel WHERE { 
    ?item wdt:P31 wd:Q11424. 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } 
} 
LIMIT 1000 
OFFSET 0 

В то время как он получает много действительных названий фильмов, некоторые из них не хватает, хотя я могу найти их на сайте викиданные , Я не могу управлять, чтобы сделать некоторые изменения в запросе (я новичок в SPARQL):

  • Для отладки, я хочу, чтобы фильтровать itemLabel, что-то вроде . ?itemLabel = 'fight club'. Я пробовал разные варианты, но никто не работал. Можете ли вы помочь мне построить такой запрос?
  • Я хочу исключить фильмы, у которых нет itemLabel. В настоящее время они возвращают свой ID как itemLabel, например. "Q12345". Как добавить что-то вроде . ?itemLabel != ""? Или это должно быть . ?itemLabel NOT LIKE 'Q[0-9]+' как-то?
  • Сортировка: Интересно, могут ли отсутствующие заголовки из-за не добавления какого-либо заказа. Я просто запускаю запросы с LIMIT 1000 и увеличиваю OFFSET с 1000 до тех пор, пока результатов не будет. Может ли изменение сортировки между запросами? Если да, я должен добавить ORDER BY ?refName?

Я могу сделать некоторые глупые синтаксические ошибки, поэтому, пожалуйста, предоставьте полные рабочие запросы, если сможете. Если есть что-то еще, что, по вашему мнению, может помешать мне получить ВСЕ доступные названия, дайте мне знать.

Я бег запросов здесь: https://query.wikidata.org/

+2

Не используйте метки для отладки, если вы знаете экземпляр. Используйте 'FILTER (? Item = wd: Q190050)' - и он работает. Как вы уже узнали, без 'ORDER BY' нет гарантии, что вы получите все результаты, используя разбивку на страницы с помощью' LIMIT n OFFSET n' – AKSW

+0

@AKSW благодарит за ваш комментарий. Если я пытаюсь «OREDER BY» '? Item' или'? ItemLabel', чаще всего это время истекает. Есть ли какая-нибудь другая область, которую я мог бы использовать, так что это не время? В MySQL я бы использовал индексированное поле. –

+1

Нет, обычно тройные магазины имеют индексы для предметов, предикатов (p) и объекта (o), нередко в нескольких перестановках. В вашем случае будет использоваться 'pos'. Тем не менее, 'ORDER BY' стоит дорого, и на самом деле нет обходного пути. Обратите внимание, что это общий ресурс, поэтому производительность может быть ограничена. Кстати, каков ваш прецедент? Возможно, вы могли бы загрузить данные в свой собственный местный магазин. – AKSW

ответ

3

Я столкнулся с этой проблемой раньше, и в частности, при работе с фильмами :) Я думаю, что это происходит, что некоторые объекты являются экземплярами подкатегорий пленки. Вы хотите использовать следующее:

?item wdt:P31/wdt:P279* wd:Q11424 .

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

Надеюсь, что это поможет!