我有150个Mysql表,大约3M行,目前每行只有200多列(数量只会增加(,我想将我的表转移到单个Neo4J数据库中,每个字段都是一个节点,因此,对于上面的数字,它将是:
- 150=>表的数量
- 3M=>行数
- 200=>字段数
- 10=>平均每个字段中可能的值的数量
so(150*3000000(+(200*10(=大约450’002'000个节点
哪种方法最适合导入这么多节点和关系?知道有6个特定节点用作唯一标识符,因此必须合并以避免重复。
我认为MATCH非常重,所以我认为应该尽可能避免,你认为除了询问Neo4J(例如MongoDB(以避免MATCH之外,使用一种方法来知道节点是否存在会有用吗?这是一个好主意吗?
提前谢谢。
在大多数导入数据的场景中,您使用MERGE
而不是MATCH
,这允许您创建和重用唯一实体。在开始导入之前,请确保CONSTRAINTS设置正确。这是开始阅读的好地方。
对于将要导入的行数,您可能会考虑apoc.periodic.iterate。它会批量加载,如果存在短时间锁定,则会重试。此外,还要考虑事务日志中可能累积的垃圾(以gB数量为单位(。我在配置文件中添加了几行以保持它的干净:
dbms.checkpoint.interval.time=30s
dbms.checkpoint.interval.tx=1
dbms.tx_log.rotation.retention_policy=false
dbms.tx_log.rotation.size=1M
dbms.transaction.timeout=30m
正如Graphileon提到的,确保在加载之前对节点和关系进行索引;否则加载时间会很长。此外,请记住,即使使用MERGE,属性的任何更改都会创建重复项。