首页 文章

查询评估花了太长时间

提问于
浏览
1

我正在使用 GraphDB Free 7.1,我已经使用默认设置创建了一个存储库。我上传了一个包含 2.7 百万个三元组的 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,我不确定导致查询中断异常的原因;最有可能是记忆问题?非常简单的查询(e.g. 返回某个类的所有实例)工作正常。

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

最好,尼克

2 回答

  • 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)
    }
    
  • 0
    • 你真的需要 DISTINCT 吗?这总是会让事情变慢,因为它必须在内存中获取所有结果,在开始服务之前对它们进行排序和 unq。

    • 你在 FILTER 中需要=或> =吗?如果=然后用 BIND(...as?Factor2 替换过滤器,并在搜索?prefix2 之前放置这些东西

    • 你有没有想过查询? http://graphdb.ontotext.com/documentation/standard/explain-plan.html

相关问题