根据节点的 id 将节点从 CSV 加载到 Neo4j 中?

Posted

技术标签:

【中文标题】根据节点的 id 将节点从 CSV 加载到 Neo4j 中?【英文标题】:Load nodes into Neo4j from CSV according to their id? 【发布时间】:2021-12-18 16:37:55 【问题描述】:

我有以下 CSV:

id  attr   value
1   abc    1.1    
1   eww    -9.4  
1   ssv    likj
2   we2    1 
2   eww   900  
3   kuku   -91  
3   lulu   383
3   ssv    bubu 

我想创建 3 个节点,包括:

Node 1: id:1, abc: 1.1, eww: -9.4, ssv: "likj"
Node 2: id:2, we2: 1, eww: 900
Node 3: id:3, kuku: -91, lulu: 383, ssv: "bubu"

如何在 Neo4j 密码中构建它?

【问题讨论】:

【参考方案1】:

我假设你已经找到了 documentation about LOAD CSV ,所以我会跳过它。并且我假设节点将有一个 MyThing 标签,并且 id 是一个属性,所以不是内部 Neo4j id。

在导入之前,创建一个约束:

CREATE CONSTRAINT ON (n:MyLabel) ASSERT n.id IS UNIQUE

您可能还想安装 apoc 插件,因为它有很多非常好的功能,适用于这种情况。

然后,像这样:

LOAD CSV ..  AS line

WITH line.id AS id, 
     COLLECT([line.attr,line.value]) AS keyValuePairs
WITH id,
     apoc.map.fromPairs(keyValuePairs) AS map

MERGE (n:MyLabel id:id)
SET n += map

【讨论】:

当你说with line.id as id, ... collect时,是不是意思是“groupby”按id然后收集? @graphileon 是的。这就是 cypher 中聚合函数的工作原理。 请注意。您的策略没有错,但 id 也指的是 Neo4j 的内部节点标识符和您无法控制的关系。您确实以独特的方式调用它以避免出现问题。尽管如此,我还是使用了明确的 id,例如 place_id。 我不认为有歧义。内部 id 被称为 id(n) ,而不是 n.id 我同意你的观点,你不应该使用内部 id 与其他系统进行通信。 不幸的是,它对我不起作用,我确实得到了节点,但我拥有的唯一属性是 id,它不是我需要的 id @graphileon

以上是关于根据节点的 id 将节点从 CSV 加载到 Neo4j 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从neo4j中的csv文件中导入相同标签的节点之间的关系?

正在加载CSV Neo4j“ Neo.ClientError.Statement.SemanticError:无法使用Test1'的空属性值合并节点”

neo4j-import导入csv文件

Neo4j 永远加载

在某些情况下无法从neo4j中检索id

使用Cypher创建与现有节点的多个关系