python - 从 gml NetworkX 写入/读取后获取节点
问题描述
我在读取 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
此外,当我试图在一个较小的示例上重现问题时,我得到了正确的结果。也许它与编码有关?
解决方案
这与其说是解决方案不如说是一种解决方法,但是当您可以再次生成文件时才有效(如果您有解决方案,我会很高兴看到它,因为我已经花了一天的时间):
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 - 它仍然已损坏。
推荐阅读
- python - 从派生的 kivy 类访问 Python 函数
- python - 如何在 str.format() 方法中使用变量?
- javascript - p5.js 网页编辑器。'未捕获的类型错误:无法读取未定义的属性'拆分'(:第 57 行)'
- java - 搜索时 JTable - 没有得到正确的 ID
- html - 如果找到关键字,如何获取行号及其文本
- javascript - 汇总未检测到 scss 文件的 @import 语法
- apache-kafka - Apache Kafka 和 JSON 模式
- python - python中的bcrypt在比较输入和存储的密码时返回false
- java - 这个接口代码是如何用Java编译的?
- sql-server - 这个 SQL Server ALTER TABLE 子句中的 FOR 关键字有什么作用?