2013-03-27 317 views
4

假设我有2个图A和B,并且我想知道A是B的子图。 节点包含属性,例如“大小”和“材质”。NetworkX:子图通过边和节点属性的同构

当我运行:

GM = networkx.algorithms.isomorphism.GraphMatcher(B,A) 
print networkx.algorithms.isomorphism.subgraph_is_isomorphic() 

这仅只是,而不是由边缘和属性由边匹配图。

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

此外,假设B包含A.

的2个连通图当我运行:

GM.mapping 

这将输出只A的子图的每1子如何输出的任何想法?

回答

5

我已经使用解决了这个:

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

我以前不知道的是,['metal',1]只是默认,而不是一个艰难的比赛。

+0

你能解释一下“默认”的值吗?我不确定它将如何用于该功能。 – 2015-01-08 11:16:17

+0

@ jim-raynor如果图中的某个节点没有该属性的值(即该属性未分配),则上面给出的“默认”值将作为此类节点的默认值。如果您不适合假设不应该拥有它们的节点的属性,则可以传递“无”。 – Harsh 2017-11-27 16:39:03

+0

是的,语法有点混乱/(不简单)。即使我认为这是一场艰苦的比赛,但无法围绕为什么有人会想要这样做。最终,我在挖掘之后找到了解释。 – Harsh 2017-11-27 16:42:53

1

可以遍历所有可能的子图通过以下方式

GM = networkx.algorithms.isomorphism.GraphMatcher(B,A) 
for subgraph in GM.subgraph_isomorphisms_iter(): 
    print subgraph 

子在这个例子中是一个映射B的节点A.

对于属性的匹配问题的节点的字典,鼓的建议已经为我工作。额外的属性匹配实际上大大加速了大图的事情。