load csv 能自动过滤掉已经存在的节点吗?一条条判断节点存不存在太慢了
发布于 6 年前 作者 feng1990liu 2888 次浏览 来自 问答

如题,每天的数据csv个数更新到neo4j,要判断这个节点存不存在,load csv能不能自动过滤掉已经存在的节点,根据唯一约束

3 回复

建议在loadcsv之前进行数据清洗,比如在关系型数据库中清洗,然后导入neo4j.
这样数据出错的概率会小很多,因为数据清洗往往包含数据转换/更新/去重,这些更适合在关系型数据库中做.
另外,判断节点是否存在,存在就更新,不存在就新建,这个用merge就好了.
例子: 批量更新n,n_e节点与他们的watching关系,如果节点/关系存在就更新,不存在就新建

    CALL apoc.periodic.iterate(
    'CALL apoc.load.csv("{filename}") yield map as row return row'
    ,'merge (n:{label} {pid:row.pid}) with *
    merge (n_e:{label_end} {pid:row.pid_end}) with *
    merge (n)-[r:watching]->(n_e) '
    ,'{batchSize:10000, iterateList:true, parallel:true}'
    )
	;

@nonono merge的速度要比create慢一个数量级

LOAD CSV单次传上去的csv文档不能太大,不然会卡机。 可以把csv按每5000行切割。 同@nonono 的想法要先优化csv文档,主要是去重,如果有噪音(全角半角,简繁体)的话,再根据实际情况清洗。 建议先传完node。然后用match匹配,建关系。 merge虽然慢但是保险起见用LOAD CSV还是会用MERGE创建。 如果想更快插入的话,先放弃LOAD CSV的方法吧,neo4j-import等断电冷插入更合适。

回到顶部