我有一个相当复杂的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语法结构?
请注意,我用的Virtuoso开源版,内置在Ubuntu,版本:07.20.3214,构建:10月14日2015年
问候, 潘泰利斯Natsiavas