Как ускорить выполнение запросов 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)), что сводит решение к нулю, а также дает почти мгновенные результаты.

Этот вопрос будет поднят с развитием для их анализа.

Другие вопросы по тегам