首页 > 解决方案 > 使用 LOAD CSV 在 neo4j 中加载不同类型的节点

问题描述

我正在尝试使用 LOAD CSV 并且遇到了一些挑战......我想根据我的 csv (TYPE) 中特定列的内容创建不同类型的节点

例子:

ID,NAME,VALUE,LABEL,TYPE,KEY,GROUP,COLOR,SIZE,RECORDS,SCOPE
3,ERKRS_11CO,11CO,"Operating Concern 1122",ERKRS,ERKRS_11CO,EOI,#FF99CC,1,0,False
5,ERKRS_8500,8500,"IDES Australia and New Zealand",ERKRS,ERKRS_8500,EOI,#FF99CC,1,0,False
21,KKBER_1000,1000,"Credit control area Europe",KKBER,KKBER_1000,EOI,#336699,1,0,False
329,KOKRS_1111,1111,"1111 CONTROLLING AREA IN",KOKRS,KOKRS_1111,EOI,#CC99FF,1,0,False
330,KOKRS_1112,1112,"US COMPANY",KOKRS,KOKRS_1112,EOI,#CC99FF,1,0,False

我第一次尝试:

// Build Nodes
USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS 
FROM 'file:///mynodesfile.csv' AS line
CREATE (line.NAME:line.TYPE :ee { name: line.LABEL , color: line.COLOR, records: TOINT(line.RECORDS), scope: line.SCOPE } ) ;

这根本不起作用。然后我尝试了

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS 
FROM 'file:///mynodesfile.csv' AS line
WITH line
CASE line.TYPE
    WHEN 'ERKRS' THEN
        CREATE (e:ERKRS { ID: TOINT(line.ID) } )
    WHEN 'KKBER' THEN
        CREATE (e:KKBER { ID: TOINT(line.ID) } )    
    WHEN 'KOKRS' THEN
        CREATE (e:KOKRS { ID: TOINT(line.ID) } )    

SET e.name = line.LABEL 
    e.color = line.COLOR
    e.records = TOINT(line.RECORDS)
    e.scope = line.SCOPE )
;

也不工作....然后我写了一个python程序来生成密码子句。因为实际文件比我提供的样本大得多,所以我尝试使用 cat mynodes.cql | 通过 cypher shell 加载它。./bin/cypher-shell.bat -u yourneo4juser -p yourpassword (我使用的是Windows,所以我使用了power shell ....)

mynodes.cql 前 4 条记录....

USING PERIODIC COMMIT 500
CREATE (ROOT_EC3_800:ROOT:eoi { name: "Enterprise", records: 0, scope: "False"} )
CREATE (ERKRS_11CO:ERKRS:eoi { name: "Operating Concorn 1122", records: 0, scope: "False"} )
CREATE (ERKRS_8500:ERKRS:eoi { name: "IDES Australia and New Zealand", records: 0, scope: "False"} )

无效的输入“C”:预期的空白、注释或 LoadCSVQuery(第 2 行,第 1 列(偏移量:26))“CREATE (ROOT_EC3_800:ROOT:eoi { name:"Enterprise", records: 0, scope: "False"} ) "

然而,在 neo4j 浏览器中输入 CREATE (ROOT_EC3_800:ROOT:eoi { name: "Enterprise", records: 0, scope: "False"} ),节点被创建。

我正在非常努力地完成这项工作。任何帮助表示赞赏。

标签: neo4j

解决方案


该指令USING PERIODIC COMMIT仅适用于LOAD CSV命令,这就是您在生成的脚本上收到错误的原因。

要回答您的第一个问题,问题是在纯密码中,标签和关系类型不能是动态的。因此,如果要创建具有动态标签的节点,则必须使用 APOC ( https://neo4j-contrib.github.io/neo4j-apoc-procedures/ ),过程apoc.create.node如下:

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS 
FROM 'file:///mynodesfile.csv' AS line
CALL apoc.create.node([line.TYPE, 'eoi'], { name: line.LABEL , color: line.COLOR, records: TOINT(line.RECORDS), scope: line.SCOPE } ) ;

干杯。


推荐阅读