2014-01-13 24 views
1

將以下問題轉換爲graph.xml(不能在此處發佈所有代碼,但這裏是要點)。 NetworkX版本是1.6.2Python Networkx無法導出到具有屬性的graphml

我有一個稱爲圖G

networkx有向圖
G = nx.DiGraph() 

在作者列表格式加權邊緣(作者單位,AuthorB,重量)

G.add_weighted_edges_from(author_list) 
填充它

我在這裏可以導出graphml和正常工作

nx.write_graphml(G, 'test.graphml') 

我再計算出的PageRank在圖表上

graph_metric = nx.pagerank_numpy(G, weight='weight') 

,然後在圖形屬性添加到節點

nx.set_node_attributes(G, 'pagerank', graph_metric) 

如果我遍歷圖我可以打印出節點名稱和歌的PageRank

for n.d in G.nodes_iter(data=True): 
    print n, d 

AuthorA {u'pagerank':0.0076688948270074164} ... ... ...

但如果更新我嘗試創建從圖中我得到了以下錯誤graphml屬性後:

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 111, in generate_graphml 

writer.add_graph_element(G) 

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 305, in add_graph_element 

self.add_nodes(G,graph_element) 

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 262, in add_nodes 

self.add_attributes("node", node_element, data, default) 

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 255, in add_attributes 

scope=scope, default=default_value) 

File "/usr/lib/pymodules/python2.7/networkx/readwrite/graphml.py", line 242, in add_data 

raise nx.NetworkXError('GraphML writer does not support ' 

NetworkXError: GraphML writer does not support dict types as data values. 

的思考?

+0

也許您需要發佈更多的代碼...我只是想在這裏,它似乎正常工作。我是py26/nx1.6 IIRC。有一件事是,它抱怨說,你設置一個屬性爲一個字典的值,這是無效的。上面的代碼沒有這樣做,但一開始將找出哪個節點有一個無效值的屬性...將張貼代碼來做到這一點.... –

+0

我沒有看到你發佈什麼這看起來像一個問題。不支持的類型的錯誤消息在網絡x-1.7中(稍微)得到了改進https://github.com/networkx/networkx/commit/661dcf479d9e597d6d7b83a1db7b8fbbb76f9599因此您可以考慮升級到更新的版本,並查看是否提供了哪些數據導致graphml編寫器投訴。 – Aric

+0

保存爲GraphML時,不能自動序列化字符串。 [OSMnx](http://geoffboeing.com/2016/11/osmnx-python-street-networks/)例如有一個內置功能,用於將networkx網絡保存爲GraphML文件,以序列化節點和邊緣的字典屬性。 – eos

回答

1

好吧,它確實告訴你 - 你不能把字典作爲graphml屬性 - 它們大多數情況下都需要是數字類型或字符串。

沒有答案,但更容易把代碼放在這裏。 找到「壞」的節點:

for node in G.node: 
    for attrib in G.node[node]: 
     if type(G.node[node][attrib]) == dict: 
      print node 
+0

它確實告訴你,它是我添加的pagerank屬性 - 你可以從'AuthorA {u'pagerank':0.0076688948270074164}'中看到。奇怪的是,您可以更新圖中節點的屬性,但是沒有內建的方法讓graphml將它們寫出來。似乎我必須生成graphml,然後在它創建完成後通過迭代進行更新。你運行的代碼是 – Michael

+0

嗎?你所看到的是預期的行爲 - 那就是打印'n'(這是一個字符串)和'd'(這是一個屬性字典)。我得到相同的輸出,但write_graphml工作正常。 –

+0

您運行的是哪個版本的networkx? – Michael