У меня довольно сложный запрос SPARQL, который выполняется тысячи раз в параллельных потоках (400 потоков). Запрос здесь несколько упрощен (пространства имен, свойства и переменные были уменьшены) для удобства чтения, но сложность остается нетронутой (союзы, количество графиков и т. Д.). Запрос выполняется против 4 графиков, самый большой из которых содержит 5 561 181 троек.Комплексный запрос SPARQL - подсказки о производительности Virtuoso?
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.
Мои вопросы:
- бы я приобретаю в отношении производительности, если у меня были все мои троек в одном графике? Таким образом, я бы избегал союзов и упрощал мой запрос, однако, это также принесет пользу с точки зрения производительности?
- Есть ли какие-либо индексы, которые я мог бы построить, и они могли бы помочь с вышеуказанным запросом? Я не уверен в индексировании данных, однако, прочитав в the RDF Index Scheme section of RDF Performance Tuning, мне интересно, подходит ли схема индексации Virtuoso 7 по умолчанию для запросов, подобных приведенным выше. Хотя предикаты определены в тройных шаблонах SPARQL предыдущего запроса, существует много тройных шаблонов, которые не определили субъект или предикат. Может ли это быть серьезной проблемой в отношении производительности?
- Возможно, есть структура синтаксиса SPARQL, о которой я не знаю и могу помочь в вышеупомянутом запросе. Не могли бы вы что-нибудь предложить? Например, я уже улучшил производительность, удалив
STR()
отливки и используя функциюisLiteral()
. Не могли бы вы предложить что-нибудь еще? - Возможно, вы могли бы предложить использовать сложную структуру синтаксиса SPARQL?
Пожалуйста, обратите внимание, что я использую Виртуоз открытым исходным кодом, построенной на Ubuntu, версия: 07.20.3214, Build: 14 окт 2015.
С уважением, Pantelis Natsiavas