如何在Neo4j中使用Cypher查询处理含分段分隔符的拼接CSV文件
Neo4j处理带自定义分段分隔符的拼接CSV方案
Neo4j内置的LOAD CSV没有提供直接按自定义分隔符拆分分段CSV的配置项,但可以通过两类方法实现分段独立处理的需求:
- 预处理拆分文件(推荐方案,性能最优)
导入前先通过命令行工具、简单脚本把原始拼接文件按--------分隔符切分成多个独立的标准CSV文件,之后就可以分别写独立的Cypher查询,用常规LOAD CSV逻辑处理每个分段文件即可。这种方案没有额外的Cypher层计算开销,导入速度最快,也不会出现字段解析错位的问题,是生产环境最常用的处理方式。 - Cypher层读入后分段过滤(无需提前拆分文件)
如果不想提前修改原始文件,可以先把整个文件按单行文本形式读入,定位到分隔符所在的行号后,按行号区间筛选出对应分段的数据再分别处理。如果要写两个完全独立的查询,可以先执行一次查询定位分隔符行号作为参数,再分别传入两个处理查询即可。
定位分隔符行号的参考Cypher:
拿到分隔符行号后,就可以在两个独立查询里分别处理对应分段,比如处理第一段人员数据的查询:LOAD CSV FROM 'file:///your_combined.csv' AS row WITH linenumber() AS lineNum, row[0] AS lineContent WHERE lineContent = '--------' RETURN lineNum AS splitPosition
处理第二段父子关系数据的查询逻辑同理,筛选行号大于// 传入上一步查到的splitPosition参数,示例中分隔符在第4行 :param splitPosition => 4 LOAD CSV FROM 'file:///your_combined.csv' AS row WITH linenumber() AS lineNum, row // 跳过首行表头、分隔符行、第二段所有行 WHERE lineNum > 1 AND lineNum < $splitPosition MERGE (p:Person {name: row[0], age: toInteger(row[1])})splitPosition + 1(跳过第二段的表头行)的行做关系创建即可。
注意:如果你的CSV字段本身包含换行、逗号这类特殊字符,不推荐用Cypher层分段的方案,这类特殊字符会导致行号计算、字段拆分出错,优先选择预处理拆分文件的方案。
内容的提问来源于stack exchange,提问作者Mehmet Berk Cetin
相关产品推荐
相关产品推荐

