Neo4j导入CSV时节点属性无值问题求助
解决Cypher导入CSV创建节点后属性无值的问题
问题场景
尝试用以下Cypher语句从Badges.csv导入数据创建Badges节点:
// BadgesNode LOAD CSV WITH HEADERS FROM 'file:///Badges.csv' AS row CREATE (:Badges { classid: toInteger(row.Class), name: row.Name, badgeId: toInteger(row.Id) }) WITH * LIMIT 1 RETURN classid, name, badgeId;
执行后返回的classid、name、badgeId无值,但执行LOAD CSV WITH HEADERS FROM 'file:///Badges.csv' AS row RETURN row能得到正确的CSV数据,示例如下:
{ "Name": "Informed", "Date": "2014-05-13 23:06", "Class": "3", "Id": "1", "UserId": "1", "TagBased": "FALSE" }
问题原因
核心问题是返回的变量未与创建的节点属性绑定:
- 原语句中
CREATE子句仅创建节点,但未将节点赋值给查询上下文的变量; - 后续
RETURN的classid、name、badgeId并非有效变量,它们只是节点的属性名,无法直接被查询识别; WITH *仅传递row变量,无法直接提取节点属性作为独立变量返回。
解决方案
需要将创建的节点绑定到变量,或提前转换CSV字段为变量,再返回对应值。以下是两种可行写法:
写法1:绑定节点变量,返回节点属性
LOAD CSV WITH HEADERS FROM 'file:///Badges.csv' AS row CREATE (b:Badges { classid: toInteger(row.Class), name: row.Name, badgeId: toInteger(row.Id) }) WITH b LIMIT 1 RETURN b.classid, b.name, b.badgeId;
写法2:提前转换CSV字段为变量,验证后创建节点
如果需要先验证转换后的数据再创建节点,可先将CSV字段转换为变量:
LOAD CSV WITH HEADERS FROM 'file:///Badges.csv' AS row WITH toInteger(row.Class) AS classid, row.Name AS name, toInteger(row.Id) AS badgeId CREATE (:Badges {classid: classid, name: name, badgeId: badgeId}) LIMIT 1 RETURN classid, name, badgeId;
验证方式
执行修改后的语句后,可通过以下语句确认节点是否被正确创建并赋值:
MATCH (b:Badges) RETURN b LIMIT 1;
内容的提问来源于stack exchange,提问作者mahsa tajik
相关产品推荐
相关产品推荐

