1

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

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

最好的,尼克

4

2 回答 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)
}
于 2016-10-25T11:05:06.867 回答
0
  1. 你真的需要 DISTINCT 吗?这总是会减慢速度,因为它必须在内存中获取所有结果,对它们进行排序并在开始服务之前对它们进行 uniq。

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

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

于 2017-01-13T18:40:05.223 回答