Neo4j的LOAD CSV是否支持同时处理多行及存储前一行数据?
关于LOAD CSV处理多行关联与存储前一行数据的解答
嘿,这个问题问得很到位!其实LOAD CSV虽然默认是逐行处理,但完全可以通过Cypher的上下文传递技巧,实现你想要的关联第i行与第i-1行节点的需求,也能轻松存储前一行的数据。下面给你详细说明:
1. 支持同时处理多行(关联当前行与前一行)
当然可以!核心思路是用WITH子句把前一行处理得到的节点或数据"带"到下一行的处理逻辑中,从而建立连续行之间的关系。
举个实际的例子,假设你的CSV结构是这样的(带表头):
id,name 1,Alice 2,Bob 3,Charlie 4,Diana
我们要给每一行的节点和上一行的节点建立FRIEND关系,具体Cypher语句如下:
// 第一步:读取第一行,初始化前一个节点 LOAD CSV WITH HEADERS FROM 'file:///your-data.csv' AS row WITH row LIMIT 1 MERGE (prevPerson:Person {id: row.id, name: row.name}) WITH prevPerson // 第二步:处理剩余行,关联当前节点与前一个节点 LOAD CSV WITH HEADERS FROM 'file:///your-data.csv' AS row SKIP 1 MERGE (currentPerson:Person {id: row.id, name: row.name}) MERGE (prevPerson)-[:FRIEND]->(currentPerson) // 更新前一个节点为当前节点,供下一行使用 WITH currentPerson AS prevPerson RETURN count(*) AS createdRelationships
这段代码的逻辑是:
- 先读取第一行数据,创建(或匹配)第一个节点,把它作为
prevPerson通过WITH传递下去 - 然后跳过第一行,处理剩下的每一行:创建当前节点,建立它和
prevPerson的好友关系,再把当前节点更新为新的prevPerson,继续处理下一行
2. 可以存储前一行的数据到"局部变量"
这里的"局部变量"其实是Cypher查询上下文里的变量,通过WITH子句就能轻松传递前一行的信息——不管是节点对象,还是CSV里的单个字段值都可以。
比如你不需要创建节点,只是想存储前一行的某个字段,也可以这么做:
LOAD CSV WITH HEADERS FROM 'file:///your-data.csv' AS row WITH row LIMIT 1 WITH row.prevField AS prevValue LOAD CSV WITH HEADERS FROM 'file:///your-data.csv' AS row SKIP 1 // 这里就能使用prevValue和当前行的row.field做对比或其他操作 WITH row.field AS prevValue RETURN count(*)
注意事项
如果你的CSV数据量很大,记得加上USING PERIODIC COMMIT来分批提交事务,避免内存溢出:
USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:///your-data.csv' AS row WITH row LIMIT 1 MERGE (prevPerson:Person {id: row.id, name: row.name}) WITH prevPerson USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:///your-data.csv' AS row SKIP 1 MERGE (currentPerson:Person {id: row.id, name: row.name}) MERGE (prevPerson)-[:FRIEND]->(currentPerson) WITH currentPerson AS prevPerson RETURN count(*)
总的来说,只要利用好WITH子句传递上下文,LOAD CSV完全能实现你需要的多行关联和前数据存储需求。
内容的提问来源于stack exchange,提问作者Sahil Chimnani
相关产品推荐
相关产品推荐

