问题
在一个
directed acyclic graph (DAG)
,是否总是通过反转要添加的关系来阻止由添加关系引起的循环传递关系?
例子:
-
现有关系:
A -> B
,
B -> C
通过这个传递关系
A -> C
,因此可以将其视为
A -> B -> C
-
要添加的关系:
C -> A
这会导致
A -> B -> C -> A
并且是循环的
-
想法
:反转要添加到的关系
C <- A
会导致
A -> B -> C <- A
因此仍然是非循环的
这里给出的例子当然相当简单,所以我想知道这种方法是否适用于所有场景。
背景
要对实体之间的定向关系(例如“follows”、“precess”、“parent”、“child”)建模,请
OpenProject
应用程序将其关系信息存储在
有向无环图
. 实体/节点具有日期信息,用户可以重新安排。如果用户更改日期值,则可能需要自动重新安排其他实体的日程,例如,当前置任务移到未来两天时,其后续任务也需要移动。
因为大多数关系都用于调度,而且由于这个原因,它是一个非循环图,所以循环是被阻止的。它们将导致无限的调度循环。
虽然大多数关系也有一个语义上的方向,但也有一个通用的“关系到”关系,它对用户是无向的,只是简单地表示存在某种关系。由于其性质,DAG中存在的“相关”关系的方向方面对前端的用户不可见。
当用户试图创建一个“相关”关系时,他可能会遇到错误消息警告循环关系,这对用户来说是不可理解的,因为他对关系的感知是无方向的。
对于这个问题,有两种可能的解决方案,最简单的可能是简单地反转关系,在这种情况下,DAG中的方向对于用户来说并不重要。