You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyVis可视化DGL加载的Cora数据集时触发AssertionError

问题说明

使用DGL加载Cora图数据集,转换为NetworkX Graph对象后传入PyVis执行可视化时触发AssertionError,最小复现代码如下:

import dgl
from pyvis.network import Network
import networkx as nx

dataset = dgl.data.CoraGraphDataset()

g = Network(height=800, width=800, notebook=True)

netxG = nx.Graph(dataset[0].to_networkx())

g.from_nx(netxG)
g.show('ex.html')
报错根因

DGL的to_networkx()方法默认会把节点、边挂载的所有特征(包括feat特征张量、label标签张量)同步到NetworkX图的节点/边属性中,PyVis的from_nx()方法仅支持JSON可序列化的Python原生类型属性(字符串、数字、布尔值),遇到张量、numpy数组类型的属性时,内部属性校验逻辑会直接触发断言失败。

修复方案
  • 调用DGL的to_networkx()方法时,通过node_attrs、edge_attrs参数指定需要保留的属性,不需要的张量特征直接丢弃,仅保留图结构即可规避类型不兼容问题。
  • 如果需要给节点添加分类配色、悬停提示等可视化属性,先将张量/数组值转换为Python原生的int、str类型后再挂载到NetworkX节点上。

修正后可直接运行的代码:

import dgl
from pyvis.network import Network
import networkx as nx

dataset = dgl.data.CoraGraphDataset()
dgl_g = dataset[0]

# 转换时不携带任何张量类型的节点、边特征,仅保留图拓扑结构
netxG = nx.Graph(dgl_g.to_networkx(node_attrs=[], edge_attrs=[]))

# 按需添加原生类型的节点属性用于可视化
node_labels = dgl_g.ndata['label'].tolist()
for nid in netxG.nodes:
    netxG.nodes[nid]['group'] = node_labels[nid]  # 按标签分组自动配色
    netxG.nodes[nid]['title'] = f"节点分类: {node_labels[nid]}"  # 鼠标悬停提示

g = Network(height=800, width=800, notebook=True)
g.from_nx(netxG)
# 可选:显示布局调节按钮
g.show_buttons(filter_=['physics'])
g.show('ex.html')

补充提示:Cora全量图包含2708个节点、10556条边,直接全量渲染加载速度较慢,测试时可先取子图验证,例如取前500个节点生成子图:sub_g = netxG.subgraph(list(netxG.nodes)[:500]),再传入PyVis处理即可。

内容的提问来源于stack exchange,提问作者Des

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:45:44