由于对图数据库不熟悉,我们在向图数据录入数据时发现录入速度不符合要求
我们的录入思路是:
录入节点的同时,顺便构建该节点与其他节点的边,使用了neo4j apoc语法可以一句话实现,而且构建出的边还不会导致图产生回环
这个方法已经比我们自己写程序实现录入节点,再通过查询构造边的方法快了一些,可是速度还是很慢,在数据量在几十万的时候,基本1秒创建一个节点和相关的边,这个速度远远跟不上数据产生的速度
想法1
将节点数据录入与构建关系分开,因为录入节点数据应该不会这么慢,慢的是新节点进入后,创建边的过程,这个数据处理还是行级处理,每次有新节点进入都要执行一边查询
先将一个批次所有节点数据录入,然后对所有节点数据执行一次边构建
难点1
批量数据构建边很难保证图数据不产生回环,想要保证节点边最后生成的是树,这个思路需要修改一下
想法2
按照生成树的想法构建边,分为2个步骤
1. 根据节点属性分组,每个分组作为一个节点集合,集合内节点数量需要>1
2. 遍历每个集合,将集合内的第一个节点作为根节点,剩余节点作为叶节点,构建边
将这个想法告诉AI,来构造我们不熟悉的cypher语句
AI用不到5行代码实现了我们的这个思路,实测可行,且执行速度在几秒钟,比最早先的思路快了好几个级别
难点2
这个想法解决了生成边的速度慢,容易产生回环的问题,还有一个问题还需要后续测试求证,当有新的节点加入,这个代码执行时,不知道第一个节点的位置会不会迁移到其他节点上,如果每次执行该代码,新节点都会扰乱现有节点排序,那么还是会在重新构建边的时候产生环型图,生成多余的边
针对这个问题我们有2个假设
1. neo4j得到的节点集合是有序的,默认按照id排序,因此第一个节点的位置不会改变
2. 在第1个假设成立的基础上,有新节点加入图数据,重新执行生成边代码,不会产生多余的边
这两个假设成立的话,我们就可以继续使用这个代码进行数据构建,如果这两个假设不成立,我们还得继续找新的思路,来保证生成树的图数据结构,这些就留待后续测试吧