【问题标题】:Getting a node after write/read from gml NetworkX从 gml NetworkX 写入/读取后获取节点
【发布时间】:2019-06-06 12:51:11
【问题描述】:

我在读取 GML 图后获取节点时遇到问题。 (很抱歉,我无法为您提供准确的可重现代码,因为我的代码有 500 行长,而且较小的可重现示例给出了非常正确的结果)。所以我会尽量描述它:

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

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

但 0、3253、9694 也是 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

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

【问题讨论】:

  • 您能澄清一下您对G[1] 的期望吗?您得到的输出意味着节点1 有一个邻居0 并且关联的边的权重为1,另一个邻居3253 的关联的边的权重为8,等等。
  • 再读一遍我想我理解上的困惑可能在于弄清楚你所说的idlabel是什么意思。您是否只是担心写入和读取导致节点名称从字符串转变为整数?
  • 是的,完全正确 - 在我可以通过字符串(我称为标签)引用节点之前以及在我只能通过 int 访问节点之后(它是自动生成的,所以它没用对我来说)
  • G 中 >>>>'Some_String_That_Is_Definitely_In_Graph' 的输出 >>>>True 但是在写入/读取之后是: >>>> G 中的'Some_String_That_Was_Definitely_In_Graph' >>>> False >>> > G中的'Id_of_node_with_this_String' >>>> True
  • 另外:当我使用完全相同的代码,但我提供的数据较少时,一切正常

标签: python networkx gml-geographic-markup-lan


【解决方案1】:

这与其说是一种解决方案,不如说是一种解决方法,但是当您可以再次生成文件时才有效(如果您有解决方案,我会很高兴看到它,因为我已经花了一天的时间来解决它):

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

我学到了什么: 不知何故,在我的情况下,当 阅读 (文件本身没问题,我已经在文本编辑器中手动检查过)较大的 NetworkX Graph 形成 .gml 文件时,图形会损坏 - Ids(自动生成)对于文件)和标签(可以访问节点)被移动。看起来是这样的(这段代码可以工作。这个问题只有在分析更大的数据图时才会出现):

#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] 给出 'String1' , 但有时它也会给出 Key 错误

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

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多