管理图形数据库中层次结构的历史

Managing history of a hierarchy in a graph database

我一直在阅读图形数据库,尤其是 neo4j。我一直在考虑一个项目,其中将使用节点表示人员的层次结构,这似乎是理想的建模选择。

但有一个警告,那就是保留历史。很明显,如果我为某人工作,我的节点与层次结构中的另一个节点相关(如 'works for')。如果我不再为那个人工作并更换经理怎么办?

很明显,现有关系可以被破坏并为新经理创建一个新关系,但如果是这种情况,那么我将始终拥有一个带有视图的实时层次结构 'as it stands now' .

某人如何建模必须以某种方式保留历史,从一个日期到另一个日期,我为某人工作,而从某个日期开始,我为其他人工作?

非常感谢您的帮助!

假设一个人一次只有一份工作,这个数据模型可能适合你。

(p:Person {id:123})-[:HISTORY]->
  (curr:Job {start: 999})-[:PRIOR_JOB]->
  (j1:Job {start: 888, end: 995})-[:PRIOR_JOB]->
  (j2:Job {start: 555, end: 888})-[:PRIOR_JOB]->
  (j3:Job {start: 123, end: 532})

(j1)-[:MANAGED_BY]->(:Person {id: 15})
(j2)-[:MANAGED_BY]->(:Person {id: 22})
(j3)-[:MANAGED_BY]->(:Person {id: 79})

p 开始为新经理工作时,您只需要 "insert" 一个新的 Job 节点(连接到新经理)到 his/her历史链表:

MATCH (p:Person { id: { emp_id }})
OPTIONAL MATCH (p)-[oldHist:History]->(j1:Job)
WITH p, oldHist, COLLECT(j1) AS oldJob
CREATE (p)-[:HISTORY]->(j2:Job {start: { start_date }})-[:MANAGED_BY]->(m:Person { id: { mgr_id }})
FOREACH (j IN oldJob | 
         DELETE oldHist
         CREATE (j2)-[:PRIOR_JOB]->(j))

此查询使用 OPTIONAL MATCH 查找历史列表的开头,因为如果这是此人的第一份工作,它可能不存在。同样,它使用 FOREACH 技巧仅尝试修复历史列表(如果它之前存在)。

我假设 emp_idstart_datemgr_id 作为参数提供。我还假设 j1.end 属性 是在先前的查询中设置的(但也可以修改此查询的 FOREACH 来设置它)。