我正在处理一个非常庞大的存储库(即~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
直到结论。
更新
Here是描述问题的主要日志。 GraphDB工作台中的输出是:
没有结果。查询花了1分53秒,分钟前。
没有提到错误。很奇怪。正如Gilles-Antoine Nys指出的那样,内存和Java的GC存在问题。总的来说,我认为工作台在这种情况下应该明确地显示错误消息。
答案 0 :(得分:3)
首先,您的查询无法为您提供可由类型定义的类...我在您的div {
width: 320px;
padding: 10px;
border: 5px solid gray;
margin: 0;
}
中为了表达而重新添加了320px (width)
+ 20px (left + right padding)
+ 10px (left + right border)
+ 0px (left + right margin)
= 350px
。所以你可以轻松回答你的问题。
以下是最简单的查询:
?s
(select
如果对您来说很重要,可以添加。)
其次,select ?s (group_concat(?t) as ?fo)
where {
?s rdf:type ?t.
} group by (?s)
只是在监视器中暂停时的查询状态。与错误无关。
最后,验证您的order by(?fo)
参数。其默认值设置为0。
更新:
实际上你的LogFile中有两个错误。问题是你的JVM对垃圾收集器花费的时间太长了(你的内存仍然超过98%)。
一种解决方案是增加GC开销限制,因此可以处理庞大的数据集。
答案 1 :(得分:1)
正如其他评论已经暗示错误是由OME引起的。在下一个即将发布的GraphDB 8.6版本中,开发人员对所有聚合进行了更高效的内存实现。在公开发布之前,只有很少的选项可供测试:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?s_local (group_concat(?t_local) as ?fo) where { ?s rdf:type ?t. BIND (REPLACE(STR(?t), "^(.*)(/|#)([^#/]*)$", "$3") as ?t_local) BIND (REPLACE(STR(?s), "^(.*)(/|#)([^#/]*)$", "$3") as ?s_local) } group by (?s_local) order by (?fo)
增加可用RAM以执行所有聚合计算。您可以通过传递较高的-Xmx
参数值或在graphdb.properties中为graphdb.page.cache.size
设置最小数量来增加它,例如:graphdb.page.cache.size=100M
。缓存控制存储在内存页面中的数量,这对于您的查询和存储库大小来说不会产生太大的影响。
使用-Dgraphdb.engine.function.concat.max-length=4096
限制组连续字符串的最大长度。该限制不会使查询成功执行,但它会指示问题是否过多的主题字符串过多。