Как ускорить выполнение запросов SPARQL на Virtuoso, контролируя порядок выполнения запросов?
Я установил сервер Virtuoso для размещения данных Freebase ( версия 07.20.3217, построена 5 января 2017 года; я очень благодарен, если вы можете попробовать).
Давайте рассмотрим этот сценарий: найдите самое большое местоположение (вероятно, округ, обозначенный как ?var1
в штате Висконсин (fb:m.0824r
), где ?var1
содержит по крайней мере одно местоположение (обозначается ?var2
) с типом fb:place_with_neighborhoods
,
Я написал запрос SPARQL следующим образом:
PREFIX fb: <http://rdf.freebase.com/ns/>
SELECT DISTINCT ?var1 ?var2 ?v2_name WHERE {
fb:m.0824r fb:location.location.contains ?var1 .
?var1 fb:location.location.contains ?var2 .
?var2 fb:type.object.type fb:location.place_with_neighborhoods .
?var1 fb:location.location.area ?area .
OPTIONAL { ?var2 fb:type.object.name ?v2_name } .
} ORDER BY DESC(?area)
LIMIT 1
К сожалению, движок Virtuoso не может вернуть результат запроса более одного часа.
Я попробовал несколько более простых запросов, которые могли бы дать результаты менее чем за одну секунду:
PREFIX fb: <http://rdf.freebase.com/ns/>
SELECT DISTINCT ?var1 ?var2 ?v2_name WHERE {
fb:m.0824r fb:location.location.contains ?var1 .
?var1 fb:location.location.contains ?var2 .
?var2 fb:type.object.type fb:location.place_with_neighborhoods .
OPTIONAL { ?var2 fb:type.object.name ?v2_name } .
}
# Remove the area-related information with ?var1
# Returns ONLY ONE result in 0.05s.
а также,
PREFIX fb: <http://rdf.freebase.com/ns/>
SELECT DISTINCT ?var1 ?var2 ?v2_name ?area WHERE {
fb:m.0824r fb:location.location.contains ?var1 .
?var1 fb:location.location.contains ?var2 .
?var1 fb:location.location.area ?area .
OPTIONAL { ?var2 fb:type.object.name ?v2_name } .
}
# Remove the type limitation of ?var2
# Returns ~7000 results in ~1s.
Учитывая результаты этих более простых запросов, я действительно запутался, какой шаг вызвал проблему с производительностью. Есть кто-нибудь, кто может дать мне совет? Спасибо вам большое!
1 ответ
Как отмечено по вопросу, который вы затронули в проекте -
Кажется, есть проблема плана запроса с
OPTIONAL
когда остальная часть запроса не дает решения, так как удаление только этого предложения из исходного запроса приводит к результатам почти мгновенно.Удаление
?var1 fb:location.location.area ?area
шаблон (и, следовательно,ORDER BY DESC(?area)
), что сводит решение к нулю, а также дает почти мгновенные результаты.Этот вопрос будет поднят с развитием для их анализа.