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

Python 从gml NetworkX写入/读取后获取节点,python,networkx,gml-geographic-markup-lan,Python,Networkx,Gml Geographic Markup Lan,我在读取GML图形后获取节点时遇到问题。(很抱歉,我无法为您提供精确的可复制代码,因为我的代码有500行长,较小的可复制示例给出了异常正确的结果)。因此,我将尽可能地描述它: 我已经创建了一个中等大小的图G(40k个节点,一百万条边)。我只需执行G['something']即可通过其字符串标签访问其节点。我已经将它写入GML文件,然后读取它。现在:我不能像以前那样通过标签访问节点(我得到了KeyError),但我可以通过ID(在编写GML文件时创建的ID,对吗?)访问它们,即G[1]给了我一个A

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

我已经创建了一个中等大小的图G(40k个节点,一百万条边)。我只需执行
G['something']
即可通过其字符串标签访问其节点。我已经将它写入GML文件,然后读取它。现在:我不能像以前那样通过标签访问节点(我得到了
KeyError
),但我可以通过ID(在编写GML文件时创建的ID,对吗?)访问它们,即
G[1]
给了我一个AtlasView:

AtlasView({0: {'weight': 1}, 3253: {'weight': 8}, 9694: {'weight': 1}....
但是032539694也是ID,而不是标签。你知道哪里出了问题吗

以下是我的读写代码:

G = nx.Graph()
for mp in mps:
    G.add_node(mp.name, bipartite=0)
    for word in mp.speeches:
        G.add_node(word, bipartite=1)
        if not G.has_edge(mp.name, word):
            G.add_edge(mp.name, word, weight = 1)
        else:
            G[mp.name][word]['weight'] += 1
#Here I can simply acces the node by G[mp.name]
# and the output is i.e. {'wznawiać': {'weight': 2}, 'obrady':....
nx.write_gml(G, "test.gml")

G = nx.read_gml('test.gml')
#Here I can't acces the node by G[mp.name], but only by it's id

另外,当我试图在一个较小的例子中重现这个问题时,我得到了正确的结果。可能是编码方面的问题?

这是一个解决方案,而不是一个解决方案,但当您可以再次生成文件时,它就会起作用(如果您有解决方案,我很乐意看到,因为我已经花了一天的时间):

TL;DR:如果可以再次生成图形,请执行此操作并以其他格式保存。

我学到的: 不知何故,在我的例子中,当读取(文件本身正常,我已在文本编辑器中手动检查)较大的NetworkX图形形成.gml文件时,图形会损坏-ID(为文件自动生成)和标签(可访问节点的标签)会移动。看起来是这样的(此代码可以工作。只有在分析较大的数据图时才会出现此问题):

给出输出:

(0,1, {'weight': 1})
('String1', 'String2', {'weight': 1})
在gml的情况下,不可能通过G[“String1]”(给出KeyError)来获取节点,而将所有属性放入字典有时会提供访问节点标签的能力,即:
dictOfAtts[0]
给出
“String1”
,但有时也会给出密钥错误


如何解决此问题:如果可以再次生成图形,请执行此操作,然后以其他格式编写(.graphml对我有效)。但是你不能只读取.gml,然后将其写入.graphml,然后再次读取.graphml-它仍然损坏

你能澄清一下你期望的是什么吗?您得到的输出意味着节点
1
有一个邻居
0
,关联的边具有权重
1
,另一个邻居
3253
,其关联的边具有权重
8
,再读一读,我想我在理解上的困惑可能是弄明白你所说的
id
label
是什么意思。您是否担心写入和读取会导致节点名称从字符串变为整数?是的,完全正确-在我可以通过字符串(我称为标签)引用节点之前,以及在我只能通过int(自动生成,因此对我没有用)访问节点之后在G>>>>>>>>中,输出的“某些字符串”在G>>>>>>图形中肯定是,但在写入/读取之后是:>>>>>在G>>>>中,输出的“某些字符串”在G>>>>>中肯定是在G>>>图形中,输出的值为False>>>>>>在G>>>>中,输出的“Id\u在G>>>>>>中,节点的Id\u与G>>>>中的这个字符串相同:当我使用完全相同的代码,但我提供的数据较少时,一切正常
(0,1, {'weight': 1})
('String1', 'String2', {'weight': 1})