Ответ 1
Вы правы, что ваш запрос не возвращает все компании. Однако шаблон правильный. Обратите внимание, что этот запрос, который учитывает только компании, возвращает 88054:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select (count(distinct ?company) as ?count)
where {
?company a dbpedia-owl:Company
}
Я думаю, что это ограничение, налагаемое конечной точкой DBpedia SPARQL по соображениям производительности. Одна вещь, которую вы могли бы сделать, это загрузить данные и выполнить запрос локально, но это, вероятно, немного больше работы, чем вы хотите. Вместо этого вы можете заказать результаты (на самом деле не имеет значения, как, если вы всегда это делаете одинаково) и используйте limit
и offset
для выбора в этих результатах. Например:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select ?company
where {
?company a dbpedia-owl:Company
}
order by ?company
limit 10
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select ?company
where {
?company a dbpedia-owl:Company
}
order by ?company
limit 10
offset 5823
Это общий подход. Однако он по-прежнему имеет проблемы с DBpedia из-за жесткого ограничения на 40000 результатов. Там есть документация, в которой упоминается следующее:
Работа с ограничениями DBpedia Конечная точка SPARQL MaxSortedTopRows Ограничения через LIMIT & OFFSET
Конечная точка DBpedia SPARQL настроена со следующей установкой INI:
MaxSortedTopRows = 40000
Приведенная выше установка устанавливает пороговое значение для отсортированных строк.
Предлагаемое решение этой статьи заключается в использовании подзапросов:
Чтобы предотвратить описанную выше проблему, вы можете использовать использование подзапросов, которые лучше используют временное хранилище, связанное с этим заданием. Пример примет форму:
SELECT ?p ?s WHERE { { SELECT DISTINCT ?p ?s FROM <http://dbpedia.org> WHERE { ?s ?p <http://dbpedia.org/resource/Germany> } ORDER BY ASC(?p) } } OFFSET 50000 LIMIT 1000
Я не совсем уверен, почему это решает проблему, возможно, это то, что конечная точка может сортировать более 40000 строк, если она не должна возвращать их все. Во всяком случае, он действительно работает. Ваш запрос станет следующим:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select ?company {{
select ?company {
?company a dbpedia-owl:Company
}
order by ?company
}}
offset 88000
LIMIT 1000