向 Neo4j 中已有的图添加元素

问题描述 投票:0回答:1

我有一个关于如何向 Neo4j 中已有的图形添加元素的问题。

首先,我使用以下查询创建了节点和关系:

CALL apoc.import.csv(
    [{fileName: "file:///accounts.csv", labels:["Account"]}],
    [{fileName: "file:///transactions.csv", type:"transaction"}],
    {ignoreDuplicateNodes: true}
)

其中

accounts.csv
transactions.csv
的内容如下:

账户.csv
acct_id:ID
"3240"
"6399"
"4771"
"2066"
交易.csv
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
的内容如下:

添加.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
的节点都不存在,因此我想将它们都添加为新节点并与它们创建关系。

neo4j cypher neo4j-apoc
1个回答
2
投票

似乎讨论了避免创建现有节点重复项的能力,但没有为

apoc.import.csv
实现,因为它会减慢过程。该过程实际上是为了加载新数据库。

作为替代方案,您可以使用 LOAD CSVMERGE 进行导入。在此查询中使用

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

唯一性约束
来加快此查询速度。另外,您可能应该从数据文件中删除第一行(标题),因为上面的查询假设它不存在。

© www.soinside.com 2019 - 2024. All rights reserved.