我正在使用超过60,000个节点的相当大的Neo4J设置。每个节点具有大约4~5个属性和简单的父 - >子关系。当使用这些60,000个节点时,特别是在昂贵且重复的查询中,我通过Neo4J的REST接口获得了各种500个HTTP错误。
在浏览完日志后,我发现Java堆空间是问题所在。我将512 MB的限制加速到2048 MB,但它仍然给我500.如果我将堆设置为3GB或4GB,neo4j甚至都没有启动。我正在一台相当不错的笔记本电脑(i5,4GB RAM)上进行测试,我真的想知道这是配置问题还是应用程序在我的服务器上运行正常(亚马逊超大型高CPU实例)。是否有某种缓存可以帮助我加快速度?基本上,我多次遍历整个节点网络。
我正在运行两个查询。第一个是:
start referrer=node(3) match path=referrer-[*1..1]->referral return referral
这是为了发现推荐者#3的第1层节点。然后,我必须从他所有的层中发现所有节点,返回节点,第一层的节点,然后是层号。
start referrer=node(3) match path=referrer-[*1..1]->firsttier-[*0..]->referral return referral, firsttier, length(path)
它完美无缺,速度非常快。但是,我正在为我网络中的所有节点执行此操作。我在for循环中运行两个查询(并使用它们应用业务逻辑)。循环运行60,000次。
现在我正在我的笔记本电脑上测试这个,但是,这个“任务”已经为分布式处理做好了准备,因为我用ZeroMQ做了一切。 for循环向工作人员发送消息,工作人员进行查询。
答案 0 :(得分:2)
Neo4j的60,000个节点很小 - 它可以达到320亿+ - 但你需要增加配置中的堆大小。
请参阅http://blog.neo4j.org/2011/03/neo4j-13-abisko-lampa-m04-size-really.html
但是,您可能希望限制通过REST返回的节点数并将其分页。
或者您可以考虑返回所有ID,在应用程序或类似Redis之类的内容中缓存它们,然后在ID上与Cypher进行多次获取。这样,您每次都不会运行查询。