从gml NetworkX写入/读取后获取节点

时间:2019-01-11 15:13:11

标签: python networkx gml

读取GML图后获取节点时遇到问题。 (很抱歉,我无法为您提供精确的可复制代码,因为我的代码长500行,而较小的可复制示例给出了奇怪的正确结果)。因此,我将尽力描述它:

我创建了一个中等大小的图形G(4万个节点,100万个边)。我只需执行G['something'],即可通过其String标签访问其节点。我已将其写入GML文件,然后阅读。现在:我无法像以前一样通过节点的标签访问节点(获取KeyError),但是可以通过id(在编写GML文件的过程中创建的ID,对吗?)访问节点,即{ {1}}给了我AtlasView:

G[1]

但是0、3253和9694也是ID,而不是标签。你知道出了什么问题吗?

这是我的读写代码:

AtlasView({0: {'weight': 1}, 3253: {'weight': 8}, 9694: {'weight': 1}....

另外,当我尝试在一个较小的示例上重现问题时,我得到了正确的结果。也许与编码有关?

1 个答案:

答案 0 :(得分:0)

这不是解决方案,而是工作方法,但是可以在再次生成文件时起作用(如果有解决方案,因为花了一天的时间,我很高兴看到它):

TL; DR:如果您可以再次生成图形,则将其生成并保存为其他格式。

我学到的东西: 对于我而言,以某种方式读取(文件本身还可以,我已经在文本编辑器中手动对其进行了检查)较大的NetworkX Graph形式的.gml文件,该图会损坏-ID(自动生成) (用于文件)和标签(可通过其访问节点)移动。看起来像这样(此代码将起作用。仅在分析较大的数据图时才会出现问题):

#prepare the data:
G = nx.Graph()
G.add_node("String1")
G.add_node("String2")
G.add_edge("String1", "String2", weight = 1)
nx.write_graphml(G, "test.graphml")
nx.write_gml(G, "test.gml")

#now reading:
gml = nx.read_gml('test.gml')
graphml = nx.read_graphml('test.graphml')

#let's sort the edges by weight just to make this example clearer:
seGml = sorted(gml.edges(data=True),key= lambda x: x[2]['weight'],reverse=True)
seGraph = sorted(graphml.edges(data=True),key= lambda x: x[2]['weight'],reverse=True)
print(seGml[0])
print(seGraph[0])

给出输出:

(0,1, {'weight': 1})
('String1', 'String2', {'weight': 1})

在gml情况下,不可能通过G [“ String1”](给出KeyError)来获取节点,并且将所有属性都放入字典中有时可以达到结点标签的能力,即:dictOfAtts[0]赋予{ {1}},但有时也会出现Key错误

如何对其进行处理::如果您可以再次生成图形,请进行处理,然后以其他格式编写(.graphml对我有用)。但是您不能只读取.gml,然后将其写入.graphml,然后再次读取.graphml-它仍然损坏。