Как решить пределы выполнения в Linkedmdb
Я пытался извлечь все фильмы из Linkedmdb. Я использовал OFFSET, чтобы убедиться, что я не достигу максимального количества результатов на запрос. Я использовал следующий скрипт в Python
"""
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
SELECT distinct ?film
WHERE {
?film a movie:film .
} LIMIT 1000 OFFSET %s """ %i
Я зациклился 5 раз со смещением 0,1000,2000,3000,4000 и записал количество результатов. Было (1000,1000,500,0,0). Я уже знал, что предел был 2500, но я думал, что с помощью OFFSET, мы можем с этим сойти. Разве это не правда? Нет способа получить все данные (даже если мы используем какой-то цикл)?
1 ответ
Ваш текущий запрос является допустимым, но нет определенного порядка, поэтому смещение не приведет вас к предсказуемому месту в результатах. (Ленивая реализация может просто возвращать одни и те же результаты снова и снова.) Когда вы используете limit и offset, вам также нужно использовать order by. Спецификация SPARQL 1.1 гласит (выделено):
15.4 СМЕЩЕНИЕ
OFFSET вызывает запуск сгенерированных решений после указанного количества решений. Смещение нуля не имеет никакого эффекта.
Использование LIMIT и OFFSET для выбора разных подмножеств решений запросов не будет полезным, если порядок не будет предсказуемым с помощью ORDER BY.