Raymond Kalonji
Raymond Kalonji

Reputation: 345

Django/NetworkX Eliminating Repeated Nodes

I want to use d3js to visualize the connections between the users of my Django website. I am reusing the code for the force directed graph example wich requires that each node has two attributes (ID and Name). I have created a node for each user in user_profiles_table and added an edge between already created nodes based on each row in connections_table. It does not work; networkx creates new nodes when I start working with the connection_table.

nodeindex=0
for user_profile in UserProfile.objects.all():
    sourcetostring=user_profile.full_name3()
    G.add_node(nodeindex, name=sourcetostring)
    nodeindex = nodeindex +1

for user_connection in Connection.objects.all():
    target_tostring=user_connection.target()
    source_tostring=user_connection.source()
    G.add_edge(sourcetostring, target_tostring, value=1)

data = json_graph.node_link_data(G)

result:

 {'directed': False,
 'graph': [],
 'links': [{'source': 6, 'target': 7, 'value': 1},
  {'source': 7, 'target': 8, 'value': 1},
  {'source': 7, 'target': 9, 'value': 1},
  {'source': 7, 'target': 10, 'value': 1},
  {'source': 7, 'target': 7, 'value': 1}],
 'multigraph': False,
 'nodes': [{'id': 0, 'name': u'raymondkalonji'},
  {'id': 1, 'name': u'raykaeng'},
  {'id': 2, 'name': u'raymondkalonji2'},
  {'id': 3, 'name': u'tester1cet'},
  {'id': 4, 'name': u'tester2cet'},
  {'id': 5, 'name': u'tester3cet'},
  {'id': u'tester2cet'},
  {'id': u'tester3cet'},
  {'id': u'tester1cet'},
  {'id': u'raykaeng'},
  {'id': u'raymondkalonji2'}]}

How can I eliminate the repeated nodes?

Upvotes: 1

Views: 563

Answers (1)

Loïc Séguin-C.
Loïc Séguin-C.

Reputation: 1896

You probably get repeated nodes because your user_connection.target() and user_connection.source() functions return the node name, not its id. When you call add_edge, if the endpoints do not exist in the graph, they are created, which explain why you get duplicates.

The following code should work.

for user_profile in UserProfile.objects.all():
    source = user_profile.full_name3()
    G.add_node(source, name=source)

for user_connection in Connection.objects.all():
    target = user_connection.target()
    source = user_connection.source()
    G.add_edge(source, target, value=1)

data = json_graph.node_link_data(G)

Also note that you should dump the data object to json if you want a properly formatted json string. You can do that as follows.

import json
json.dumps(data)                  # get the string representation
json.dump(data, 'somefile.json')  # write to file

Upvotes: 4

Related Questions