NetworkX子图匹配异常:候选节点匹配错误且同构迭代器为空
问题根源
NetworkX的GraphMatcher默认会先基于节点度生成候选配对,只有度相等的节点才会被纳入候选池。你的预期匹配节点(查询1→目标1、查询3→目标3)的度不相等(查询节点度为2,目标节点度为3),所以这些配对根本没进入候选池,导致自定义的node_match函数没有触发的机会。
同时,默认候选池里的目标节点(2、4、5)在目标图中无法形成和查询图一致的三角形结构,因此subgraph_isomorphisms_iter()返回空迭代器。
解决方法
方法一:自定义候选配对逻辑,跳过度过滤
修改GraphMatcher的初始化代码,添加node_candidate参数,允许所有节点进入候选池,交给node_match过滤:
# 自定义候选配对函数:允许所有查询节点与目标节点配对 def node_candidate(q_node, t_node): return True GM = iso.GraphMatcher(query, target, node_match=node_match, node_candidate=node_candidate)
方法二:基于节点属性生成候选配对
如果cat属性是节点匹配的核心依据,可以用NetworkX提供的工具直接生成属性匹配的候选池,效率更高:
# 基于'cat'属性筛选候选配对 node_candidate = iso.categorical_node_match('cat', None) GM = iso.GraphMatcher(query, target, node_match=node_match, node_candidate=node_candidate)
修改后效果
candidate_pairs_iter()会返回(1,1)、(2,2)、(3,3)三对匹配节点;subgraph_isomorphisms_iter()会输出预期的同构映射:{1: 1, 2: 2, 3: 3}。
内容的提问来源于stack exchange,提问作者dokondr
相关产品推荐
相关产品推荐

