我一直在阅读图形数据库,尤其是neo4j。我一直在考虑一个项目,其中人们的层次结构将使用节点来表示,这似乎是理想的建模选择。
但有一点需要注意,那就是保持历史。很明显,如果我为某人工作,我的节点就会与层次结构中的另一个节点相关(例如'适用于')。如果我不再为那个人工作并改变经理怎么办?
很明显,现有的关系可以被销毁,并且新的管理层可以创建一个新的关系,但如果是这种情况,那么我总是会有一个实时的层次结构,其中包含一个视图'现在&#39 ;.有人会如何模仿历史,从一个日期到另一个日期,我为某人工作,从某个日期起我为别人工作?
非常感谢你的帮助!
答案 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_id
,start_date
和mgr_id
作为参数提供。我还假设j1.end
属性是在先前的查询中设置的(但是可以修改此查询的FOREACH
以设置它)。