Neo4j中的节点和关系创建

时间:2018-02-14 11:50:09

标签: neo4j

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

现在,正如人们可以看到一个人有多个技能,以及这些数据,我还有一个skill_ref表,它有2列(技能和技能名称),所以从上面的图像,我可以看,并说最后一个人有多种技能,现在,我希望将这些数据放在Neo4j中,其中person和skillname作为节点,以及has_skill的关系。但我不知道如何处理多个实例,如果我拆分技能,那么我将有多个人名实例,但这不是我想要的,我想要这样的东西 Graph Visualization

图中的

,中心节点是人的名字,其他人具有技能名称,箭头指向关系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)

1 个答案:

答案 0 :(得分:1)

你有正确的想法。

一般方法是首先MERGE(或创建):Person node,然后将skillid拆分()到技能ID列表中,将技能ID列表UNWIND到行中,然后合并技能对于给定的id(并确保在:Skill(id)上有一个索引或唯一约束),然后MERGE(或CREATE):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)

修改

关于您正在尝试的修订查询,实际上最好对每个csv加载使用单独的查询,使用第一个创建节点并合并关系,第二个只是匹配/合并到技能并添加技能名:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///people_data.csv" AS line
CREATE (p:Person{id:line.people_uid})
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})
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)。