我正在使用这些约束构建一个有向无环图(使用python / django) -
图形约束 -
自定义约束 -
一个节点的孩子不能成为其他孩子的后代(不允许叔叔/阿姨关系)。虽然节点可以是它的堂兄(兄弟姐妹可以和孩子一样拥有相同的节点)。
任何节点的最高级别可以是10(级别=节点与根的最短距离)。
数据库 -
表1(节点) - id,name
表2(边缘) - id,parent_id(fk), child_id(FK)
验证 - 我正在使用this django包来稍微修改一下来实现图形。这是验证部分 -
def constraints_checker(parent, child):
"""
Checks all the constraints
"""
parent_ancestors = parent.get_ancestors_set()
if parent == child:
raise ValidationError('Self links are not allowed.')
if child in parent_ancestors:
raise ValidationError('The object is an ancestor.')
# max level validation
root_nodes = parent.get_roots()
for root_node in root_nodes:
if root_node.longest_distance(parent) >= 10:
raise ValidationError('Max. 10 levels allowed.')
# uncle aunt relationship validation
# 1. parent's children's descendents != node
parent_children = parent.children.exclude(id=child.id)
for parent_child in parent_children:
if child in parent_child.get_descendants_set():
raise ValidationError('Uncle/aunt relationship not allowed.')
for ancestor in parent_ancestors:
# 2. ancestor's child != node
if child in ancestor.children.all():
raise ValidationError('Uncle/aunt relationship not allowed.')
我现在正在使用recursive functions来寻找祖先和后代。如何优化此图表以加快查询速度?
Django mptt tree存储左,右标记以便更快地进行树遍历。我们可以在此图表中使用similar的内容吗?
相关SO答案 -