Во-первых, вы используете MultiGraph . Он не направлен и не хранит информацию об источниках и целях (они становятся равноправными связанными узлами). Вы должны использовать DiGraphs или MultiDiGraphs для хранения информации в ориентированном графе.
NetworkX DiGraphs и MultiDiGraphs имеет функции predecessors
и successors
, которые могут быть применены к определенному узлу. Вы можете использовать их, чтобы проверить, существует ли ребро от предшественника к преемнику, и если нет, создайте его.
import networkx as nx
G = nx.DiGraph() # Not a MultiGraph! (can be MultiDiGraph)
source_nodes = ['A', 'A', 'B', 'D']
target_nodes = ['B', 'C', 'D', 'E']
for u,v in zip(source_nodes, target_nodes):
G.add_edge(u, v)
# For each node
for n in G.nodes:
# We check all predecessors and successors
for p in G.predecessors(n):
for s in G.successors(n):
# If graph has no edge from predecessor to successor
if (p, s) not in G.edges:
print(p, s) # Print, can be removed
# We add this node
G.add_edge(p, s)
Если вы хотите создать ребра не для всех узлов, а для набор узлов, вы можете заменить G.nodes:
в строке for n in G.nodes:
на данный набор узлов, например:
for n in [1, 2, 3]:
Если вы хотите создать ребра только для одного узел, вам не нужен главный l oop:
NODE_ID = 2
# We check all predecessors and successors of a node
for p in G.predecessors(NODE_ID):
for s in G.successors(NODE_ID):
# If graph has no edge from predecessor to successor
if (p, s) not in G.edges:
print(p, s) # Print, can be removed
# We add this node
G.add_edge(p, s)