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

How to update existing specific node in graphdb by loading updated CSV file in neo4J apoc

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

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

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

Suggestion: Use TOINTEGER function in both queries or none.

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

Suggestion: Either Add ON CREATE to MERGE query or remove ON MATCH from MERGE query and update node every time. Adding ON CREATE is a recommended and efficient way.

请使用 ON CREATE 查找以下查询:

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