使用APOC将CSV导入neo4j时处理空数组类型

时间:2018-07-12 23:31:11

标签: neo4j cypher

我有一个csv文件,其中某些字段是数组类型。字段用,分隔,数组项用;分隔。例如:

index, name, friends, neighbors
0,Jim,John;Tim;Fred,Susan;Megan;Cheryl
1,Susan,Jim;John,Megan;Cheryl
2,Sean,,,

其中Jim有三个朋友JohnTimFred,还有三个邻居SusanMegan和{ {1}}和Cheryl没有朋友,也没有邻居。

但是,当我使用Sean读入neo4j时,我得到的是带有空字符串(而不是空列表)的列表属性。例如:

apoc.load.csv

给我一​​个CALL apoc.periodic.iterate(" CALL apoc.load.csv('file.csv', {header:true,sep:',', mapping:{ friends:{array:true}, neighbors:{array:true}} }) YIELD map as row RETURN row "," CREATE (p:Person) SET p = row ", {batchsize:50000, iterateList:true, parallel:true}); ,名称为Person,但分别带有Seanfriends=[ "" ]

我想要的是neighbors=[ "" ]Seanfriends=[]

谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 请确保CSV文件标题中没有多余的空格(否则某些属性名称将以空格开头):

    index,name,friends,neighbors
    0,Jim,John;Tim;Fred,Susan;Megan;Cheryl
    1,Susan,Jim;John,Megan;Cheryl
    2,Sean,,,
    
  2. 使用list comprehension来消除所有为空字符串的friendsneighbors元素:

    CALL apoc.periodic.iterate(
      "CALL apoc.load.csv(
         'file.csv',
         {
           header:true, sep:',',
           mapping: {
             friends: {array: true},
             neighbors: {array: true}
           }
         }) YIELD map
       RETURN map
      ",
      "CREATE (p:Person)
       SET p = map
       SET p.friends = [f IN p.friends WHERE f <> '']
       SET p.neighbors = [n IN p.neighbors WHERE n <> '']
      ", 
      {batchsize:50000, iterateList:true, parallel:true}
    );
    

进行上述更改后,该查询:

MATCH (person:Person) RETURN person;

返回此结果:

╒══════════════════════════════════════════════════════════════════════╕
│"person"                                                              │
╞══════════════════════════════════════════════════════════════════════╡
│{"name":"Jim","index":"0","neighbors":["Susan","Megan","Cheryl"],"frie│
│nds":["John","Tim","Fred"]}                                           │
├──────────────────────────────────────────────────────────────────────┤
│{"name":"Susan","index":"1","neighbors":["Megan","Cheryl"],"friends":[│
│"Jim","John"]}                                                        │
├──────────────────────────────────────────────────────────────────────┤
│{"name":"Sean","index":"2","neighbors":[],"friends":[]}               │
└──────────────────────────────────────────────────────────────────────┘

[已更新]

此外,如果您的CSV文件不可能包含“空”朋友或邻居子字符串(例如John;;Fred),则此查询版本使用CASE而不是列表理解会更有效:

CALL apoc.periodic.iterate(
  "CALL apoc.load.csv(
     'file.csv',
     {
       header:true, sep:',',
       mapping: {
         friends: {array: true},
         neighbors: {array: true, arraySep:';'}
       }
     }) YIELD map
   RETURN map
  ",
  "CREATE (p:Person)
     SET p = map
     SET p.friends = CASE p.friends WHEN [''] THEN [] ELSE p.friends END
     SET p.neighbors = CASE p.neighbors WHEN [''] THEN [] ELSE p.neighbors END
  ", 
  {batchsize:50000, iterateList:true, parallel:true}
);