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

时间:2016-03-12 17:44:00

标签: neo4j graph-databases

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

但有一点需要注意,那就是保持历史。很明显,如果我为某人工作,我的节点就会与层次结构中的另一个节点相关(例如'适用于')。如果我不再为那个人工作并改变经理怎么办?

很明显,现有的关系可以被销毁,并且新的管理层可以创建一个新的关系,但如果是这种情况,那么我总是会有一个实时的层次结构,其中包含一个视图'现在&#39 ;.

有人会如何模仿历史,从一个日期到另一个日期,我为某人工作,从某个日期起我为别人工作?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

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

(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开始为新经理工作时,您只需要将新的Job节点(连接到新经理)“插入”到他/她的历史链接列表的前面:

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以设置它)。