我已成功将dblp数据集迁移到neo4j数据库,并使用neo4jShell运行cypher quires。该数据库在出版物和作者之间有数百万个节点和关系。现在,当我尝试在neo4j数据库上运行查询时,需要10到12个小时进行处理,然后最终出现此错误
服务器线程出错; 嵌套异常是:java.lang.OutOfMemoryError:Java堆空间
我正在使用neo4j社区版2.2.3版, jdk 1.7机器,内存为8 GB,核心i7处理器。
查询:
neo4j-sh (?)$ MATCH (p:`publication`)-[:`publishedby`]->(a:`author`)
RETURN p.year, p.type, a.id, count(*) order by a.id desc LIMIT 25;
专家请告诉我这个例外的任何方式。
答案 0 :(得分:1)
可能你应该为你的java进程设置更多的最大内存。 Java进程最多只使用配置的最大内存量,默认情况下它只有256 MB。使用-Xmx参数来实现。请阅读此How to set the maximum memory usage for JVM?以获得更详细的说明。
请注意,必须使用64位jdk和64位操作系统将Xmx设置为大于4 GB。
答案 1 :(得分:1)
由于您的数据集是公共数据集,因此您可以共享数据库非常有用。
一般情况下,您计算的是数百万或数十亿个路径,事实上您正在聚合,这需要一段时间。 结合可能太少的内存和慢磁盘,从磁盘加载数据需要很长时间。
这是一个全局图表查询,您可以看到,如果您运行前缀为PROFILE
。
确保您的id属性是数字的!
我会改变这样的查询:
// this is the expensive operation, to order millions of authors by id
// still, do it and take the top 25
MATCH (a:author) WITH a order by a.id LIMIT 25
// find publications for the top 25 authors
MATCH (a)<-[:publishedby]-(p)
// return aggregation
RETURN a.id, p.year, p.type, count(*)
LIMIT 25;
使用合理的内存设置启动neo4j-shell:
如果您在独立模式下运行neo4j-shell,请停止服务器并使用它:
export JAVA_OPTS="-Xmx4000M -Xms4000M -Xmn1000M"
bin/neo4j-shell -path data/graph.db -config conf/neo4j.properties