У меня довольно сложный запрос SPARQL, который выполняется тысячи раз в параллельных потоках (400 потоков). Запрос здесь несколько упрощен (пространства имен, свойства и переменные были сокращены) для удобства чтения, но сложность остается неизменной (объединения, количество графов и т. Д.). Запрос выполняется для 4 графиков, самый большой из которых содержит 5 561 181 тройку.
PREFIX graphA: <GraphABaseURI:>
ASK
FROM NAMED <GraphBURI>
FROM NAMED <GraphCURI>
FROM NAMED <GraphABaseURI>
FROM NAMED <GraphDBaseURI>
WHERE{
{
GRAPH <GraphABaseURI>{
?variableA a graphA:ClassA .
?variableA graphA:propertyA ?variableB .
?variableB dcterms:title ?variableC .
?variableA graphA:propertyB ?variableD .
?variableL<GraphABaseURI:propertyB> ?variableD .
?variableD <propertyBURI> ?variableE
}
.
GRAPH <GraphBURI>{
?variableF <propertyCURI>/<propertyDURI> ?variableG .
?variableF <propertyEURI> ?variableH
}
.
GRAPH <GraphCURI>{
?variableI <http://www.w3.org/2004/02/skos/core#notation> ?variableJ .
?variableI <http://www.w3.org/2004/02/skos/core#prefLabel> ?variableK .
FILTER (isLiteral(?variableK) && REGEX(?variableK, "literalA", "i"))
}
.
FILTER (isLiteral(?variableJ) && ?variableG = ?variableJ) .
FILTER (?variableE = ?variableH)
}
UNION
{
GRAPH <GraphABaseURI>{
?variableA a graphA:ClassA .
?variableA graphA:propertyA ?variableB .
?variableB dcterms:title ?variableC .
?variableA graphA:propertyB ?variableD .
?variableL<propertyBURI> ?variableE .
?variableL <propertyFURI> ?variableD .
}
.
GRAPH <GraphDBaseURI>{
?variableM <propertyGURI> ?variableN .
?variableM <propertyHURI> ?variableO .
FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i"))
}
.
FILTER (?variableE = ?variableN) .
}
UNION
{
GRAPH <GraphABaseURI>{
?variableA a graphA:ClassA .
?variableA graphA:propertyA ?variableB .
?variableB dcterms:title ?variableC .
?variableA graphA:propertyB ?variableD .
?variableL<propertyBURI> ?variableE .
?variableL <propertyIURI> ?variableD .
}
.
GRAPH <GraphDBaseURI>{
?variableM <propertyGURI> ?variableN .
?variableM <propertyHURI> ?variableO .
FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i"))
}
.
FILTER (?variableE = ?variableN) .
}
. FILTER (isLiteral(?variableC) && REGEX(?variableC, "literalB", "i")) .
}
Я не ожидал, что кто-то изменит вышеуказанный запрос (конечно ...). Я отправляю запрос только для того, чтобы продемонстрировать сложность и все используемые структуры SPARQL.
Мои вопросы:
- Получил бы я выигрыш в производительности, если бы все мои тройки были на одном графике? Таким образом, я бы избежал объединений и упростил свой запрос, однако принесет ли это пользу с точки зрения производительности?
- Существуют ли какие-либо индексы, которые я мог бы создать, и они могли бы помочь с вышеуказанным запросом? Я не совсем уверен в индексации данных, однако читаю в в разделе «Схема индексации RDF» раздела «Настройка производительности RDF», мне интересно, подходит ли схема индексирования по умолчанию Virtuoso 7 для запросов, подобных приведенному выше. Хотя предикаты определены в шаблонах троек SPARQL в приведенном выше запросе, существует множество шаблонов троек, в которых не определены субъект или предикат. Может ли это быть серьезной проблемой с производительностью?
- Возможно, есть структура синтаксиса SPARQL, о которой я не знаю и которая могла бы очень помочь в приведенном выше запросе. Не могли бы вы что-нибудь предложить? Например, я уже улучшил производительность, удалив
STR()
приведений и используя функциюisLiteral()
. Не могли бы вы предложить что-нибудь еще? - Возможно, вы могли бы предложить чрезмерное использование сложной синтаксической структуры SPARQL?
Обратите внимание, что я использую версию Virtuoso с открытым исходным кодом, построенную на Ubuntu, версия: 07.20.3214, сборка: 14 октября 2015 г.
С уважением, Пантелис Нациавас