在使用compose()合并两个图形之后尝试写入GML文件时,出现以下错误消息:
NetworkXError: 'user_id' is not a valid key
背景是我使用以下命令导入了两个GML文件:
g = nx.read_gml(file_path + "test_graph_1.gml")
h = nx.read_gml(file_path + "test_graph_2.gml")
(在两个GML文件中)每个节点的文件结构如下:
node [
id 9
user_id "1663413990"
file "wingsscotland.dat"
label "brian_bilston"
image "/Users/ian/development/gtf/gtf/img/1663413990.jpg"
type "friends"
statuses 21085
friends 737
followers 53425
listed 550
ffr 72.4898
lfr 0.1029
shape "triangle-up"
]
在导入每个文件之后,我可以检查所有节点属性,看看每个图中的节点都是唯一的。
我还看到默认情况下NetworkX会丢弃“ id”字段,而und使用“标签”作为节点的标识符。它保留了user_id属性(恰好是Twitter的user_id,非常适合我的目的)。
运行
list(f.nodes(data=True))
我可以看到上面节点的数据是:
('brian_bilston',
{'ffr': 72.4898,
'file': 'wingsscotland.dat',
'followers': 53425,
'friends': 737,
'image': '/Users/ian/development/gtf/gtf/img/1663413990.jpg',
'lfr': 0.1029,
'listed': 550,
'shape': 'triangle-up',
'statuses': 21085,
'type': 'friends',
'user_id': '1663413990'})
在此测试例中,有一个公共节点由图g和图h共享,即上面所示的一个。其他所有用户名和用户名都是唯一的。
然后我使用以下方法合并两个图形:
f = nx.compose(g,h)
这正常。
然后我使用以下代码从图f中写出新的GML:
nx.write_gml(f, file_path + "one_plus_two.gml")
这时我得到了上面的错误:
NetworkXError: 'user_id' is not a valid key
我已经检查了所有user_id的唯一性(如果我重复了一个):
uid = nx.get_node_attributes(f,'user_id')
print(uid)
哪个输出:
{'brian_bilston': '1663413990',
'ICMResearch': '100',
'justcswilliams': '200',
'MissBabington': '300',
'ProBirdRights': '400',
'FredSmith': '247775851',
'JasWatt': '160952087',
'Angela_Lewis': '2316946782',
'Fuzzpig54': '130136162',
'SonnyRussel': '828881340',
'JohnBird': '448476934',
'AngusMcAngus': '19785044'}
(为便于阅读而格式化)。
据我所知,所有user_id都是唯一的。
因此,如果不是键的唯一性问题,那么错误告诉我什么?
我对此已经筋疲力尽了!
请多多指教!
答案 0 :(得分:5)
我将此问题发布在NextworkX GitHub存储库上,由管理员回答。
请参阅:https://github.com/networkx/networkx/issues/3100
我在下面发布了他的答案:
是的-这是一个已知问题:请参见#2131
GML规范不允许在属性名称中使用下划线。我们允许 读取与官方GML规范不符的.gml文件。但 我们只写符合规格的项目。你应该转换你的 属性名称不包含下划线。
for n in G: G.node[n]['userid'] = G.node[n]['user_id'] del G.node[n]['user_id']
我们还应该在文档中添加关于此的注释。