【问题标题】:Query evaluation took too long查询评估花费了太长时间
【发布时间】:2016-10-25 07:58:54
【问题描述】:

我正在使用 GraphDB Free 7.1,并使用默认设置创建了一个存储库。我上传了一个包含 270 万个三元组的 ttl 文件。我正在尝试发出一个查询(不是很复杂,但很复杂),它应该返回 200k 个答案,Workbench 只显示 1k 个答案,GraphDB 日志显示一个异常

10:52:19.580 [repositories/PaaSport] INFO  c.o.f.sesame.RepositoryController - POST query -1325396809
10:52:29.594 [repositories/PaaSport] ERROR o.o.h.s.r.TupleQueryResultView - Query interrupted
org.openrdf.query.QueryInterruptedException: Query evaluation took too long
...
10:52:29.594 [repositories/PaaSport] INFO  o.o.h.s.r.TupleQueryResultView - Request for query -1325396809 is finished

我正在使用的查询是:

SELECT DISTINCT ?offering ?Value 
WHERE {
    ?offering           a                          paasport:Offering ; 
                        DUL:satisfies              ?groundDescription . 
    ?groundDescription  paasport:offers            ?characteristic . 
    ?characteristic     a                          paasport:Storage ; 
                        DUL:hasParameter           ?par . 
    ?par                a                          paasport:StorageCapacity ; 
                        DUL:hasParameterDataValue  ?Value ; 
                        DUL:parametrizes           ?qualityValue . 
    ?qualityValue       uomvocab:measuredIn        ?Units .
    ?Units              a                          ?AppParMeasureUnitType . 
    ucum:GB             a                          ?AppParMeasureUnitType . 
    ?Units              a                          uomvocab:SimpleDerivedUnit . 
    ucum:GB             a                          uomvocab:SimpleDerivedUnit . 
    ucum:GB             uomvocab:derivesFrom       ?BasicUnit . 
    ?Units              uomvocab:derivesFrom       ?BasicUnit . 
    ucum:GB             uomvocab:modifierPrefix    ?prefix1 . 
    ?Units              uomvocab:modifierPrefix    ?prefix2 . 
    ?prefix1            uomvocab:factor            ?Factor1 . 
    ?prefix2            uomvocab:factor            ?Factor2 . 
       FILTER( xsd:double(?Factor2)*?Value = xsd:double(?Factor1)*4) 
  }

由于查询超时设置为0,不知道是什么原因导致查询中断异常;最有可能是记忆问题? 非常简单的查询(例如返回某个类的所有实例)可以正常工作。

有什么提示吗?任何帮助,将不胜感激。 如果需要,我可以提供更多详细信息。

最好, 尼克

【问题讨论】:

  • 查询好像太复杂了。可以分享一下查询吗?您是否尝试更改查询某些部分的顺序?有时这可以帮助查询计划优化器选择更有效的执行计划。此外,可能还有一些 GraphDB 配置参数,但我不是这个三重存储的专家。
  • SELECT DISTINCT ?offering ?Value WHERE { ?offering rdf:type paasport:Offering . ?offering DUL:satisfies ?groundDescription . ?groundDescription paasport:offers ?characteristic . ?characteristic rdf:type paasport:Storage . ?characteristic DUL:hasParameter ?par . ?par rdf:type paasport:StorageCapacity . ?par DUL:hasParameterDataValue ?Value . ?par DUL:parametrizes ?qualityValue . ?qualityValue uomvocab:measuredIn ?Units .
  • ?Units rdf:type ?AppParMeasureUnitType . ucum:GB rdf:type ?AppParMeasureUnitType . ?Units rdf:type uomvocab:SimpleDerivedUnit . ucum:GB rdf:type uomvocab:SimpleDerivedUnit . ucum:GB uomvocab:derivesFrom ?BasicUnit . ?Units uomvocab:derivesFrom ?BasicUnit . ucum:GB uomvocab:modifierPrefix ?prefix1 . ?Units uomvocab:modifierPrefix ?prefix2 . ?prefix1 uomvocab:factor ?Factor1 . ?prefix2 uomvocab:factor ?Factor2 . FILTER( xsd:double(?Factor2)*?Value = xsd:double(?Factor1)*4) }
  • 谢谢。一条评论:如果您编辑您的问题,它会更具可读性......我现在为您完成了。

标签: sparql graphdb


【解决方案1】:

实际上我已经设法将查询减少到最低限度,以便得到回答。问题主要是由于以下三重模式:

ucum:GB  rdf:type              ?AppParMeasureUnitType .
ucum:GB  rdf:type              uomvocab:SimpleDerivedUnit .
ucum:GB  uomvocab:derivesFrom  ?BasicUnit .

如果这些被省略并且原始查询中的相应变量被替换为常量资源,则查询被回答。

这是结果查询:

SELECT DISTINCT ?offering ?Value 
WHERE {
    ?offering           rdf:type                   paasport:Offering .
    ?offering           DUL:satisfies              ?groundDescription .
    ?groundDescription  paasport:offers            ?characteristic .
    ?characteristic     rdf:type                   paasport:Storage  .
    ?characteristic     DUL:hasParameter           ?par .
    ?par                rdf:type                   paasport:StorageCapacity .
    ?par                DUL:hasParameterDataValue  ?Value .
    ?par                DUL:parametrizes           ?qualityValue .
    ?qualityValue       uomvocab:measuredIn        ?Units .
    ?Units              rdf:type                   ucum:UnitOf-infotech .
    ?Units              rdf:type                   uomvocab:SimpleDerivedUnit .
    ?Units              uomvocab:derivesFrom       <http://purl.oclc.org/NET/muo/ucum/unit/amount-of-information/byte> .
    ucum:GB             uomvocab:modifierPrefix    ?prefix1 .
    ?Units              uomvocab:modifierPrefix    ?prefix2 .
    ?prefix1            uomvocab:factor            ?Factor1 .
    ?prefix2            uomvocab:factor            ?Factor2 .
        FILTER( xsd:double(?Factor2)*?Value >= xsd:double(?Factor1)*2)
}

【讨论】:

  • 好的,但是这个查询和原来的查询意思一样吗?我不这么认为,对吗?但可以肯定的是,如果您知道这些变量的绑定,则可以减少连接的数量。
  • 变量的绑定可以通过更简单的 SPARQL 查询预先确定,然后可以构造大的。尽管如此,查询仍然会在下一个“测试级别”2700 万三元组时超时。
【解决方案2】:
  1. 您真的需要 DISTINCT 吗?这总是会减慢速度,因为它必须在内存中获取所有结果,对它们进行排序并在开始服务之前对其进行唯一化。

  2. FILTER 中是否需要 = 或 >=?如果 = 则将过滤器替换为 BIND(...as ?Factor2),并将这些内容放在搜索 ?prefix2 之前

  3. 您是否对查询进行了概要分析? http://graphdb.ontotext.com/documentation/standard/explain-plan.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多