写入 GML 文件时出现 NetworkX 键错误

NetworkX Key Error when writing GML file

在使用 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' 字段,并使用 'label' 作为节点的标识符。它保留了 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 共享的公共节点,即上面显示的那个。所有其他人都是 user_id 和标签唯一的。

然后我使用以下方法合并两个图:

f = nx.compose(g,h)

这工作正常。

然后我从图中写出一个新的 GML,f,使用:

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 都是独一无二的。

所以,如果这不是键唯一性的问题,那么错误告诉我什么?

我已经想尽办法了!

如有任何指点,将不胜感激!

我将此作为问题发布在 NextworkX GitHub 存储库上,管理员已在其中进行了解答。

参见:https://github.com/networkx/networkx/issues/3100

我把他的回答贴在下面:

Yes -- this is a known issue: see #2131

The GML spec doesn't allow underscores in attribute names. We allow reading .gml files that don't correspond to the official GML spec. But we write only items that follow the spec. You should convert your attribute names to not include the underscore.

for n in G:
    G.node[n]['userid'] = G.node[n]['user_id']
    del G.node[n]['user_id']

We should also add to the documentation a note about this.