2013-04-16 55 views
4

我有存儲在數據庫中的加權邊緣列表。 我怎樣才能輕鬆地創建成爲一個圖形(沒有在文件中寫它和閱讀它)來自數據庫加權邊緣列表的圖形

這裏reproductible

import sqlite3 
con = sqlite3.connect(":memory:") 

with con: 
    cur = con.cursor()  
    cur.execute("CREATE TABLE DATEN(Source TEXT, Target TEXT, Weight REAL)") 
    cur.execute("INSERT INTO DATEN VALUES('X33', 'X20', 0.014)") 
    cur.execute("INSERT INTO DATEN VALUES('X32', 'X20', 0.024)") 
    cur.execute("INSERT INTO DATEN VALUES('X23', 'X20', 0.167)") 
    cur.execute("INSERT INTO DATEN VALUES('X23', 'X32', 0.015)") 
    cur.execute("INSERT INTO DATEN VALUES('X32', 'X33', 0.003)") 
    cur.execute("INSERT INTO DATEN VALUES('X23', 'X33', 0.035)") 


cur.execute('SELECT * FROM DATEN') 
data = cur.fetchall() 

我試圖創建一個圖形失敗:

import networkx as nx 
G = nx.Graph() 
for x in data: 
    x1 = {'source': data[0][0], 'target': data[0][1], 'weight': data[0][2]} 
    print x1 

    G.add_edge(x1) # THIS IS NOT WORKING 

有沒有更簡單的方法來做到這一點?

回答

5

遊標是一個迭代器,它在SELECT語句執行後產生行。例如,而不是獲取所有結果到一個列表與

rows = cur.fetchall() 

您可以通過行與

for row in cur: 

但是迭代,因爲NetworkX add_weighted_edges_from方法接受一個迭代器,你可以直接通過cur

G.add_weighted_edges_from(cur) 

這是多態性的一個很好的例子。 NetworkX的設計者不需要做任何特別的事情,甚至不需要預期sqlite3遊標可能會作爲參數傳遞,他們只需要假設第一個參數是一個迭代器即可編寫代碼。


import networkx as nx 
import sqlite3 
import matplotlib.pyplot as plt 

with sqlite3.connect(":memory:") as con: 
    cur = con.cursor()  
    cur.execute("CREATE TABLE DATEN(Source TEXT, Target TEXT, Weight REAL)") 
    cur.execute("INSERT INTO DATEN VALUES('X33', 'X20', 0.014)") 
    cur.execute("INSERT INTO DATEN VALUES('X32', 'X20', 0.024)") 
    cur.execute("INSERT INTO DATEN VALUES('X23', 'X20', 0.167)") 
    cur.execute("INSERT INTO DATEN VALUES('X23', 'X32', 0.015)") 
    cur.execute("INSERT INTO DATEN VALUES('X32', 'X33', 0.003)") 
    cur.execute("INSERT INTO DATEN VALUES('X23', 'X33', 0.035)") 

    G = nx.Graph() 
    cur.execute('SELECT Source, Target, Weight FROM DATEN') 
    G.add_weighted_edges_from(cur)  

nx.draw(G) 
plt.show() 

enter image description here

+0

謝謝!我沒有意識到edges_from可以將光標作爲參數。 – user1043144

0

Graph.add_edge()不需要字典作爲參數,它至少需要兩個節點和可選的關鍵字參數。試試這個:

import networkx as nx 
G = nx.Graph() 
for x in data: 
    G.add_edge(x[0], x[1], weight=x[2]) 
+0

感謝你和所有誰回答 – user1043144