2013-03-27 320 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.

對於屬性的匹配問題的節點的字典,鼓的建議已經爲我工作。額外的屬性匹配實際上大大加速了大圖的事情。