如何在NEO4J中将orderitem关联记录转为节点间关系?
Neo4j导入关系返回no changes no records的排查方案
- 首先排查大小写敏感问题
Neo4j的属性名、标签名完全大小写敏感,你的代码中存在明显不一致问题:给Orders节点创建索引时用的是o.OrderID,但匹配关联时写的是o.orderID,二者完全不等。同时要确认CSV表头、节点属性的字段名大小写完全一致,包括MenuID也需要核对是否存在大小写偏差。 - 排查CSV文件正确性
- 确认三个CSV文件都放在Neo4j根目录的
import文件夹下,路径拼写没有错误 - 检查CSV表头是否存在多余空格、不可见字符:比如表头如果是
OrderID(前面带空格)、或者文件是带BOM的UTF-8编码,都会导致字段名匹配失败,建议用纯文本编辑器打开CSV核对表头 - 确认关联字段的取值格式统一:比如节点里存的
OrderID是数字类型,但CSV读出的row.orderID默认是字符串类型,类型不同会导致匹配失效
- 确认三个CSV文件都放在Neo4j根目录的
- 先验证节点是否创建成功
单独执行前两段LOAD CSV语句后,执行以下语句验证节点是否存在:
-- 查Orders节点数量和属性名 MATCH (o:Orders) RETURN count(o), keys(o) LIMIT 1 -- 查Menu节点数量和属性名 MATCH (m:Menu) RETURN count(m), keys(m) LIMIT 1
如果返回节点数为0,说明CSV导入节点步骤就失败了,需要先解决节点导入问题。
- 验证关联字段是否能匹配到节点
先单独取orderitem.csv的内容看字段取值:
LOAD CSV WITH HEADERS FROM "file:///orderitem.csv" AS row RETURN row.MenuID, row.orderID LIMIT 5
随便取一条返回的MenuID和orderID值,手动执行匹配:
-- 替换成你拿到的实际值测试 MATCH (m:Menu) WHERE m.MenuID = '你拿到的MenuID值' RETURN m MATCH (o:Orders) WHERE o.OrderID = '你拿到的orderID值' RETURN o
如果其中任意一个查询返回空,说明字段名或字段值不匹配,调整匹配条件即可,比如需要转数字的就用toInteger(row.orderID)转换类型。
- 排查索引状态
执行SHOW INDEXES确认两个关联字段的索引已经创建成功且状态为ONLINE,避免索引未生效导致匹配效率低甚至匹配失败。
内容的提问来源于stack exchange,提问作者Yuan Ren
相关产品推荐
相关产品推荐

