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.
无耻地偷来的
我正在使用 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.
无耻地偷来的