GraphDB查询无提示失败(OutOfMemoryError)

时间:2018-05-09 12:33:40

标签: sparql graphdb

我正在处理一个非常庞大的存储库(即~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存在问题。总的来说,我认为工作台在这种情况下应该明确地显示错误消息。

2 个答案:

答案 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版本中,开发人员对所有聚合进行了更高效的内存实现。在公开发布之前,只有很少的选项可供测试:

  1. 通过编写稍微更优化的查询版本来减少内存消耗量,该版本仅显示本地名称:
  2. 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)
    
    1. 增加可用RAM以执行所有聚合计算。您可以通过传递较高的-Xmx参数值或在graphdb.properties中为graphdb.page.cache.size设置最小数量来增加它,例如:graphdb.page.cache.size=100M。缓存控制存储在内存页面中的数量,这对于您的查询和存储库大小来说不会产生太大的影响。

    2. 使用-Dgraphdb.engine.function.concat.max-length=4096限制组连续字符串的最大长度。该限制不会使查询成功执行,但它会指示问题是否过多的主题字符串过多。