我试图编写一个脚本,让我从命令行界面中修改(编辑,剪切,更改)一些大型网络文件。我尝试做的其中一件事是基于在节点标签中搜索匹配来将子网与更大的网络隔离。
所以基本上我有一个networkx图,可能有7000个节点,相应的边有各种标签。然后我会匹配一个字符串,例如" Smith"到节点。我得到了30个节点的匹配(标签:" John Smith",标签:" Peter Smith"等)。然后,我想创建一个新的networkx网络,其中包含这30个节点,它们具有的边缘,以及这些边连接到的节点,直到n的深度,或者可选地直到找到所有节点和边缘。
我目前的代码是垃圾,所以也许我会尝试编写一些伪代码:
for node in networkx_network:
if searched_string in node:
new_network.add(node.subnetwork(depth=n))
我花了几天时间搜索解决方案,也许子图,邻居或者connected_components是正确的做法,但我无法理解如何做到这一点。
答案 0 :(得分:3)
single_source_shortest_path
有一个可选的cutoff参数。包括它你可以告诉networkx基本上找到给定节点的特定距离内的节点的路径。这有点过分,因为在你不需要的那些路径中有很多其他信息。如果你只是获取结果路径集的密钥,那么所有节点都可以在该距离内到达,而networkx有办法找到包含所有这些节点及其之间边缘的图形。
通过查看源代码并删除跟踪实际路径所花费的精力,您可以根据需要提高效率。但就目前而言,以下是有效的:
import networkx as nx
G=nx.fast_gnp_random_graph(100000,0.00002) #sample graph.
base = range(3) #arbitrarily choose to start from nodes 0, 1, and 2
depth = 3 #look for those within length 3.
foundset = {key for source in base for key in nx.single_source_shortest_path(G,source,cutoff=depth).keys()}
H=G.subgraph(foundset)
nx.draw_networkx(H)
import pylab as py
py.savefig('tmp.png')
答案 1 :(得分:1)
尝试雪球取样? 因此,对于您搜索的包含关键字的节点集。 寻找他们所有的邻居,然后添加到集合中。 寻找所有邻居的邻居,将新的邻居添加到集合中。 迭代这个过程n次。 最后,您将获得所需的所有节点集,然后使用子图函数获取最终集中所有节点的子图。 这可能不是最有效的解决方案,但应该有效。