Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有向无环图中的高效查询_Python_Django_Data Structures_Directed Acyclic Graphs - Fatal编程技术网

Python 有向无环图中的高效查询

Python 有向无环图中的高效查询,python,django,data-structures,directed-acyclic-graphs,Python,Django,Data Structures,Directed Acyclic Graphs,我正在用这些约束构建一个有向无环图(使用python/django)- 图形约束- 不允许自链接(父项==子项) 节点不能是它的祖先 自定义约束- 节点的子节点不能是其其他子节点的后代(不允许存在叔叔/婶婶关系)。虽然节点可以是它的表亲(兄弟节点可以和子节点具有相同的节点) 任何节点的最大级别可以是10(级别=节点到根的最短距离) 数据库- 表1(节点)-id、名称 表2(边缘)-标识,父标识(fk), 儿童身份证(fk) 验证- 我正在使用django包来实现这个图,只需稍加修改。这是验证部分

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

图形约束-

  • 不允许自链接(父项==子项)
  • 节点不能是它的祖先
  • 自定义约束-

  • 节点的子节点不能是其其他子节点的后代(不允许存在叔叔/婶婶关系)。虽然节点可以是它的表亲(兄弟节点可以和子节点具有相同的节点)

  • 任何节点的最大级别可以是10(级别=节点到根的最短距离)

  • 数据库-

  • 表1(节点)-id、名称

  • 表2(边缘)-标识,父标识(fk), 儿童身份证(fk)

  • 验证- 我正在使用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.')
    
    我现在用的是寻找祖先和后代。如何优化此图以实现更快的查询

    存储左、右标志,以便更快地遍历树。我们能用点什么来画这张图吗

    相关,因此回答-


    有一些有趣的复杂情况,因为这是在DAG中,例如,一对节点可以有超过1个LCA,并且节点可以是叔叔/侄子(从一个祖先的角度来看),也可以是兄弟姐妹(从另一个祖先的角度来看)。这合法吗?如果是的话,你可以通过为这对冒犯的叔叔添加一个共同的父母来使他们“合法化”。@harold有点困惑。我现在编辑了这个问题。自定义约束的第1点涉及叔叔/婶婶关系。我想优化查询。