【问题标题】:Read CSV to Neo4j creating one node per column and relations将 CSV 读取到 Neo4j,每列和关系创建一个节点
【发布时间】:2020-03-15 09:28:37
【问题描述】:

我卡在 Neo4j 中的命令中(我是一个新手)来创建一个基于 CSV 的数据库,如下所示:

国家,姓名1,姓名2,姓名3,影响
法国,约翰,皮特,乔希,2
意大利,皮特,贝佩,胡安,3
美国,乔什,胡安,皮特,1
西班牙,胡安,约翰,,2

当我尝试为每个人创建一个节点(NameX)设置名称列之间的关系添加影响和国家的标签时,它失败了,因为有空名称。

如何做到这一点?

谢谢

更新:

LOAD CSV WITH HEADERS FROM 'file:///diag.csv' AS row FIELDTERMINATOR ';' 
MERGE (c:Country{name:row.Country})
WITH CASE row.name1 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name1] END as 
name1List ,c
WITH CASE row.name2 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name2] END as 
name2List ,c
WITH CASE row.name3 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name3] END as 
name3List ,c
FOREACH (x IN name1List | MERGE (n:Node{name : x} ) 
  MERGE (n)-[:REL_TYPE]->(c)
)
FOREACH (x IN name2List | MERGE (n:Node{name : x} ) 
  MERGE (n)-[:REL_TYPE]->(c)
)
FOREACH (x IN name3List | MERGE (n:Node{name : x} ) 
  MERGE (n)-[:REL_TYPE]->(c)
)
RETURN  SUM(1) 

得到错误:

变量 row 未定义(第 4 行,第 11 列(偏移量:209)) "WITH CASE row.name2 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name2] END as >name2List ,c"

【问题讨论】:

  • 如果您可以共享图结构,我可以编写完整的查询。但是现在,我添加了可以用来解决此类问题的技巧
  • 感谢@TheTeacher,我使用初始命令 LOAD CSV WITH HEADERS FROM 'file:///diag.cs​​v' AS row FIELDTERMINATOR ';' 尝试了您的解决方案,但问题是三个中的任何一个名称字段可能为空,不仅是 Name3,因此我收到此错误:Cannot merge node using null property value for name
  • 您必须在所有字段上应用案例或共享您的图表结构,如我之前所说,。
  • 我按照发布的更新代码所示进行了尝试,但仍然收到有关变量“行”的错误。有什么想法吗?
  • 嘿,更新了我对您的查询的回答..您需要在 WITH 运算符中传递行

标签: csv neo4j


【解决方案1】:

最后一行的 Name3 字段为空。尝试将 Name3 添加到数据集中的最后一行。

Spain,Juan,John, {empty - fill this},2

【讨论】:

  • 但是数据带有那些空字段,我需要在 Name3 字段中使用一些空值来处理它。
  • 用“N/A”之类的常量替换空值。
【解决方案2】:
LOAD CSV WITH HEADERS FROM 'file:///diag.csv' AS row FIELDTERMINATOR ';' MERGE (c:Country{name:row.Country}) 
WITH CASE row.name1 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name1] END as name1List ,
CASE row.name2 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name2] END as name2List ,
CASE row.name3 WHEN NULL THEN [] WHEN '' THEN [] ELSE [row.name3] END as name3List ,c,row
FOREACH (x IN name1List | MERGE (n:Node{name : x} ) MERGE (n)-[:REL_TYPE]->(c) )
FOREACH (x IN name2List | MERGE (n:Node{name : x} ) MERGE (n)-[:REL_TYPE]->(c) ) 
FOREACH (x IN name3List | MERGE (n:Node{name : x} ) MERGE (n)-[:REL_TYPE]->(c) ) RETURN SUM(1)  

在这里,借助 cypher 的 'case' 表达式,我们创建空列表(当其为 null 或为空时)或具有一个值的列表,即 (row.name3) 。在案例检查之后,我们可以使用此列表进行迭代并创建具有属性 name3 的节点。所以,当它为 null 或为空时,你迭代零次,所以你不会得到错误。 最后, sum(1) 会给你处理的行数。所以,你可以交叉检查你是否处理了 csv 文件中的所有行

【讨论】:

  • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
  • 是的,当然。感谢您的反馈
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多