首页 > 解决方案 > Neo4j 使用分隔符在 CSV 文档中加载 CSV 处理数组

问题描述

我正在使用从toLOAD CSV导入数据。我的数据集在该字段中包含多个值。目前我使用分号作为这些多个值的分隔符。csvneo4jcountry

节点-person.csv

id,country
http://author,country1;country2;country3

这是我用来将数据导入的密码查询neo4j

LOAD CSV WITH HEADERS FROM "file:///nodes-person.csv" AS csvLine
  MERGE (p:`person` {id: csvLine.id})
    ON CREATE
    SET
    p.country = split(csvLine.country,";")

    ON MATCH
    SET
    p.country = split(csvLine.country,";")

RETURN p;

我的问题是,如果值包含分隔符,如何正确拆分值。

IE:

country\\;1 ; country\\;2 ; country\\;3

标签: csvneo4jcyphergraph-databasesload-csv

解决方案


你有几个选择 - 一个是纯 Cypher 并且略显凌乱,另一个是使用 APOC 和正则表达式。我假设如果分号出现在国家名称中,它会用一个反斜杠转义。

密码路线

这里的计划是做三个替换:

  • 用一些不太可能显示为国家名称的字符串替换转义分号的实例(例如,__SEMICOLON__
  • 到目前为止,用分号分割字符串
  • 在拆分产生的每个字符串中,__SEMICOLON__用分号字符替换实例

像下面这样的东西会起作用(WITH只是它可以单独运行):

WITH 'country1\\;;country2;country3\\;' as countries
RETURN [x in split(replace(countries, '\\;', '__SEMICOLON__'), ';') | replace(x, '__SEMICOLON__', ';')]

在此处输入图像描述

APOC 和正则表达式

一种更简洁的方法是使用apoc.text.replace并提供正则表达式作为“分隔符”,我们希望用分号分隔字符串,而分号前面没有反斜杠转义字符:

WITH 'country1\\;;country2;country3\\;' as countries
RETURN [x in apoc.text.split(countries, '(?<!\\\\);') | replace(x, '\\;', ';')]

在此处输入图像描述

我们进行最后的整理,用普通分号替换转义的分号,以便使用该列表理解进行存储。正则表达式从这个答案中被无耻地窃取了。


推荐阅读