查询评估花了太长时间

时间:2016-10-25 07:58:55

标签: sparql graphdb

我正在使用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,我不确定导致查询中断异常的原因;最有可能是记忆问题? 非常简单的查询(例如,返回某个类的所有实例)工作正常。

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

最佳, 尼克

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

  1. 你真的需要DISTINCT吗?这总是会让事情变慢,因为它必须在内存中获取所有结果,在开始服务之前对它们进行排序和统一。

  2. 您在FILTER中需要=或&gt; =吗? if =然后用BIND(...作为?Factor2)替换过滤器,并在搜索前添加这些内容?prefix2

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