有向无环图

时间:2017-04-01 14:49:01

标签: python django data-structures directed-acyclic-graphs

我正在使用这些约束构建一个有向无环图(使用python / django) -

图形约束 -

  1. 不允许自我链接(Parent == Child)。
  2. 节点不能成为它的祖先。
  3. 自定义约束 -

    1. 一个节点的孩子不能成为其他孩子的后代(不允许叔叔/阿姨关系)。虽然节点可以是它的堂兄(兄弟姐妹可以和孩子一样拥有相同的节点)。

    2. 任何节点的最高级别可以是10(级别=节点与根的最短距离)。

    3. 数据库 -

      1. 表1(节点) - id,name

      2. 表2(边缘) - id,parent_id(fk), child_id(FK)

      3. 验证 - 我正在使用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答案 -

0 个答案:

没有答案