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

Neo4j 管理图形数据库中层次结构的历史记录,neo4j,graph-databases,Neo4j,Graph Databases,我一直在阅读图形数据库,尤其是neo4j。我一直在考虑一个项目,在这个项目中,人们的层次结构将使用节点来表示,这似乎是理想的建模选择 但有一个警告,那就是保持历史。显然,如果我为某人工作,我的节点与层次结构中的另一个节点的关系就像“为”工作一样。如果我不再为那个人工作,换了经理怎么办 很明显,现有的关系可能会被破坏,并为新的经理创建一个新的关系,但如果是这样的话,那么我将始终拥有一个实时层次结构,其中包含“目前的情况”视图 一个人会如何塑造一段历史,从一个日期到另一个日期,我为某人工作,从某个日

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

但有一个警告,那就是保持历史。显然,如果我为某人工作,我的节点与层次结构中的另一个节点的关系就像“为”工作一样。如果我不再为那个人工作,换了经理怎么办

很明显,现有的关系可能会被破坏,并为新的经理创建一个新的关系,但如果是这样的话,那么我将始终拥有一个实时层次结构,其中包含“目前的情况”视图

一个人会如何塑造一段历史,从一个日期到另一个日期,我为某人工作,从某个日期到另一个日期,我为另一个人工作


非常感谢你的帮助

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

(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开始为新经理工作时,您只需将连接到新经理的新作业节点插入到其历史链接列表的前面:

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))
此查询使用可选匹配来查找历史记录列表的开头,因为如果这是此人的第一份工作,则该列表可能不存在。类似地,它使用FOREACH技巧仅尝试修复历史记录列表(如果它以前存在)


我假设emp_id、start_date和mgr_id作为参数提供。我还假设j1.end属性是在以前的查询中设置的,但是可以修改此查询的FOREACH来设置它。

感谢您的帮助@cybersam