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