反转有向无环图 (DAG) 中的关系以避免循环关系
Invert relation in directed acyclic graph (DAG) to avoid circular relation
问题
在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'、'precedes'、'parent'、'child'),OpenProject应用程序将其关系信息存储在 directed acyclic graph (DAG) 中。 entities/nodes 有日期信息,可以由用户重新安排。如果用户更改日期值,则可能需要自动重新安排其他实体,例如当前任转移到未来两天后,其继任者也需要转移。
因为大多数关系都用于调度,并且由于这个原因它是一个无环图,所以循环被阻止了。它们会导致无限的调度循环。
虽然从语义的角度来看,大多数关系也有方向,但也有通用的 'relates to' 关系,它对用户来说是无向的,只是传达存在某种关系。由于其性质,DAG 中存在的 'relates to' 关系的方向方面在前端对用户不可见。
当用户尝试创建 'relates to' 关系时,他目前可能 运行 进入警告循环关系的错误消息,这对用户来说是不可理解的,因为他对关系的看法是未定向。
这个问题有几个可能的解决方案,最简单的可能是在 DAG 内的方向对这种关系的用户来说无关紧要的情况下简单地反转关系。
您的解决方案似乎有效。边 C -> A
和 A -> C
不能同时导致循环。
证明:
如果添加C -> A
会导致循环,那么路径已经存在A ↝ C
。如果添加 A -> C
会导致循环,那么已经存在路径 C ↝ A
。如果以上两个都是真的,那么结合这两条路径将提供一个已经存在的循环,因此初始图将不是 DAG。
问题
在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'、'precedes'、'parent'、'child'),OpenProject应用程序将其关系信息存储在 directed acyclic graph (DAG) 中。 entities/nodes 有日期信息,可以由用户重新安排。如果用户更改日期值,则可能需要自动重新安排其他实体,例如当前任转移到未来两天后,其继任者也需要转移。
因为大多数关系都用于调度,并且由于这个原因它是一个无环图,所以循环被阻止了。它们会导致无限的调度循环。
虽然从语义的角度来看,大多数关系也有方向,但也有通用的 'relates to' 关系,它对用户来说是无向的,只是传达存在某种关系。由于其性质,DAG 中存在的 'relates to' 关系的方向方面在前端对用户不可见。
当用户尝试创建 'relates to' 关系时,他目前可能 运行 进入警告循环关系的错误消息,这对用户来说是不可理解的,因为他对关系的看法是未定向。
这个问题有几个可能的解决方案,最简单的可能是在 DAG 内的方向对这种关系的用户来说无关紧要的情况下简单地反转关系。
您的解决方案似乎有效。边 C -> A
和 A -> C
不能同时导致循环。
证明:
如果添加C -> A
会导致循环,那么路径已经存在A ↝ C
。如果添加 A -> C
会导致循环,那么已经存在路径 C ↝ A
。如果以上两个都是真的,那么结合这两条路径将提供一个已经存在的循环,因此初始图将不是 DAG。