JL Peyret
JL Peyret

Reputation: 12214

find nodes with multiple parents using networkx

Let's say I have a directed graph (this is about relational tables). I want to find M:N tables to track relationships enabled thru M:N tables.

from pathlib import Path
import subprocess
import networkx as nx

def write_svg(g, name):
    temp = "temp.dot"
    suffix = "jpg"
    nx.nx_agraph.write_dot(g, temp)
    pa_img = Path(f"{name}.{suffix}")
    li_cmd = f"/opt/local/bin/dot {temp} -T {suffix} -o {pa_img}".split()
    subprocess.check_output(li_cmd)

G = nx.DiGraph()

G.add_edge("C1", "P1")
G.add_edge("C2", "P1")
G.add_edge("C21", "C2")
G.add_edge("MN12", "P1")
G.add_edge("MN12", "P2")
G.add_nodes_from([
    ("MN12", {"color" : "red"})
])

Run this, and I get:

enter image description here

So what I am considering here is that MN12 has as parents P1 and P2. So I want to consider P2 to be related to P1, with MN12 as the mapping table.

In other words, if I hard-code the relationship graph I want:

G = nx.DiGraph()

G.add_edge("C1", "P1")
G.add_edge("C2", "P1")
G.add_edge("C21", "C2")
G.add_edge("P2(using MN12)", "P1")

G.add_nodes_from([

    ("P2(using MN12)", {"color" : "green"})

])

enter image description here

Note that C21 remains a child of C2. Only MN12 is modified, because it has 2 parents.

Now, I know I can see the degree of a given node.

Going in back to my input graph:

(Pdb++) G.degree('MN12')
2
(Pdb++) G.degree('C1')
1
(Pdb++) G.degree('C2')
2
(Pdb++) G.degree('P1')
3

But how do I see that the arrows from MN12 go towards both P1 and P2? Is this even a question for networkx?

Upvotes: 1

Views: 461

Answers (1)

abc
abc

Reputation: 11949

You can use both out_edges and successors.

>>> G.out_edges("MN12")
OutEdgeDataView([('MN12', 'P1'), ('MN12', 'P2')])

>>> list(G.successors("MN12"))
['P1', 'P2']

Upvotes: 2

Related Questions