Jena ARQ/TDB查询优化



我有一个相当小的图,包含大约500k个三元组。我还生成了stats.opt文件,并在速度相当快的计算机上运行代码(四核、16gb ram、ssd驱动器)。但对于我在OP接口的帮助下构建的查询,迭代结果集需要很长时间。结果集大约有15000行,迭代需要4秒,这对最终用户来说是不可接受的。执行查询只需要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 )
  }    

(有没有更好的方法来查询这些bnode:?hasNearbyPark,?hasNealbySupmarket)

执行查询的代码:

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(); ...

因此,您引用的时间不正确,查询需要4秒才能求值,因为这就是迭代所有结果所需的时间。

关于你的实际问题

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

在给定原始查询的情况下,优化器似乎应该做得很好(并不是说您的查询除了联接重新排序之外还有很大的优化空间),但如果您以编程方式构建它,那么您可能正在构建一个不寻常的代数,而优化器很难解决这个问题。

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

底线

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

作为对查询的一般评论,许多范围过滤器的执行成本很高,这可能是大部分时间的情况。

相关内容

  • 没有找到相关文章

最新更新