1

我正在使用具有超过 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 循环向工作人员发送消息,工作人员进行查询。

4

1 回答 1

2

60,000 个节点对于 Neo4j 来说是很小的——它可以达到 320 亿+——但是你需要增加配置中的堆大小。

http://blog.neo4j.org/2011/03/neo4j-13-abisko-lampa-m04-size-really.html

但是,您可能希望限制通过 REST 返回的节点数量并对它们进行分页。

或者您可能会考虑返回所有 ID,将它们缓存在您的应用程序或 Redis 之类的东西中,然后在 ID 上使用 Cypher 进行多次获取。这样您就不会每次都运行查询。

于 2012-05-27T00:35:47.333 回答