首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jena ARQ/TDB查询优化

Jena ARQ/TDB查询优化
EN

Stack Overflow用户
提问于 2013-08-30 01:17:27
回答 1查看 1.7K关注 0票数 1

我有一个相当小的图,包含大约500k个三元组。我还生成了stats.opt文件,并在一台速度相当快的计算机(四核、16 on内存、固态硬盘)上运行我的代码。但是,对于我在OP接口的帮助下构建的查询,遍历结果集需要花费很长时间。结果集大约有15000行,迭代需要4秒,这对最终用户来说是不可接受的。执行查询只需要90ms (我猜真正的工作是由游标迭代完成的?)。为什么这么慢?我能做些什么来加速结果集迭代?

下面是查询:

代码语言:javascript
复制
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,?hasNearbySupermarket)

以及执行查询的代码:

代码语言:javascript
复制
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(); ...
EN

回答 1

Stack Overflow用户

发布于 2013-08-30 03:31:20

在ARQ查询引擎上

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

代码语言:javascript
复制
ResultSet resultSet = queryExecution.execSelect();

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

在开始调用hasNext()next()之前,不会进行实际的回答问题的工作

代码语言:javascript
复制
while ( resultSet.hasNext() ) {
   QuerySolution solution = resultSet.next(); ...

所以你引用的时间是不正确的,查询需要4秒来计算,因为这是迭代所有结果所需的时间。

关于你的实际问题

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

看起来优化器只要给定原始查询就应该做得很好(这并不是说您的查询除了连接重新排序之外还有很多优化空间),但是如果您是通过编程构建它的,那么您可能正在构建一个不寻常的代数,优化器很难处理这个代数。

类似地,我不确定您的stats.opt文件是否会受到欢迎,因为您查询的是特定的模型,而不是TDB数据集,因此查询引擎可能是通用的,而不是TDB引擎。我不是TDB方面的专家,所以我不知道是不是这样。

底线

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

作为对查询的一般注释,执行大量范围过滤器的成本很高,这很可能是大部分时间都用到的地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18517185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档