Cypher加载CSV时自动跳过不存在文件的实现方法问询
解决方案:自动跳过不存在的CSV文件
当然可以实现!Cypher原生的LOAD CSV遇到不存在的文件会直接抛出错误,但结合APOC插件的文件操作函数,我们可以优雅地过滤掉不存在的文件路径,无需硬编码或者提前创建空文件。
核心思路
- 生成所有可能的集群文件路径
- 用APOC的文件存在检查函数过滤掉不存在的路径
- 仅对存在的文件执行
LOAD CSV操作
具体实现示例
假设你已经有集群名称的来源(比如数据库中的Cluster节点,或者固定的集群列表),可以用以下Cypher语句:
从数据库节点获取集群名称的场景
// 1. 获取所有集群名称 MATCH (c:Cluster) WITH c.name AS cluster // 2. 生成对应的CSV文件路径 WITH cluster, apoc.text.join(['file:///my/cluster/', cluster, '/databases.csv'], '') AS filePath // 3. 过滤掉不存在的文件 WHERE apoc.file.exists(filePath) // 4. 加载存在的CSV文件并处理数据 LOAD CSV WITH HEADERS FROM filePath AS line // 这里替换成你的业务逻辑,比如创建节点/关系 MERGE (db:Database {name: line.dbName}) MERGE (clusterNode:Cluster {name: cluster}) MERGE (clusterNode)-[:HAS_DATABASE]->(db)
固定集群列表的场景
如果你的集群名称是固定的,可以用UNWIND直接传入列表:
// 替换成你的实际集群名称列表 UNWIND ['cluster-a', 'cluster-b', 'cluster-c'] AS cluster WITH cluster, apoc.text.join(['file:///my/cluster/', cluster, '/databases.csv'], '') AS filePath WHERE apoc.file.exists(filePath) LOAD CSV WITH HEADERS FROM filePath AS line // 后续数据处理逻辑...
注意事项
- 确保你的Neo4j实例已经安装并启用了APOC插件(大部分官方发行版默认包含,但需要在
neo4j.conf中启用)。 apoc.file.exists()函数支持file://协议的路径,和LOAD CSV的路径格式一致,无需额外转换。
备选方案(如果无法使用APOC)
如果因为权限限制或其他原因无法使用APOC插件,你才需要考虑提前创建对应文件夹和空文件的方案——这种方案虽然可行,但需要额外的脚本或手动操作,不如APOC的方法灵活高效。
内容的提问来源于stack exchange,提问作者Joao Villa-Lobos
相关产品推荐
相关产品推荐

