gpt4 book ai didi

sparql - 复杂的 SPARQL 查询 - Virtuoso 性能提示?

转载 作者:行者123 更新时间:2023-12-04 06:28:57 26 4
gpt4 key购买 nike

我有一个相当复杂的 SPARQL 查询,它在并行线程(400 个线程)中执行了数千次。为了可读性,查询在这里有所简化( namespace 、属性和变量已减少),但复杂性保持不变(联合、图形数量等)。该查询针对 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 结构。

我的问题:

  1. 如果我将所有三元组都放在一张图中,我的性能会有所提高吗?这样我就可以避免并集并简化我的查询,但是,这是否也会提高性能?
  2. 有没有我可以建立的索引,它们对上述查询有帮助吗?我对数据索引不是很有信心,但是阅读 the RDF Index Scheme section of RDF Performance Tuning ,不知道Virtuoso 7默认的索引方案是否适合像上面这样的查询。虽然在上述查询的 SPARQL 三元组模式中定义了谓词,但还有许多三元组模式没有定义主题或谓词。这可能是性能方面的主要问题吗?
  3. 也许有一种我不知道的 SPARQL 语法结构可能对上述查询有很大帮助。你能建议点什么吗?例如,我已经通过删除 STR() 转换和使用 isLiteral() 函数提高了性能。您能提出其他建议吗?
  4. 或许您可以建议过度使用复杂的 SPARQL 语法结构?

请注意,我使用的是基于 Ubuntu 构建的 Virtuoso 开源版,版本:07.20.3214,构建时间:2015 年 10 月 14 日。

问候,Pantelis Natsiavas

最佳答案

首先——您的 Virtuoso 版本早已过时;更新到 7.20.3217 as of April 2016 (或更高版本)强烈推荐。

在查看简化查询时,优化建议自然是有限的。但这里有几个想法,排名不分先后......

  • Index Scheme SelectionRDF Index Scheme 之后的 RDF 性能调整文档部分, 提供了一些可能对您的查询和数据有意义的替代和/或附加索引。正如您所说,您的某些模式将定义图形和对象,以及未定义的主题和谓词,其他一些索引可能也有意义(例如,GOPS GOSP),取决于其他一些因素。

  • 根据原始加载后数据的变化量,可能值得使用此 SQL 命令(可以通过任何 SQL 接口(interface)发出 -- iSQL、ODBC、JDBC、等等)——

    VT_INC_INDEX_DB_DBA_RDF_OBJ ()
  • Using the bif:contains predicate可以产生比 regex() 过滤器更好的性能,例如替换 —

    FILTER (isLiteral(?variableO) && REGEX(?variableO, "literalA", "i")) .

    — 与 —

    ?variableO bif:contains "'literalA'" .
    FILTER ( isLiteral(?variableO) ) .
  • Explain() and profile()有助于查询优化工作。此输出的大部分内容供开发人员分析,因此对您来说可能意义不大,但将其提供给 other Virtuoso users仍然可以产生有用的建议。

  • 由于多种原因,rdf:type 谓词(通常表示为 a,感谢 SPARQL/Turtle 语义糖)可能成为性能 killer .从图形模式中删除这些谓词可能会显着提高性能。如果需要,还有其他方法来限制解决方案集(例如通过测试仅由您所需的 rdf:type 实体拥有的属性),这些方法不会产生此类负面性能影响。

(ObDisclaimer:OpenLink Software 产生了 Virtuoso,并雇用了我。)

关于sparql - 复杂的 SPARQL 查询 - Virtuoso 性能提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com