我有一个关于如何向 Neo4j 中已有的图形添加元素的问题。
首先,我使用以下查询创建了节点和关系:
CALL apoc.import.csv(
[{fileName: "file:///accounts.csv", labels:["Account"]}],
[{fileName: "file:///transactions.csv", type:"transaction"}],
{ignoreDuplicateNodes: true}
)
其中
accounts.csv
和transactions.csv
的内容如下:
acct_id:ID
"3240"
"6399"
"4771"
"2066"
id,from_acct:START_ID,to_acct:END_ID,timestamp
221214,6399,3240,2022-12-15
221223,4771,3240,2022-12-23
221229,2066,3240,2022-12-29
到目前为止,我已经能够毫无问题地创建图表。
接下来,我尝试一次从
add.csv
读取一行数据,并将节点和关系添加到上述查询创建的图表中,但失败了。 add.csv
的内容如下:
id,from_acct:START_ID,to_acct:END_ID,timestamp
221243,1000,3240,2023-1-1
221247,3000,3241,2023-1-2
对于
add.csv
数据,我只想创建尚不存在的节点。然而,所有关系都应该被创建。
换句话说,在第一行中,具有
acct_id:3240
的节点已经存在,因此我只想将具有 acct_id:1000
的节点添加到图形中,并与具有 acct_id:3240
的节点创建关系。在第二行中,带有 acct_id:3000
的节点和带有 acct_id:3241
的节点都不存在,因此我想将它们都添加为新节点并与它们创建关系。
似乎讨论了避免创建现有节点重复项的能力,但没有为
apoc.import.csv
实现,因为它会减慢过程。该过程实际上是为了加载新数据库。
作为替代方案,您可以使用 LOAD CSV 和 MERGE 进行导入。在此查询中使用
MERGE
仅在节点尚不存在时创建该节点:
LOAD CSV FROM 'file:///add.csv' AS row
MERGE (a1:Account {id: row[1]})
MERGE (a2:Account {id: row[2]})
CREATE (a1)-[:transaction {id: row[0], timestamp: row[3]}]->(a2)
注意:您可以通过在 :Account(id)
上创建 index 或
唯一性约束来加快此查询速度。另外,您可能应该从数据文件中删除第一行(标题),因为上面的查询假设它不存在。