将组ID分配给networkx中的组件

时间:2016-09-21 10:35:16

标签: python dictionary grouping networkx

我有一个图表,其中包含有" parentid"酒店和" phone_search"存储在其中。 我建立这个图表的主要目的是连接所有" parentid"它有类似的" phone_search" (递归地),例如,如果parentid A具有phone_search 1,2; B有2,3; C有3,4; D有5,6,E有6,7,那么A,B,C将分组在1个簇中,D和E在另一个簇中。

这是构建nework的代码:

from pymongo import MongoClient  # To import client for MongoDB
import networkx as nx
import pickle

G = nx.Graph()

#Defining variables
hotels = []
phones = []
allResult = []
finalResult = []

#dictNx = {}

# Initializing MongoDB client
client = MongoClient()

# Connection
db = client.hotel
collection = db.hotelData

for post in collection.find():
    hotels.append(post)

for hotel in hotels:
    try:
        phones = hotel["phone_search"].split("|")
        for phone in phones:
            if phone == '':
                pass
            else:
                G.add_edge(hotel["parentid"],phone)
    except:
        phones = hotel["phone_search"]
        if phone == '':
            pass
        else:
            G.add_edge(hotel["parentid"],phone)

# nx.write_gml(G,"export.gml")
pickle.dump(G, open('/home/justdial/newHotel/graph.txt', 'w'))

我想做什么:我想为每个组件分配一个组ID并将其存储到字典中,这样我每次都可以直接从字典中轻松访问它们。

示例:Gid 1将包含一些位于同一群集中的parentids和phone_searches。类似地,Gid 2将包含来自另一个集群的节点,依此类推......

我还有一个疑问。使用组ID从字典访问节点比在networkx图上执行bfs更快吗?

2 个答案:

答案 0 :(得分:1)

您基本上需要基于其组件(而非群集)的节点列表,这非常简单。您需要connected_component_subgraphs()

G = nx.caveman_graph(3, 4)  # generate example with 3 components of four members each
components = nx.connected_component_subgraphs(G)

comp_dict = {idx: comp.nodes() for idx, comp in enumerate(components)}
print comp_dict
# {0: [0, 1, 2, 3], 1: [4, 5, 6, 7], 2: [8, 9, 10, 11]}

如果您希望组件ID作为节点属性:

attr = {n: comp_id for comp_id, nodes in comp_dict.items() for n in nodes}

nx.set_node_attributes(G, "component", attr)
print G.nodes(data=True)
# [(0, {'component': 0}), (1, {'component': 0}), (2, {'component': 0}), (3, {'component': 0}), (4, {'component': 1}), (5, {'component': 1}), (6, {'component': 1}), (7, {'component': 1}), (8, {'component': 2}), (9, {'component': 2}), (10, {'component': 2}), (11, {'component': 2})]

答案 1 :(得分:0)

由于缺乏声誉,这是一条评论。

“set_node_attributes”函数更改了v1.x和v2.0之间参数的顺序,以允许更多选项来加载属性。 顺序是:(G,值,名称)而不是(G,名称,值)

如果使用关键字参数,那么顺序并不重要:

nx.set_node_attributes(G,name ='component',values = attr)