如何在NetworkX中查找所有节点的祖先?

时间:2019-01-24 02:45:55

标签: python dependencies networkx directed-acyclic-graphs

我有一个很大的DiGraph,由相关工作组成。例如,对于图形a> b> c,作业c仅在作业b完成后才能运行。我试图找到一个函数来获取所有c的上游作业(即(a,b))。我使用了DiGraph.predecessors,但它只返回作业b。

是否有一个功能可以列出所有c的上游作业?

如何绘制叶节点的依赖关系图(如作业c)?

我已经阅读了文档,但是找不到答案。

2 个答案:

答案 0 :(得分:0)

使用predecessors仅将具有直接边缘的节点返回到输入节点。查找所有节点的ancestors可以完成以下操作:

import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()

# G is:
#      e-->f
#      ^
#      |
# a--->b-->c-->d
#

G.add_edges_from([('a', 'b'),('b', 'c'),('c', 'd'), ('b', 'e'), ('e', 'f')])
T = nx.dfs_tree(G.reverse(), source='f').reverse()     

# T is: a-->b-->e-->f

pos = nx.nx_pydot.pydot_layout(T, prog='dot')
nx.draw_networkx(T, pos=pos, arrows= True, with_labels=True)
plt.show()

我们要做的只是在反转有向图上从输入节点运行DFS,然后再次反转结果以使边沿其原始方向。

最后三行用于绘制结果。

答案 1 :(得分:0)

这似乎很奇怪,但是这个函数叫做ancestors:)

nx.ancestors(G, your_node)