Search code examples
pythonattributesnodesnetworkxedges

NetworkX: add edges to graph from node attributes


My nodes have a list of attibutes that is seperated by commas, i wanted networkx to compare them and if they match, create an edge between the nodes.

That is as for as i got, but it's not working, any ideas on how to improve my approach?

for node in G.nodes():
     while len(G.node[n]['attr']) = (G.node[n+1]['attr']):
         # compare attributes?
         valid_target_found = False
             while not valid_target_found:
                 target = random.randint(0,N-1)
                 # pick a random node
                 if (not target in G.node[n]['attr'])
                      and len(G.node[n]['attr']) = (G.node[n+1]['attr']):
                      valid_target_found = True
             G.add_edge(node, target)

one or more of the arguments can match, but only one is needed to create an edge


Solution

  • assuming you have a undirected graph, this could be used

    import networkx as nx
    
    G = nx.Graph()
    G.add_node('a', {'k': 1, 'b': 2})
    G.add_node('b', {'x': 1, 'z': 2})
    G.add_node('c', {'y': 1, 'x': 2})
    
    for node_r, attributes in G.nodes(data=True):
        key_set = set(attributes.keys())
        G.add_edges_from([(node_r, node) for node, attributes in G.nodes(data=True)
                          if key_set.intersection(set(attributes.keys()))
                          and node != node_r])
    
    print(G.edges())