在Neo4j中添加元素到已经存在的图形

wribegjk  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个关于如何在Neo4j中添加元素到已经存在的图形中的问题。
首先,我使用以下查询创建了节点和关系:

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

其中accounts.csvtransactions.csv的内容如下:

accounts.csv
acct_id:ID
"3240"
"6399"
"4771"
"2066"

transactions.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的内容如下:

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

mgdq6dx1

mgdq6dx11#

It seems讨论了避免创建现有节点副本的能力,但没有为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)上创建indexuniqueness constraint来加快查询速度。此外,您可能应该从数据文件中删除第一行(标题),因为上面的查询假设它不存在。

相关问题