从python中networkX的SQL表中获取网络边缘
我试图从标准化的SQLite数据库中获取网络边缘的数量,该数据库已标准化如下:从python中networkX的SQL表中获取网络边缘,python,sql,sqlite,networkx,Python,Sql,Sqlite,Networkx,我试图从标准化的SQLite数据库中获取网络边缘的数量,该数据库已标准化如下: Authors Paper Paper_Authors | authorID | name | etc | paperID | title | etc | paperID | authorID | | 1 | .... | ... | 1 | ..... | ... | 1
Authors Paper Paper_Authors
| authorID | name | etc | paperID | title | etc | paperID | authorID |
| 1 | .... | ... | 1 | ..... | ... | 1 | 1 |
| 2 | .... | ... | 2 | ..... | ... | 1 | 2 |
| 3 | .... | ... | . | ..... | ... | 1 | 3 |
| 4 | .... | ... | 60,000 | ..... | ... | 2 | 1 |
| 5 | .... | ... | 2 | 4 |
| . | .... | ... | 2 | 5 |
| 120,000 | .... | ... | . | . |
| 60,000 | 120,000 |
大约有120000名作者和60000篇论文,索引表大约有250000行
我试图将其输入networkX以进行连接分析,输入节点很简单:
conn = sqlite3.connect('../input/database.sqlite')
c = conn.cursor()
g = nx.Graph()
c.execute('SELECT authorID FROM Authors;')
authors = c.fetchall()
g.add_nodes_from(authors)
我遇到的问题来自于试图确定要馈送到networkX的边,这需要连接两个节点的元组中的值,使用上面的数据作为示例
[(1,1),(1,2),(1,3),(2,3),(1,4),(1,5),(4,5)]
将描述上面的数据集
我有以下代码,虽然有效,但不雅观:
def coauthors(pID):
c.execute('SELECT authorID \
FROM Paper_Authors \
WHERE paperID IS ?;', (pID,))
out = c.fetchall()
g.add_edges_from(itertools.product(out, out))
c.execute('SELECT COUNT() FROM Papers;')
papers = c.fetchall()
for i in range(1, papers[0][0]+1):
if i % 1000 == 0:
print('On record:', str(i))
coauthors(i)
这项工作通过循环数据库中的每一篇论文,返回作者列表,迭代生成作者组合元组列表,并以零碎的方式将它们添加到网络中来实现,但需要30-45分钟:
print(nx.info(g))
Name:
Type: Graph
Number of nodes: 120670
Number of edges: 697389
Average degree: 11.5586
因此,我的问题是,是否有一种更优雅的方法来达到相同的结果,理想情况下使用paperID作为边缘标签,以便更轻松地在networkX之外的网络中导航。您可以通过自连接获得每篇论文的所有作者组合: 选择paperID, a1.authorID作为作者1, a2.authorID作为author2 来自论文作者a1 使用paperID将论文作者合并为a2 其中a1.authorID