我正在通过在neo4j中加载最近更新的csv文件来面对更新节点的问题。由于文件很大,因此我认为需要使用apoc程序。我已经通过不使用apoc加载外部更新文件来更新现有节点。但是问题是我需要使用apoc并行更新它。这是我的文件元素
文件中的原始元素
ID,SHOPNAME,DIVISION,DISTRICT,THANA
1795,ARAFAT DISTRIBUTION,RAJSHAHI,JOYPURHAT,Panchbibi
1796,CONNECT DISTRIBUTION,DHAKA,GAZIPUR,Gazipur Sadar
1797,HUMAYUN KABIR,DHAKA,DHAKA,Demra
我已从此CSV创建了节点
然后我有另一个更新文件u.csv,更新后的元素如下所示
ID,SHOPNAME,DIVISION,DISTRICT,THANA
1795,ABC,RAJSHAHI,JOYPURHAT,Panchbibi
1796,XYZ,DHAKA,GAZIPUR,Gazipur Sadar
1797,HUMAYUN KABIR,DHAKA,DHAKA,Demra
没有apoc,我的查询是
LOAD CSV FROM "file:///u.csv" AS line
MERGE (c:Agent {ID:line[0]})
ON MATCH SET c.SHOPNAME = line[1]
RETURN c
此代码更新了所需的列,除了我有一个空白节点
{"ID":"ID"}
我的第一个问题是为什么要创建一个新的空白节点,我该如何解决这个问题
现在我想要更新大文件,所以我习惯了apoc程序进行批处理
使用apoc我的查询是
CALL apoc.periodic.iterate('LOAD CSV WITH HEADERS FROM "file:///u.csv" AS line return line','MERGE (p:Agent{ID:TOINTEGER(line.ID)}) ON MATCH SET p.SHOPNAME=TOINTEGER(line.SHOPNAME) ' ,{batchSize:10000, iterateList:true, parallel:true});
但是我无法更新特定的节点,而是创建了两个具有相关ID的节点,所以我在这里得到5个节点,而不是3个节点
{"ID":1795}
{"ID":1796}
我对neo4j很陌生,但想学习。请帮助我解决问题 我正在使用neo4j 3.5.6和apoc 3.5.0.4
答案 0 :(得分:2)
我在这里看到2-3个可能的问题:
TOINTEGER
函数,因此节点是重复的。一个Agent
节点,其中id
的数据类型为字符串,另一个Agent
节点,其中id
的数据类型为整数。建议:在两个查询中均不使用
TOINTEGER
函数。
ON MATCH
)时设置节点属性。
但是,对于第一种情况,我们发现它每次都会创建一个新节点,并且不匹配任何先前的节点。创建时也不设置属性。因此,将没有 SHOPNAME 的节点。建议:向
ON CREATE
查询中添加MERGE
或从MERGE查询中删除ON MATCH
并每次更新节点。建议添加ON CREATE
,这是一种有效的方法。
请在下面的查询中使用ON CREATE
:
MERGE (c:Agent {ID:line[0]})
ON CREATE SET
c.SHOPNAME = line[1]
SHOPNAME
使用APOC在查询中将TOINTEGER
转换为整数,这将不起作用。