Python 2.7 Python中需要相同的相对级别节点(同级)DAG算法

Python 2.7 Python中需要相同的相对级别节点(同级)DAG算法,python-2.7,ontology,directed-acyclic-graphs,Python 2.7,Ontology,Directed Acyclic Graphs,因此,我目前正在从事一个快速而肮脏的Python项目,该项目支持一个由字典组成的数据结构,其中键是来自开放生物本体格式的GOID。它散列到另一个字典,其中包含父节点或术语列表和子节点或术语列表,帮助我形成本体中给定节点的所有子节点或所有祖先的列表(使用GO.obo文件,如果有帮助的话) 我的问题是,我一直在寻找一种算法,可以帮助我返回与给定节点id相同级别上的所有相同节点,该节点id必须是相对的,因为一个节点可能有多条路径(这是一个有向无环图,但每个节点可以有多个父节点)。我基本上需要查找节点的

因此,我目前正在从事一个快速而肮脏的Python项目,该项目支持一个由字典组成的数据结构,其中键是来自开放生物本体格式的GOID。它散列到另一个字典,其中包含父节点或术语列表和子节点或术语列表,帮助我形成本体中给定节点的所有子节点或所有祖先的列表(使用GO.obo文件,如果有帮助的话)

我的问题是,我一直在寻找一种算法,可以帮助我返回与给定节点id相同级别上的所有相同节点,该节点id必须是相对的,因为一个节点可能有多条路径(这是一个有向无环图,但每个节点可以有多个父节点)。我基本上需要查找节点的父节点,将父节点的子节点全部存储在一个公共列表中,然后在添加的每个节点上重复此过程,而不重复节点或显著降低计算速度

我认为这可以很容易地通过使用集合来防止重复条目,并且只跟踪我访问过的家长,直到访问了兄弟姐妹的所有家长,而无法添加新的家长,但我怀疑这可能是非常低效的。如果有任何人有这种算法的经验,和见解将高度赞赏!希望这一点足够清楚,可以得到回应


谢谢

好了,伙计们,这就是我到目前为止所开发的,但由于一些奇怪的原因,它似乎一直给我错误的值。是否有一个小错误,任何人都可以看到我意外地没有正确终止

  # A helper function to find generations of a given node
  def getGenerationals(self,goid):
    quit = False
    visitedParents = set()
    generation = set()
    tempGen = set()
    generation.add(goid)
    while not quit:
      quit = True
      generation |= tempGen
      tempGen = set()
      print "TEMP GEN:",tempGen
      for g in generation:
        parents = set(self._terms[g]['p'])
        for p in parents:
          if p not in visitedParents:
            visitedParents.add(p)
            print "Parent:",p
            quit = False
            tempGen |= set(self._terms[p]['c'])
    raw_input("Break")
    return generation

  # Working function
  def getGeneration(self,goid):
    generation = list(self.getGenerationals(goid))
    generation.remove(goid)
    return list(generation)