复杂SPARQL查询-Virtuoso性能提示?
我有一个相当复杂的SPARQL查询,它在并行线程(400个线程)中执行数千次。为了可读性,这里的查询稍微简化了(名称空间、属性和变量都减少了),但复杂性没有改变(联合、图的数量等)。该查询针对4个图形运行,其中最大的包含5561181个三元组复杂SPARQL查询-Virtuoso性能提示?,sparql,virtuoso,Sparql,Virtuoso,我有一个相当复杂的SPARQL查询,它在并行线程(400个线程)中执行数千次。为了可读性,这里的查询稍微简化了(名称空间、属性和变量都减少了),但复杂性没有改变(联合、图的数量等)。该查询针对4个图形运行,其中最大的包含5561181个三元组 PREFIX graphA: <GraphABaseURI:> ASK FROM NAMED <GraphBURI> FROM NAMED <GraphCURI> FROM NAMED <GraphABaseUR
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")) .
}
前缀图形:
问
从命名
从命名
从命名
从命名
在哪里{
{
图表{
?变量a图形:a类。
?可变图形:不动产A?可变图形B。
?可变数据项:标题?可变数据项。
可变图形:属性b可变。
可变的,可变的。
可变的
}
.
图表{
?变量f/?变量g。
?变量F?变量H
}
.
图表{
变量i?变量j。
可变的,可变的。
过滤器(isLiteral(?variableK)和REGEX(?variableK,“literalA”,“i”))
}
.
过滤器(isLiteral(?variableJ)和&?variableG=?variableJ)。
过滤器(?variableE=?variableH)
}
联合
{
图表{
?变量a图形:a类。
?可变图形:不动产A?可变图形B。
?可变数据项:标题?可变数据项。
可变图形:属性b可变。
可变的,可变的。
可变的,可变的。
}
.
图表{
?variableM?variableN。
?变量?变量。
过滤器(isLiteral(?variableO)和REGEX(?variableO,“literalA”,“i”))
}
.
过滤器(?variableE=?variableN)。
}
联合
{
图表{
?变量a图形:a类。
?可变图形:不动产A?可变图形B。
?可变数据项:标题?可变数据项。
可变图形:属性b可变。
可变的,可变的。
可变的,可变的。
}
.
图表{
?variableM?variableN。
?变量?变量。
过滤器(isLiteral(?variableO)和REGEX(?variableO,“literalA”,“i”))
}
.
过滤器(?variableE=?variableN)。
}
.FILTER(isLiteral(?variableC)和REGEX(?variableC,“literalB”,“i”))。
}
我不希望有人改变上述查询(当然…)。我发布这个查询只是为了演示复杂性和使用的所有SPARQL结构
我的问题是:
STR()
cast并使用isLiteral()
函数改进了性能。你能提出别的建议吗- ,下面的RDF Performance Tuning文档部分提供了两个备选和/或附加索引,这些索引可能对您的查询和数据有意义。正如您所说,您的一些模式将定义图形和对象,以及未定义的主语和谓语,一些其他索引也可能有意义(例如,
,GOPS
),这取决于一些其他因素GOSP
- 根据原始加载后数据的变化程度,使用此SQL命令(可以通过任何SQL接口(iSQL、ODBC、JDBC等)重建自由文本索引可能是值得的-
- 例如,可以产生比
过滤器更好的性能-regex()
-与-FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) .
?variableO bif:contains "'literalA'" . FILTER ( isLiteral(?variableO) ) .
- 有助于查询优化工作。这些输出的大部分用于开发分析,因此对您来说可能意义不大,但将其提供给开发人员仍然可以产生有用的建议
- 出于多种原因,
谓词(由于SPARQL/Turtle语义糖,通常表示为rdf:type
)可能是性能杀手。从图形模式中删除这些谓词可能会大大提高性能。如果需要,还有其他方法可以限制解决方案集(例如,通过测试仅由您所需的a
实体拥有的属性),这些方法不会对性能产生负面影响rdf:type
?variableO bif:contains "'literalA'" .
FILTER ( isLiteral(?variableO) ) .