SPARQL-запрос - почему выборка отдельных предикатов такая медленная?
Когда я изучал некоторые запросы SPARQL, я заметил, что выборка отдельных предикатов чрезвычайно медленная, но при получении объектов или объектов таких проблем не возникает.
Я проверил его с использованием связанных с ним данных и выполнил следующие запросы в конечной точке связанных с ними данных (команда SERVICE в данном случае не использовалась по понятным причинам), на площадке SPARQL и на сервере Apache Jena Fuseki. Поведение было таким же. Может ли кто-нибудь помочь мне понять причину этого?
#selecting distinct subjects. Executes fast
SELECT * WHERE {
SERVICE <http://linkedgeodata.org/sparql> {
select distinct ?s
where{
?s ?p ?o .
} limit 100
}
}
#selecting distinct predicates. VERY SLOW
SELECT * WHERE {
SERVICE <http://linkedgeodata.org/sparql> {
select distinct ?p
where{
?s ?p ?o .
} limit 100
}
}
1 ответ
Ответил в комментариях @AKSW; перефразируя немного здесь -
Обычно схема набора данных содержит намного меньше троек, чем содержит данные экземпляра; то есть есть некоторые свойства и классы, но гораздо больше троек, которые используют каждый из этих классов и свойств.
Ваш запрос должен перебирать тройки в наборе данных до тех пор, пока не будет найдено достаточно предикатов (т.е. до LIMIT
достигнуто). Это может даже привести к сканированию всего набора данных, если существует меньше предикатов, чем ваш LIMIT
(здесь меньше 100).
LinkedGeoData имеет довольно небольшое количество свойств (~1805; см. Текст запроса и живой результат [занимает около 3 минут]) и довольно большое количество троек (~1 384 887 592; см. Текст запроса и живой результат [занимает около 1 минуты]), Таким образом, ваш второй запрос будет намного медленнее.
Индекс предиката, безусловно, ускорит этот запрос; он просто не является индексом по умолчанию в базах данных Virtuoso, потому что он не принесет большой пользы в большинстве распространенных сценариев (что не является этим запросом). Мы обсуждаем нашу схему индексации "3+2" по умолчанию и как добавить некоторые дополнительные, иногда полезные индексы, в документации.