根据节点的 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'的空属性值合并节点”