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

Posted

技术标签:

【中文标题】如何以自动化方式导出大型 Neo4j 数据集进行分析【英文标题】:How to export large Neo4j datasets for analysis in an automated fashion 【发布时间】:2018-05-01 23:28:34 【问题描述】:

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

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

我们当前的方法使用自定义 Neo4j 程序来迭代节点,收集必要的周围节点和边,序列化数据,并将其放在 Kafka 队列中以供下游使用。这种方法工作了一段时间,但现在花费的时间足够长,以至于它也变得不切实际,尤其是考虑到我们希望图表的大小会增长一个数量级。

我尝试了cypher-for-apache-spark 和neo4j-spark-connector 项目,它们都无法提供我们需要的查询和数据传输速度。

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

有没有人对如何执行这种数据导出有任何想法或提示?任何对问题的见解将不胜感激!

【问题讨论】:

出口真的有必要吗?您是否尝试过使用 neo4j Python 驱动程序(如 official Bolt driver)直接在 neo4j 数据库上执行业务逻辑? 不幸的是,这种逻辑超出了 cypher 所能提供的范围。我们已经训练了需要访问数据的分类器和模型。 很少的业务逻辑需要在 Cypher 中执行。您可以只使用驱动程序来获取用纯 Python 编写的业务逻辑所需的数据。 我们需要的数据或多或少涉及到数据库中的所有数据。而且每个查询都有大量的数据相互重叠,使得单个查询的效率远低于数据导出和操作它的应用程序逻辑。外部文档缓存可能会有所帮助,但我们需要经常重新构建和重新处理整个数据库。 我不是 Neo4j 专家,所以对这个问题持保留态度,但如果您的应用程序需要在数据库中进行分页(并且您可以使用密码查询执行逻辑),这可能是值得的考虑其他存储方法?你知道这是否超出了 Neo4j 的交互模式吗? 【参考方案1】:

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

但正如您问题的 cmets 所述,也许您可​​以尝试另一种方法。一个想法:

    找到一个数据结构,代表您训练模型所需的一切。 将此类“扁平化”图存储在某个键值存储(Redis、Cassandra、DynamoDB...)中 现在,如果图表发生变化,请将消息推送到您的 Kafka 主题 添加消费者更新图形和键值存储后的数据(= 只更新受更改影响的图形分支,无需导出整个图形或更改键值存储同一时刻,但很可能会导致重复逻辑) 让您的模型直接查询键值对存储。

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

【讨论】:

谢谢,每当更新相关节点时,我都会在 neo4j 触发器中将扁平化文档推送到 elasticsearch【参考方案2】:

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

【讨论】:

以上是关于如何以自动化方式导出大型 Neo4j 数据集进行分析的主要内容,如果未能解决你的问题,请参考以下文章

如何导出大型数据集(大约 40k 行和 26 列),以写入 Excel 表

如何对来自 PowerQuery 的 OData 中的大型数据集的请求进行分页?

如何使用 PHP 和 MySQL 有效地对大型数据集进行分页?

ArangoDB - 如何将neo4j数据库导出导入ArangoDB

大型数据集,不同数据库之间的数据比较不兼容

在 Pandas 中连接 Excel 文件表,以 CSV 格式每 1 行将大型 Pandas 数据框导出到新的 Excel 文件。自动化?