2016-09-21 6 views
1

私は、ホテルの "親"と "phone_search"が格納されたノードからなるグラフを持っています。 このグラフを作成する主な目的は、同様の「phone_search」(再帰的)を持つすべての「parentid」を接続することでした。たとえば、parentid Aにphone_search 1,2がある場合などです。 Bは2,3を有する。 Cは3,4を有する。 Dが5,6、Eが6,7の場合、A、B、Cは1つのクラスタにグループ化され、DとEは別のクラスタにグループ化されます。networkx内のコンポーネントにグループIDを割り当てる

これは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には、同じクラスタにあるいくつかのparentidとphone_searchesが含まれます。同様に、Gid 2には別のクラスタのノードなどが含まれます。

もう1つ疑いがあります。グループIDを使用して辞書からノードにアクセスするのは、networkxグラフでbfsを実行するよりも高速ですか?

答えて

1

基本的にノードのリストがコンポーネント(クラスタではない)に基づいていますが、これはかなり簡単です。 connected_component_subgraphs()が必要です。ノード属性として使用すると、コンポーネントのIDをしたい場合は

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]} 

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})] 
+0

私はちょうど1つのより多くの問題を抱えていました。グラフには、わかりますように、私は "親"と "phone_search"が混在しています。しかし、 "phone_search"ではなく、 "parentid"だけを辞書に保存したい。それらを区別する1つの方法は、すべての "phone_search"が数字であり、すべての "parentid"が "P" **で始まることです。 – Anubhav

+0

例はありませんが、私は完全に理解していません。しかし、私はそれが別の質問だと信じています。それともこれはまだコンポーネントについてですか? – MERose

+0

ところで、それはそうです。あるコンポーネントでは、一部のノードは親ノードで構成され、一部は電話番号で構成されます。しかし、ノードの値を辞書に格納するときは、文字Pで始まるノードだけを保存したい(これはデータベースでは親ノードであることを示しています)。基本的には、コンポーネントの親ノードをすべて辞書に保存し、phone_searchのノードは保存しません。 – Anubhav

関連する問題