2013-10-16 54 views
0

我已经拉起了一些代码,我在网络x的1.6.1中玩过。在1.8.1上写入gmlgraphml时不起作用。当我使用Networkx边缘不能正确添加属性

AttributeError: 'str' object has no attribute 'items' 

的问题归结为暂时无法写入数据字典内边缘属性,像这样:

BasicGraph = nx.read_graphml("KeggCompleteEng.graphml") 

for e,v in BasicGraph.edges_iter(): 
    BasicGraph[e][v]['test'] = 'test' 

nx.write_graphml(BasicGraph, "edgeTester.graphml") 

导致错误for e,v,data in BasicGraph.edges_iter(data=True):数据打印出像所以:

{'root_index': -3233, 'label': u'unspecified'} 
test 

也是新属性在字典之外。

该文件说我应该能够像上面那样做。但是,我想我犯了一个愚蠢的错误,并希望被放回正确的道路上!

编辑:

于是我运行该程序与程序中生成的图表:BasicGraph = nx.complete_graph(100),它运行得很好。

然后我用一个来自底图的示例graphml文件运行它:BasicGraph = nx.read_graphml("graphmltest.graphml"),这也工作。 (我甚至导入和导出Cytoscape来检查这不是问题)

所以显然这是我使用的文件。 Here's一个链接,任何人都可以看到它有什么问题吗?

+0

您可以修改代码以不需要加载该文件? – tacaswell

+0

用'nx.complete_graph()'和另一个graphml文件试了一下,它们都工作正常。查看更新! – Darkstarone

回答

3

的问题是您的图形是具有平行的边缘,从而NetworkX加载它作为一个多重图对象:

In [1]: import networkx as nx 

In [2]: G = nx.read_graphml('KeggCompleteEng.graphml') 

In [3]: type(G) 
Out[3]: networkx.classes.multigraph.MultiGraph 

In [4]: G.number_of_edges() 
Out[4]: 7123 

In [5]: H = nx.Graph(G) # convert to graph, remove parallel edges 

In [6]: H.number_of_edges() 
Out[6]: 6160 

因为该图形对象存储的一个边缘的内部结构是G [节点]的[node] [key] [attribute] = value(注意多图的额外关键字典级别)。

您明确

for e,v in BasicGraph.edges_iter(): 
    BasicGraph[e][v]['test'] = 'test' 

打破它修改结构。

它允许修改数据结构的方式,但它是安全使用NetworkX API

In [7]: G = nx.MultiGraph() 

In [8]: G.add_edge(1,2,key='one') 

In [9]: G.add_edge(1,2,key='two') 

In [10]: G.edges(keys=True) 
Out[10]: [(1, 2, 'two'), (1, 2, 'one')] 

In [11]: G.add_edge(1,2,key='one',color='red') 

In [12]: G.add_edge(1,2,key='two',color='blue') 

In [13]: G.edges(keys=True,data=True) 
Out[13]: [(1, 2, 'two', {'color': 'blue'}), (1, 2, 'one', {'color': 'red'})]