0

networkx の 1.6.1 で遊んでいたコードをいくつか引っ張り出しました。gml1.8.1 では、またはへの書き込みでは機能しませんgraphml

問題は、次のように data dict 内にエッジ属性を書き込めないことに要約されます。

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

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

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

エラーの原因:

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

私が使用する場合: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 にインポートしたり、Cytoscape からインポートしたりしました)

明らかに、それは私が使用しているファイルです。ここにリンクがありますが、何が問題なのか誰にもわかりますか?

4

1 に答える 1

3

問題は、グラフに平行なエッジがあるため、NetworkX がそれを MultiGraph オブジェクトとしてロードしていることです。

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][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'})]
于 2013-10-16T23:09:21.203 に答える