nx_graph.add_edge(src_node, dst_node, key=str(etype))报错TypeError: unhashable type: 'dict'
时间: 2024-02-11 21:05:34 浏览: 152
抱歉,这是我犯了一个错误。在前面的代码中,我们在创建节点时将节点属性存储为了一个字典,因此节点的类型是一个字典,而字典是不可哈希的。为了解决这个问题,我们可以将节点属性存储为元组而不是字典。以下是修改后的代码:
```python
import dgl
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
# 加载异质图
graph = dgl.load_graphs("data.bin")[0][0]
# 将异质图转换为 NetworkX 图
nx_graph = nx.DiGraph()
for ntype in graph.ntypes:
for etype in graph.canonical_etypes:
src, dst = graph.all_edges(etype=etype, order='eid')
for i in range(len(src)):
src_id = int(src[i])
dst_id = int(dst[i])
src_node = (str(ntype) + '_' + str(src_id), str(ntype))
dst_node = (str(ntype) + '_' + str(dst_id), str(ntype))
nx_graph.add_edge(src_node, dst_node, key=str(etype))
# 可视化 NetworkX 图
pos = nx.spring_layout(nx_graph)
colors = np.array([node[1] for node in nx_graph.nodes()])
nx.draw(nx_graph, pos, node_color=colors, with_labels=True)
plt.show()
```
在这个修改后的代码中,我们将节点属性存储为元组 `(id, type)` 而不是字典,其中 `id` 是节点的 ID,`type` 是节点的类型。在添加边时,我们使用元组而不是字典作为节点标识符。现在代码应该可以正常运行了。
阅读全文