Neo4j LOAD CSV 使用分隔符处理 CSV 文档中的数组

Neo4j LOAD CSV process arrays in CSV documents using a separator

我正在使用 LOAD CSV 将数据从 csv 导入到 neo4j。我的数据集在 country 字段中包含多个值。目前我使用分号作为这些多个值的分隔符。

节点-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;

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

即:

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

您有两种选择 - 一种是纯 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 并提供一个正则表达式作为 'separator',我们希望用分号分割字符串,分号前面没有反斜杠转义字符:

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

我们进行了最后的整理,将转义分号替换为普通分号,以便使用该列表理解进行存储。正则表达式是从 this answer.

无耻地偷来的