Контекст: 14 миллионов троек, верстак Blazegraph. В настоящее время я пытаюсь разработать запросы, которые сочетают в себе SELECT и ASK. Точнее, я хочу выбрать результаты на своем графике, где предположение верно.
Для моего примера представьте, что у меня есть много книг, у которых есть один автор и один редактор. Я хочу выбрать книгу автора, книга которой связана через свойство случайной длины пути с client#1
.
В моем случае с моими данными требуется много времени, чтобы реализовать запрос прямо так:
SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.
?id_book prefix:linkedToEditor*/prefix:hasClient :client#1}
ORDER by ?id_book
Чтобы сократить время вычислений (x 1:1000), я использую скрипт для последовательной реализации этих запросов. Скрипт выбирает книги, автором которых является автор №1:
SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1}
ORDER by ?id_book
И я запрашиваю каждый результат от 1 до n (id_book#1
, id_book#2
, ..., id_book#n
), если он связан с клиентом № 1:
ASK {id_book#i prefix:linkedToEditor*/prefix:hasClient :client#1}
Запрос SELECT, за которым следует запрос ASK, намного быстрее, чем первый запрос SELECT для тех же результатов. Я не хочу исследовать все возможности ?id_book prefix:linkedToEditor*/prefix:hasClient :client#1
; Я просто хочу сохранить результаты там, где существует ссылка. Я пробовал с FILTER EXISTS или двумя запросами SELECT, но время запроса одинаково велико:
SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.}
FILTER EXIST {?id_book prefix:linkedToEditor*/prefix:hasClient :client#1}
ORDER by ?id_book
or
SELECT ?id_book
WHERE {?id_book prefix:linkedToEditor*/prefix:hasClient :client#1.
{SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.}
}
}
Как я могу оптимизировать свои запросы в один запрос?