我正在处理一个非常庞大的存储库(即~16M语句) . 我正在尝试获取图表中所有不同类成员模式的列表 . 这是查询:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select distinct (group_concat(?t) as ?fo)
where {
?s rdf:type ?t.
}
group by (?s)
order by ?fo
当然,这样的查询必须返回结果 . 奇怪的是,有时候我得到了我需要的结果,有时候查询没有返回任何结果 .
为什么会发生这种情况,我该如何避免呢?
PS:监控查询,我注意到当我没有数据时,查询状态仍然停留在:
IN_HAS_NEXT
0 operations
直到结论 .
Update:
Here是描述问题的主要日志 . GraphDB工作台的输出是:
没有结果 . 几分钟前,查询耗时1分53秒 .
没有提到错误 . 很奇怪 . 正如Gilles-Antoine Nys指出的那样,内存和Java的GC存在问题 . 总的来说,我认为工作台在这种情况下应该明确地显示错误消息 .
2 回答
正如其他评论已经表明错误是由OME引起的 . 在下一个即将发布的GraphDB 8.6版本中,开发人员对所有聚合进行了更高效的内存实现 . 在公开发布之前,只有很少的选项可供测试:
增加可用RAM以执行所有聚合计算 . 您可以通过传递更高的
-Xmx
参数值或在graphdb.properties中设置graphdb.page.cache.size
的最小数字来增加它,例如:graphdb.page.cache.size=100M
. 缓存控制存储在内存页面中的数量,这对于您的查询和存储库大小来说不会产生太大影响 .使用
-Dgraphdb.engine.function.concat.max-length=4096
限制组concat字符串的最大长度 . 该限制不会使查询成功执行,但它会指示,问题是否过多的主题字符串太长 .首先,您的查询无法为您提供可由类型定义的类...我重新开始在您的
select
中添加?s
以表达性能 . 所以你可以轻松回答你的问题 .这是最简单的查询:
(如果对你很重要,可以添加
order by(?fo)
) .其次,
IN_HAS_NEXT
只是在监视器中暂停时的查询状态 . 与错误无关 .最后,验证您的
query-timeout
参数 . 其默认值设置为0 .Update :
实际上你的LogFile中有两个错误 . 问题是你的JVM对垃圾收集器的占用时间太长(仍然使用98%以上的内存) .
一种解决方案是增加GC开销限制,因此可以处理您庞大的数据集 .