当前位置: 首页 > 知识库问答 >
问题:

在Neo4j中从csv加载节点时有条件地创建节点

江嘉悦
2023-03-14

我有一个csv格式的数据集。其中一个字段是“elem_type”。基于此类型,我需要创建不同的类型节点,并在使用csv load加载数据时,根据“elem_type”为csv的“列”赋予不同的名称,有什么方法可以做到这一点吗?

我的csv没有标头,数据如下所示:

0, 123, Marco, Ciao
1, 345, Merceds, Car, Yellow
2, 987, Boat, 150cm

基于第一个colmuns,即我的“elem_type”,我要加载数据并定义3种类型的节点(Person,Car,Boat)

共有1个答案

裘丰
2023-03-14

我强烈建议将csv文件预先解析为每个标签的单独文件。它将使密码的导入变得更加容易。下面我使用了一个小技巧,将CASE命令包装在foreach中:

load csv from "file:///test.csv" as line
foreach (i in case when line[0] = '0' then [1] else [] end | 
  merge (p:Person {id: line[1]}) set p.name = line[2] )
foreach (i in case when line[0] = '1' then [1] else [] end | 
  merge (c:Car {id: line[1]}) set c.name = line[2], c.color = line[4] )
foreach (i in case when line[0] = '2' then [1] else [] end | 
  merge (b:Boat {id: line[1]}) set b.name = line[2] )

另外,不要忘记在合并的属性上添加索引

 类似资料:
  • 我有一个csv格式的数据集。其中一个字段是类型,类似于枚举。基于此类型,我需要在使用csv LOAD加载数据时创建不同的类型、节点和关系。您可以在csv中调用具有定义子类型的属性的超级类型的行。 我真的不知道如何在Cypher中做到这一点。我唯一的选择是将一个csv文件拆分为每种类型的csv文件,并运行不同的密码吗?

  • 我希望它创建每个节点(而不是在已经存在具有相同ID的节点时创建新节点),并创建每个关系(在CSV中指定具有多个关系的节点中有多个关系from/to节点)。 实际发生的情况:它似乎创建了所有唯一的节点。它还创建了节点之间的关系,但它只为每个节点设置一个关系,而不考虑与多个其他节点进行通信的一些节点。 我很困惑,因为我的理解是,如果在数据库中还没有出现关系,它将创建关系,所以我认为它将创建CSV中指定

  • 我的代码!! 获取错误!! TypeError:无法读取B:\nodejs\newp\app中未定义的属性“name”。js:75:30在第二层。在路由的下一个(B:\nodejs\newp\node\u modules\express\lib\router\layer.js:95:5)(B:\nodejs\newp\node\u modules\express\lib\router\route.

  • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?

  • 假设我有一个包含节点信息的csv文件,每一行都有一个唯一的id(第一列),另一个包含边的csv文件(通过节点的唯一id)描述节点之间的边。下面的密码成功地加载了节点,然后创建了边。但是,我能让它更有效率吗?我的真实数据集有数百万个节点和数千万条边。显然,我应该使用定期提交并创建索引,但我是否可以以某种方式避免对每个边缘使用ing,并使用我知道要构建的每个边缘的唯一节点ID这一事实?还是我搞错了?我