从 neo4j 密码中的分隔 csv 列中分配多个属性



从csv读取,我正在创建一个带有"苏格兰威士忌"和"区域"节点的简单图形数据库。

我希望为管道分隔字段的苏格兰节点分配属性。问题是,每个字段实例不一定包含相同数量的分隔值。

对于单个字段,此处为"NOSE"(可以包含例如"FRESH"或"FRESH|海"或"新鲜|东南亚|水果'),我成功运行了以下查询:

 LOAD CSV WITH HEADERS FROM
'file:///scotch_narrow.csv' AS line
 WITH line, SPLIT(line.NOSE, '|') AS v1
 CREATE (scotch:Scotch {name: line.SCOTCH, nose: v1})
 MERGE (region:REGION {name: line.REGION, district: line.DISTRICT})
 CREATE (scotch)-[:MADE_IN]->(region)

然后,我尝试使用如下所示的相同范例一次分配多个属性:

 LOAD CSV WITH HEADERS FROM
 'file:///scotch_narrow.csv' AS line
 WITH line, SPLIT(line.NOSE, '|') AS v1
 WITH line, SPLIT(line.BODY, '|') AS v2
 WITH line, SPLIT(line.FINISH, '|') AS v3
 WITH line, SPLIT(line.PALETTE, '|') AS v4
 CREATE (scotch:Scotch {name: line.SCOTCH, nose: v1, body: v2, finish: v3, palette: v4})
 MERGE (region:REGION {name: line.REGION, district: line.DISTRICT})
 CREATE (scotch)-[:MADE_IN]->(region)

然后我得到一个错误;变量"v2"未定义:

 Variable `v2` not defined (line 4, column 115 (offset: 178))
 "WITH line, SPLIT(line.NOSE, '|'), SPLIT(line.BODY, '|'),
 SPLIT(line.FINISH, '|'), SPLIT(line.PALETTE, '|') AS v1, v2, v3, v4"

我的语法哪里出了问题?

WITH 更改作用域中的变量,

如果之前定义的变量未包含在 WITH 子句中,则该变量不再在作用域中。

您的 WITH 系列引入了新变量(您的"v"变量),但您将它们排除在下一个 WITH 之外,因此它们立即超出范围。您希望将它们包含在每个新 WITH 中,因此 v1 应包含在第二个 WITH 中,v1 和 v2 都应包含在第三个 WITH 中,依此类推。

这应该可以解决您的语法问题。

您可能还需要考虑将这些值建模为给定标签的节点(例如,具有新鲜、海洋和水果值的 :Nose 标签节点),并创建与每个 :Scotches 的关系,至少如果您计划创建基于某些特征集查找 :Scotches 的查询。如果没有,那么你现在正在做的事情应该没问题。

最新更新