NetworkX:边缘和节点属性的子图同构

dru*_*rum 6 python isomorphism subgraph networkx

假设我有2个图A和B,我想知道A是否是B的子图.节点包含属性,比如'size'和'material'.

当我跑:

GM = networkx.algorithms.isomorphism.GraphMatcher(B,A)
print networkx.algorithms.isomorphism.subgraph_is_isomorphic()
Run Code Online (Sandbox Code Playgroud)

这仅仅按边缘匹配图形,而不是边缘和属性.

关于如何检查属性的任何线索?

另外,假设B包含2个连通图A.

当我跑:

GM.mapping
Run Code Online (Sandbox Code Playgroud)

这将仅输出A的子图中的一个.有关如何输出每个子图的任何想法吗?

dru*_*rum 8

我用以下方法解决了这个问题:

print GM = iso.GraphMatcher(B,A,node_match=iso.categorical_node_match(['material', 'size'],['metal',1]))
Run Code Online (Sandbox Code Playgroud)

之前我不知道的['metal',1]只是默认而不是硬匹配.


小智 6

您可以通过以下方式迭代所有可能的子图

GM = networkx.algorithms.isomorphism.GraphMatcher(B,A)
for subgraph in GM.subgraph_isomorphisms_iter():
    print subgraph
Run Code Online (Sandbox Code Playgroud)

本例中的子图是将 B 的节点映射到 A 的节点的字典。

对于属性匹配的问题,drum的建议对我很有效。对于大型图来说,附加属性匹配实际上可以显着加快速度。