使用Cypher创建分层结构

时间:2018-04-28 19:25:40

标签: neo4j cypher relationship hierarchical

我是Neo4j的新手,我一整天都遇到了一个简单的问题。它应该是一个非常简单的修复,但我无法正确解决! 我试图模拟公司的层级结构(从CEO到实习生)。我有一个带有Employee_ID号码及其职位的cvs文件。在同一个文件中,我有另一列,其中包含Employees经理的ID号。所以在每一行中我有3个单元格:员工的ID,职称,员工经理的ID,我有30行(现在)。

(例如:员工John的ID旁边有员工Sam的ID,因为Sam是John的经理.Sam也出现在Employee专栏中,他的ID号旁边有Mark的ID,因为Mark是Sam的经理......等等)

它似乎非常类似于经典示例Actor- [ACTED_IN] - > Movie,但在这种情况下我没有30个actor节点和30个电影节点,而且我不确定如何建立30个关系之间的关系相同的30个节点。

每当我尝试创建WORKS_UNDER关系时,我最终都会创建新节点,而我无法让Neo4j意识到关系右侧的节点已经在图中。

我确信这是一个简单的问题,但正如我所说,我是Neo4j的新手,我真的可以使用这个帮助!

更新:我设法通过在Employees节点中添加经理的ID作为属性来使其工作。

从“file:///Personnel.csv”中加载带有标题的CSV AS行FIELDTERMINATOR';'

MERGE(person:Person {employee_ID:row.ID,job_title:row.Jobtitle,manager_ID:row.ManagerID})

WITH *

匹配(第1页:人)

比赛(第2页:人)

WHERE p2.employee_ID = p1.manager_ID

MERGE(p1) - [r:WORKS_UNDER] - (p2)

我确信必须有一种方法可以做到这一点,不要求我将经理的ID添加为属性,但我无法弄清楚:(

2 个答案:

答案 0 :(得分:1)

如果您以新的意外节点结束,那么您很可能会在整个模式上使用MERGE,而不是先在每个节点上合并,然后再合并它们之间的关系。

MERGE就像一个MATCH,然后是CREATE(如果匹配没有成功)。将创建未绑定的模式的任何元素。

这是关于更好understanding how MERGE works的知识库文章。

答案 1 :(得分:0)

确保您已在商家ID

上创建约束
 CREATE CONSTRAINT ON (n:<LabelName>) ASSERT n.<propertyKey> IS UNIQUE