2013-03-11 67 views
1

我想使用d3js來顯示我的Django網站用戶之間的連接。 我正在重複使用代碼the force directed graph示例,要求每個節點都有兩個屬性(ID和名稱)。我已經爲user_profiles_table中的每個用戶創建了一個節點,並基於connections_table中的每一行在已創建的節點之間添加了一條邊。這是行不通的;當我開始使用connection_table時,networkx會創建新節點。Django/NetworkX消除重複節點

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) 

結果:

{'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'}]} 

我怎樣才能消除重複的節點?

回答

3

您可能會重複節點,因爲您的user_connection.target()user_connection.source()函數會返回節點名稱,而不是其ID。當您撥打add_edge時,如果圖中不存在端點,則會創建端點,這就解釋了爲什麼會出現重複。

下面的代碼應該可以工作。

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) 

還要注意的是,如果你想有一個正確格式的JSON字符串你應該轉儲data對象爲JSON。你可以這樣做,如下所示。

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