Я предполагаю, что в восходящем / нисходящем направлении это ориентированный граф, и вы имеете в виду входящие / исходящие ребра и их родителей / детей? Вы можете использовать поиск по ширине первого дерева (bfs_tree
).
См .: https://networkx.github.io/documentation/stable/reference/algorithms/traversal.html
Пример:
g = nx.DiGraph()
g.add_edges_from([
(7,6),
(6,2),
(6,1),
(1,2),
(2,4),
(2,3),
(3,4),
(4,8),
(4,9),
(3,5)
])
upstream = [n for n in nx.traversal.bfs_tree(g, 2, reverse=True) if n != 2]
downstream = [n for n in nx.traversal.bfs_tree(g, 2) if n != 2]
Но если я ошибаюсь, вам нужно уточнить, что вы имеете в виду под апстримом / downstream, потому что график, который вы показали, выглядит ненаправленным.