【问题标题】:Can Neo4j handle traversal with more than 60,000 nodes?Neo4j 可以处理超过 60,000 个节点的遍历吗?
【发布时间】:2012-05-26 22:42:52
【问题描述】:

我正在使用具有 60,000 多个节点的相当大的 Neo4J 设置。每个节点大约有 4~5 个属性和简单的父->子关系。在使用这 60,000 个节点时,特别是在昂贵且重复的查询中,我通过 Neo4J 的 REST 接口收到各种 500 HTTP 错误。

查看日志后,我发现 Java 堆空间是问题所在。我将 512 MB 限制提高到 2048 MB,但它仍然给我 500。如果我将堆设置为 3GB 或 4GB,neo4j 甚至都不会启动。我正在一台相当不错的笔记本电脑(i5、4GB RAM)上对此进行测试,我真的很想知道这是否是配置问题,或者应用程序是否可以在我的服务器(Amazon Extra-Large High-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 循环向工作人员发送消息,工作人员进行查询。

【问题讨论】:

    标签: database graph neo4j


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Neo4J 在重负载下死机正常吗?我得到 500 并且服务器崩溃了。
    • 如果我分配更多堆,则需要更多时间才能死掉,但仍然会死掉。
    • 更新了我的答案。请检查。
    • 60K 节点不算什么,见docs.neo4j.org/chunked/snapshot/capabilities-capacity.html。还是有问题?感谢@espeed 在这里的帮助!
    • 由于这是一个使用 ZeroMQ 工作人员的分布式进程,我不知道为什么 Neo4j 越来越满。也许 GC 不能正常工作?如何进行适当的调音?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多