首页 > 解决方案 > 如何通过在 neo4J apoc 中加载更新的 CSV 文件来更新 graphdb 中现有的特定节点

问题描述

通过在 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 的问题

标签: neo4jcypherneo4j-apocload-csv

解决方案


我在这里看到 2-3 个可能的问题:

  • 关于重复节点:您TOINTEGER在一个而不是另一个数据加载查询中使用了函数,因此节点是重复的。一个Agent节点id的数据类型为字符串,另一个Agent节点id的数据类型为整数。

建议:在两个查询中使用TOINTEGER函数或不使用。

  • 关于空白节点: 在您的第二个查询中,只有在找到节点(即)时才设置节点属性ON MATCH。但是根据第一种情况,我们发现它每次都在创建一个新节点,并且与之前的任何一个节点都不匹配。创建时也不设置属性。所以会有没有SHOPNAME的节点。

建议:添加ON CREATEMERGE查询或ON MATCH从 MERGE 查询中删除并每次更新节点。添加 ON CREATE 是一种推荐且有效的方法。

请使用以下查询ON CREATE

MERGE (c:Agent {ID:line[0]})
ON CREATE SET 
    c.SHOPNAME = line[1]
  • 您还SHOPNAME使用 APOC 在查询中转换为整数TOINTEGER,这将不起作用。

推荐阅读