从python中networkX的SQL表中获取网络边缘

从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

我试图从标准化的SQLite数据库中获取网络边缘的数量,该数据库已标准化如下:

 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除非您在paperID上有一个索引,或者更好,在paperID和authorID上都有一个索引,或者更好,a,否则这将是非常低效的。

网络不是由论文作者中的行直接定义的吗?您显示的元组列表与示例数据有何关联?@CL。不幸的是,由于networkx似乎要求定义边缘的元组的格式为edge=node,node,因此在本例中,paper=author,author,使用paper\u Authors数据的格式为edge=author,论文,除非有办法定义两种节点,然后以某种方式崩溃网络。@CL.对此进行了进一步的研究,如果我给作者和论文一个不同的前缀,并且本质上有两种不同类型的节点,一种用于论文,一种用于作者,它确实有效。非常感谢,这非常有效,大约600000行的输出只需要2秒钟,我也会看看其他的加速。非常感谢您的回答,我在思考中遇到的问题是,当我已经在选择authorID时,如何选择authorID。