代码之家  ›  专栏  ›  技术社区  ›  Arlo Clarke

如何以自动化方式导出大型Neo4j数据集进行分析

  •  2
  • Arlo Clarke  · 技术社区  · 6 年前

    我遇到了一个关于Neo4j使用的技术挑战,这让我困惑了一段时间。我的组织使用Neo4j来建模客户交互模式。该图的大小已增长到约200万个节点和700万条边。所有节点和边都有5到10个元数据属性。每天,我们都会将所有客户的数据从Neo4j导出到一系列执行业务逻辑的python流程。

    我们最初的数据导出方法是使用分页的cypher查询来提取我们需要的数据。对于每个客户节点,cypher查询必须收集许多类型的周围节点和边缘,以便在必要的上下文中执行业务逻辑。不幸的是,随着数据的大小和密度的增长,这些分页查询开始花费太长的时间而变得不实用。

    我们当前的方法使用一个定制的Neo4j过程来迭代节点,收集必要的周围节点和边,序列化数据,并将其放在Kafka队列中供下游使用。这种方法工作了一段时间,但现在需要足够长的时间,因此它也变得不切实际,特别是考虑到我们预计图形的大小将增长一个数量级。

    我已经试过了 cypher-for-apache-spark neo4j-spark-connector 这两个项目都无法提供我们所需的查询和数据传输速度。

    我们目前在一个32GB内存和8核的Neo4j实例上运行。集群是否有助于缓解此问题?

    有人对如何执行这种数据导出有什么想法或技巧吗?如能深入了解该问题,将不胜感激!

    2 回复  |  直到 6 年前
        1
  •  0
  •   Bartosz Konieczny    6 年前

    据我所知,Neo4j不支持水平缩放,所有数据都存储在单个节点中。要使用Spark,您可以尝试将图形存储在2个以上的节点中,并从这些单独的节点加载数据集的部分,以“模拟”并行化。我不知道您引用的两个连接器是否都支持它。

    但正如你的问题评论中所述,也许你可以尝试另一种方法。一个想法:

    1. 找到一个表示训练模型所需的所有内容的数据结构。
    2. 将这种“展平”图存储在某个键值存储中(Redis、Cassandra、DynamoDB…)
    3. 现在,如果图表中有什么变化,请将消息推到您的卡夫卡主题
    4. 添加消费者,在更改后直接更新图形和键值存储中的数据(=仅更新受更改影响的图形分支,无需导出整个图形或同时更改键值存储,但很可能会导致逻辑重复)
    5. 使您的模型直接查询键值存储。

    这还取决于您的数据更改频率、图形的深度和广度?

        2
  •  0
  •   OpenCoderX    5 年前

    Neo4j Enterprise支持群集,您可以使用因果群集功能,根据需要启动尽可能多的读取副本,在读取副本上并行运行查询,请参阅以下链接: https://neo4j.com/docs/operations-manual/current/clustering/setup-new-cluster/#causal-clustering-add-read-replica