Сложный запрос SPARQL - виртуозные подсказки производительности?
У меня довольно сложный SPARQL-запрос, который выполняется тысячи раз в параллельных потоках (400 потоков). Здесь запрос несколько упрощен (пространства имен, свойства и переменные уменьшены) для удобства чтения, но сложность осталась без изменений (объединения, число графиков и т. Д.). Запрос выполняется для 4 графиков, самый большой из которых содержит 5561181 тройки.
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 Open source edition, построенную на Ubuntu, Версия: 07.20.3214, Сборка: 14 октября 2015.
С уважением, Пантелис Нациавас