Neo4j中的节点和关系创建

Neo4j中的节点和关系创建,neo4j,Neo4j,我有一个数据集,看起来像这样 现在,我们可以看到一个人有多个skillid,除了这些数据,我还有一个skill_ref表,它有两列(skillid和skillname),所以从上图中,我可以看到最后一个人有多个技能,现在,我想把这些数据放在Neo4j中,person和skillname作为节点,和一段有技巧的关系。但我不知道如何处理多个实例,如果我拆分skillid,那么我将有多个人名实例,但这不是我想要的,我想要这样的东西 在图中,中心节点是人员的名称,其他节点有技能名称,箭头指向关系ha

我有一个数据集,看起来像这样

现在,我们可以看到一个人有多个skillid,除了这些数据,我还有一个skill_ref表,它有两列(skillid和skillname),所以从上图中,我可以看到最后一个人有多个技能,现在,我想把这些数据放在Neo4j中,person和skillname作为节点,和一段有技巧的关系。但我不知道如何处理多个实例,如果我拆分skillid,那么我将有多个人名实例,但这不是我想要的,我想要这样的东西

在图中,中心节点是人员的名称,其他节点有技能名称,箭头指向关系has_skill。 我是neo4j和cypher的新手,任何有帮助的人都会非常感激

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///people_data.csv" AS line
CREATE (p:Person{id:line.people_uid})
WITH line, p
SET p.firstName = line.first_name,p.lastname=line.last_name
WITH line,split(line.skillid,' ') as skill_ids
UNWIND skill_ids as skill_Id
MERGE (skill:Skill{id:skill_Id})
LOAD CSV WITH HEADERS FROM "file:///skills_ref.csv" AS line
WITH line
MERGE(skill:line.skillid{name:line.skillname})
CREATE (p)-[:HAS_SKILL]->(skill)

你的想法是对的

通常的方法是首先合并(或创建)
:Person节点
,然后将
skillid
拆分成技能id列表,将技能id列表展开成行,然后合并给定id的技能(并确保对
:skill(id)
有索引或唯一约束),然后合并(或创建):Person节点和:Skill之间的关系

以下是从CSV文件加载的示例:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///your.file.url" AS line
CREATE (p:Person{id:line.people_uid})
WITH line, p
SET p.firstName = line.f_name ... <same for the rest of the properties>
UNWIND split(line.skillid, ' ') as skillId
MERGE (skill:Skill{id:skillId})
CREATE (p)-[:HAS_SKILL]->(skill)
然后,您的下一个查询:

LOAD CSV WITH HEADERS FROM "file:///skills_ref.csv" AS line
MERGE (skill:Skill{id:line.skillid})
SET skill.name = line.skillname

请记住,您应该首先在:Skill(id)和:Person(id)上创建一个唯一的约束。

感谢@InverseFalcon回复我的查询,问题是我有两个不同的CSV,一个是以图像形式显示的示例,另一个是Skill_ref one(具有Skill id和名称),这两者的合并是不可能的,因为我在一个单元格中有多个用于人员数据(图像)的技能ID。请您进一步说明您的解决方案,再次感谢mate的快速建议让我解释一下行
作为skillid展开拆分(line.skillid,'')的原因。这将获取多个技能ID的字符串,并将其更改为技能ID列表。然后发出多行,列表中的每个元素一行,因此以前每个人只有一行和一个ID字符串,现在(每个人)的行数等于ID数。“合并”允许您为每个id创建一个节点(但不得为同一id创建多个节点)。稍后,您可以使用“按id合并到:Skill nodes”并添加技能名称来处理另一个CSV。您好@InverseFalcon,我尝试了您解释的内容,请在原始问题中找到已编辑的更新代码,查询不会抛出任何结果,您的指导将是非常值得赞赏的,我是新的东西,和CQL是对我有点。如果可以,请帮助我。更新我的答案,您应该为每个csv加载使用两个单独的查询。
LOAD CSV WITH HEADERS FROM "file:///skills_ref.csv" AS line
MERGE (skill:Skill{id:line.skillid})
SET skill.name = line.skillname