如何通过在neo4J apoc中加载更新的CSV文件来更新graphdb中的现有特定节点

时间:2019-06-18 11:35:44

标签: neo4j cypher neo4j-apoc load-csv

我正在通过在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

1 个答案:

答案 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转换为整数,这将不起作用。