建立数以百万计的多对多关系

ric*_*hie 5 python sqlite data-structures

我在python sqlite3数据库中有以下信息,该数据库有大约400万条记录.

Term         No of articles      Article Ids
Obama           300            [411,523,534, …. 846]
Gandhi         3900            [23,32,33…..4578]
Mandela        3900            [21,14,56,145 …4536]
George Bush     450            [230,310 … 700]
Tony Blair      350            [225,320 … 800]
Justin Bieber   25             [401 , 420, 690 …. 904]
Lionel Messi    150            [23, 78, …… 570]
Run Code Online (Sandbox Code Playgroud)

'Article Ids'是一个包含id列表的blob(由API返回)

我的任务是从Id列表中为每个术语查找common-id并将它们保存在'relationships.db'中

我如何建立关系,我发现哪些文章一起谈论甘地和曼德拉(交叉文章ID)?

relationships.db应该是这样的;

Term 1              Term 2          No of Common Article Ids    Common Article IDS
Obama               Gandhi                17                    [34,123,25 ...]
Obama               Mandela               43                    [145,111,234,456 ....]
Obama               George Bush           46
Obama               Tony Blair             2
Obama               Justin Bieber         36
Obama               Lionel Messi           3
Gandhi              Mandela               40
Gandhi              George Bush           41
Gandhi              Tony Blair            32
Gandhi              Justin Bieber         31
Gandhi              Lionel Messi          20
Mandela             George Bush           20
Mandela             Tony Blair            11
Mandela             Justin Bieber         19
Mandela             Lionel Messi          39
George Bush         Tony Blair            46
George Bush         Justin Bieber         49
George Bush         Lionel Messi           2
Tony Blair          Justin Bieber         50
Tony Blair          Lionel Messi           3
Justin Bieber       Lionel Messi           6
Run Code Online (Sandbox Code Playgroud)

使用'for循环'循环遍历每个术语以获得交集是痛苦的.有没有一种有效的方法来做到这一点?"记忆"和"速度"之间会有权衡吗?

cai*_*ura 1

您可以找到pandas的一些解决方法。

1)使用pandas.read_sql创建pandas DataFrame

2)然后你可以获得像@logc建议的那样的交叉连接

3) 之后,您可以将列表转换为集合并应用交集。

如果您需要帮助来实施,我会稍后帮助您,现在有点匆忙。

编辑:

好吧,确实很简单,但我不知道它是否具有您需要的性能,也许您需要一步步阅读csv文件:

import pandas, sqlite3

conn = sqlite3.connect(databaseFilePath)
df=pandas.read_sql('SELECT * FROM Terms;',conn)
df['Article Ids'] = df['Article Ids'].apply(eval).apply(set)
df['key'] = False
df2 = pandas.merge(df,df,on='key')
df2 = df2[df2.Term_x!=df2.Term_y]
df2['Common Articles IDS'] = df2.apply(lambda row:set.intersection(row['Article Ids_x'], row['Article Ids_y']), axis=1)
df2['No of Common Articles Ids'] = df2['Common Articles IDS'].apply(len)
df2['Common Articles IDS'] = df2['Common Articles IDS'].apply(list).apply(str)
df2[['Term_x','Term_y', 'No of Common Articles Ids', 'Common Articles IDS']].to_sql(outputTableName, conn) 
Run Code Online (Sandbox Code Playgroud)