python - 来自数据库的加权边列表的图形

标签 python networkx

我有存储在数据库中的加权边列表。 我如何轻松地从中创建图形(无需将其写入文件并读取它)

这里是可复制的

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 

有没有更简单的方法来做到这一点?

最佳答案

游标是一个迭代器,它在执行 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

关于python - 来自数据库的加权边列表的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16032943/

相关文章:

python - 如何在python中的networkx中添加每条边的颜色标签

Python 3.0导入Excel文件到Access文件

python - 如何在 pyenv virtualenv 中升级 Python 版本和包?

python - 如何在 DataFrame 的每一行上添加两列的 value_counts?

python - 在 python 中计算逻辑回归

python - 检查 networkx 图是否是另一个图的子图

python - 汉字比较该返回true时返回false

java - LINQ(或 linq)是一个利基工具,还是正在成为基础工具?

python - 在python中删除句子末尾的句号

python - 在 Spring 布局+网络中更改节点的颜色