gpt4 book ai didi

java - Jena ARQ/TDB 查询优化

转载 作者:行者123 更新时间:2023-11-29 05:38:43 25 4
gpt4 key购买 nike

我有一个相当小的图,其中包含大约 50 万个三元组。我还生成了 stats.opt 文件并在相当快的计算机(四核、16gb ram、ssd 驱动器)上运行我的代码。但是对于我在 OP 界面的帮助下构建的查询,它需要永远遍历结果集。结果集大约有 15000 行,迭代需要 4s,这对于最终用户来说是无法接受的。执行查询仅需 90 毫秒(我想真正的工作是由游标迭代完成的?)。为什么这么慢?我可以做些什么来加快结果集迭代?

这里是查询:

SELECT  ?apartment ?price ?hasBalcony ?lat ?long ?label ?hasImage ?park ?supermarket ?rooms ?area ?street
WHERE
{ ?apartment dssd:hasBalcony ?hasBalcony .
?apartment wgs84:lat ?lat .
?apartment wgs84:long ?long .
?apartment rdfs:label ?label .
?apartment dssd:hasImage ?hasImage .
?apartment dssd:hasNearby ?hasNearbyPark .
?hasNearbyPark dssd:hasNearbyPark ?park .
?apartment dssd:hasNearby ?hasNearbySupermarket .
?hasNearbySupermarket dssd:hasNearbySupermarket ?supermarket .
?apartment dssd:price ?price .
?apartment dssd:rooms ?rooms .
?apartment dssd:area ?area .
?apartment vcard:hasAddress ?address .
?address vcard:streetAddress ?street
FILTER ( ?hasBalcony = true )
FILTER ( ?price <= 1000.0e0 )
FILTER ( ?price >= 650.0e0 )
FILTER ( ?rooms <= 4.0e0 )
FILTER ( ?rooms >= 3.0e0 )
FILTER ( ?area <= 100.0e0 )
FILTER ( ?area >= 60.0e0 )
}

(有没有更好的方法来查询那些bnodes:?hasNearbyPark,?hasNearbySupermarket)

以及执行查询的代码:

dataset.begin(ReadWrite.READ);
Model model = dataset.getNamedModel("http://example.com");
QueryExecution queryExecution = QueryExecutionFactory.create(buildQuery(), model);
ResultSet resultSet = queryExecution.execSelect();
while ( resultSet.hasNext() ) {
QuerySolution solution = resultSet.next(); ...

最佳答案

关于 ARQ 查询引擎

首先,您似乎误解了 ARQ 引擎的工作原理:

ResultSet resultSet = queryExecution.execSelect();

以上所做的只是为引擎将如何评估查询准备一个查询计划,它实际上并不评估查询,因此它几乎是即时的。

在您开始调用 hasNext()next() 之前,不会真正回答您的问题:

while ( resultSet.hasNext() ) {
QuerySolution solution = resultSet.next(); ...

所以你引用的时间不正确,查询需要 4s 来评估,因为这是迭代所有结果所花费的时间。

关于您的实际问题

您没有展示您的 buildQuery() 方法的作用,但您说您正在以编程方式将查询构建为 Op 结构而不是字符串?如果是这种情况,那么查询引擎可能实际上没有应用优化,尽管我不以为然,但我认为这不是问题所在。您可以尝试在返回构建的 Op 之前添加 op = Algebra.optimize(op);,但我不知道这会有多大不同。

看起来优化器应该在给定原始查询的情况下做得很好(并不是说您的查询除了连接重新排序之外还有很多优化空间)但是如果您以编程方式构建它那么您可能正在构建一个不寻常的代数优化器苦苦挣扎。

同样,我不确定您的 stats.opt 文件是否会被接受,因为您查询的是特定模型而不是 TDB 数据集,因此查询引擎可能是通用的而不是 TDB引擎。我不是 TDB 方面的专家,所以我无法判断是否属于这种情况。

底线

一般来说,您的问题中没有足够的信息来诊断您的设置是否存在实际问题,或者您的查询是否只是非常昂贵。将此作为最小测试用例(最小完整代码加上样本数据)报告给 user@jena.apache.org 列表以进行进一步分析将很有用。

作为对您的查询的一般评论,许多范围过滤器的执行成本很高,这很可能是大多数时间花在的地方。

关于java - Jena ARQ/TDB 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18517185/

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