DEBUG.WIKI
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
雨云;给项目一台云服务器
晚安云;香港 CN2 ¥15/月

NetworkX ISMAGS 无兼容节点时,报 min 空序列错误

属性规则可能让两个非空图没有任何节点候选。NetworkX 3.7 已在搜索前返回无映射;上层要区分 [] 与空子图的 [{}],不能删掉 node_match 让不兼容节点通过。

两个图都有节点,ISMAGS.largest_common_subgraph() 却报 ValueError: min() iterable argument is empty。如果设置了 node_match,先核对两边是否真的存在满足属性条件的节点对;节点数量非零,不代表候选集合非空。

例如一边节点没有 attr1,另一边为 attr1=0,匹配器把缺失属性默认成 None,两者便不兼容。旧实现继续从空候选里取最小节点,错误来自搜索边界,没有说明输入图文件损坏。

正式 3.7 已检查没有任何候选的情况

NetworkX 3.7 的实现会先确认至少一个子图节点拥有候选节点;没有候选时直接结束生成器。下面是这一条件的完整结构示例,symmetry=False 用于明确关闭对称性消重:

import networkx as nx

left = nx.Graph()
left.add_node(0)
right = nx.Graph()
right.add_node(0, attr1=0)

matcher = nx.isomorphism.categorical_node_match(["attr1"], [None])
search = nx.algorithms.isomorphism.ISMAGS(
    left, right, node_match=matcher,
)
mappings = list(search.largest_common_subgraph(symmetry=False))
assert mappings == []

这里的结果是没有产出映射,即 [],不能写成必定产出一个空字典 [{}]。空子图是另一条分支:当前实现对子图本身为空的输入会产出空映射。上层代码如果用结果数量或布尔值判断,应把这些输入分别处理。

3.7 的发行元数据要求 Python 3.12 或更高,并排除 Python 3.14.1。准备采用时,按项目约束更新解释器和依赖锁定,并保留原图及匹配函数。采用其他版本时,仍需核对该版本是否已有候选为空的提前返回。

属性不匹配应由业务规则决定

缺失值本来就不应匹配 0 时,应保留匹配规则,并让上层接受“没有公共匹配”的结果。不能为了消除异常删掉 node_match,否则会把不符合业务属性的节点视为兼容。

暂时保留旧实现的应用,可以在这个已确认的节点匹配条件下预先判断是否存在任何兼容节点对。只有确实一个都没有时,才直接报告无匹配;存在候选并不保证一定存在满足全部边约束的公共结构。大图的全对比较可能很贵,应按真实的属性索引设计,不把一个二重循环无条件加到每次图搜索前。

验收分别覆盖两图非空但属性完全不兼容、部分兼容、空图、空子图以及正常公共子图,核对映射方向为“原图节点到子图节点”。更换版本后仍要检查边属性与对称性设置;消除这次空集合异常不等于任意图匹配结果都已正确。