如何通过在 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
转换为整数,这将不起作用。
我在通过在.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
toMERGE
query or removeON MATCH
from MERGE query and update node every time. AddingON 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
转换为整数,这将不起作用。