我正在使用 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 回答
实际上我已经设法将查询减少到最小,以便得到回答。问题主要是由于以下三重模式:
如果省略这些并且原始查询中的相应变量被常量资源替换,则回答查询。
以下是生成的查询:
你真的需要 DISTINCT 吗?这总是会让事情变慢,因为它必须在内存中获取所有结果,在开始服务之前对它们进行排序和 unq。
你在 FILTER 中需要=或> =吗?如果=然后用 BIND(...as?Factor2 替换过滤器,并在搜索?prefix2 之前放置这些东西
你有没有想过查询? http://graphdb.ontotext.com/documentation/standard/explain-plan.html