问题描述
注意:我很抱歉不能直接在帖子中包含图片,我在 stackoverflow 中还没有足够的声誉。
我是图形数据库的新手,但我试图了解图形数据库是否适合我的问题。来了!
我有一组可以通过“父”关系相互关联的用户(即,他们可以构建到树/层次结构中)。从一个用户到另一个用户的“父”关系被称为从某个日期“开始”,并且这种关系仅在/当同一用户之间存在另一个“父”关系且日期较晚时“结束”。>
每个用户在任何特定日期都可以有 =0 个子级。即一次最多有一个父母,并且没有孩子的数量限制。
我读过处理过时关系的博文,但它们似乎没有解决这种复杂程度:
- https://maxdemarzi.com/2015/08/26/modeling-airline-flights-in-neo4j/
- https://maxdemarzi.com/2017/05/24/flight-search-with-neo4j/
我的挑战:
对于具有现有“父”关系的一组给定用户,确定是否可以“从”某个日期“开始”添加新的“父”关系,而无需在时间线中的任何位置创建循环。
为了帮助可视化示例,假设我们有四个用户 Alice、Bob、Carlos 和 David。
-----------------------------------------
| User | Date | Parent |
|-----------|---------------|-----------|
| Alice | 09/13/2012 | Bob |
| Alice | 04/01/2021 | David |
| Bob | 01/31/2020 | Carlos |
| Carlos | 02/14/2008 | David |
-----------------------------------------
这是一张(高度抽象的)图片,表示数据的当前状态(时间向右流动):
[数据的初始状态作为时间线] https://i.stack.imgur.com/qdcbL.png
因此,在此示例中,从 2012 年 9 月 13 日到 2021 年 4 月 1 日,爱丽丝将鲍勃作为父母,此时她开始将大卫作为父母。 Bob 在 2020 年 1 月 31 日之前没有父母,此时他将卡洛斯作为父母。等
我需要能够确定更新/插入是否会在“父”层次结构中在任何时间点创建一个循环。因此,例如,我希望能够确定在 2020 年 10 月 22 日将 Carlos 的父级设置为 Alice 是 INVALID ,因为这样在层次结构中就会有一个循环对于 10/22/2020 和 4/1/2021 之间的时间段(即 Alice-->Bob-->Carlos-->Alice)。为了帮助形象化:
[无效添加在时间线中创建一个循环] https://i.stack.imgur.com/xA2vv.png
但我还需要能够确定在 2021 年 10 月 22 日将 Carlos 的父项设置为 Alice 是有效,如下所示:
[时间线中没有周期的有效添加] https://i.stack.imgur.com/9u0P4.png
在数据建模方面,我首先考虑了两种不同的模型。
首先:
我尝试让我唯一的节点是“用户”,并让我的“父”关系在关系类型中包含一个日期。由于日期范围很大,而且日期本身并不提前知道,我不确定这是个好主意,但还是决定试一试。
示意图: [带有日期关系的图表] https://i.stack.imgur.com/ZuPDR.png
密码:
CREATE (n0:User {name: "Alice"})-[:P_2012_09_13]->(:User {name: "Bob"})-[:P_2020_01_31]->(:User {name: "Carlos"})-[:P_2008_02_14]->(:User {name: "David"})<-[:P_2021_04_01]-(n0)
第二:
我尝试创建“UserDay”节点来捕获日期元素,从而将关系类型的范围减少到只有两种(即,从 User 到 UserDay 的“HAS”关系为 1:1,然后是 1:1“P”从 UserDay 到 User 的关系)。
示意图: [用户天数的图表] https://i.stack.imgur.com/W60bp.png
密码:
CREATE (n8:UserDay {date: "2021-04-01"})<-[:HAS]-(:User {name: "Alice"})-[:HAS]->(:UserDay {date: "2012-09-13"})-[:P]->(:User {name: "Bob"})-[:HAS]->(:UserDay {date: "2020-01-31"})-[:P]->(:User {name: "Carlos"})-[:HAS]->(:UserDay {date: "2008-02-14"})-[:P]->(:User {name: "David"})<-[:P]-(n8)
给定源用户、目标用户和开始日期,我需要能够确定是否会在时间轴中的任何时间在层次结构中创建循环。
Carlos,Alice,10/22/2020 ----> 应该 无效
Carlos,10/22/2021 ----> 应该 有效
我一直在阅读neo4j文档和谷歌搜索,最后决定在stackoverflow上提出我的第一个问题!如果您有任何疑问或我所说的任何内容不清楚,请告诉我。
提前致谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)