子图同构即subgraph isomorphism,
假设G为图,S为子图,如果S中所有node(节点)和之间的edge(边)都可以映射到G中的话(结构相同就行),就称之为子图同构。
induced subgraph isomorphism:G和S中对应的node之间的edge一一对应
non-induced subgraph isomorphism:G中对应的node之间的某些edge不存在于S中
子图匹配(Subgraph matching computation):
- 计算候选node(Candidate computation)
即帮助每个S中的node寻找G中的有可能互相对应的节点
伪代码:
candidate_node=list()
for node_u in S:
for node_v in G:
if v拥有所有u的label and len(v.neighbours)>=len(u.neighbours):
candidate_node.append(v)
-
设定查找顺序
简易方法中按照随即顺序查找 -
同构搜寻
使用递归的形式挨个将S中每个node对应的G中的候选node放入新建子图,并匹配(回溯算法,backtracking,有点类似于树的遍历)
query_node: S中的node
data_node: G中的node(那些对应S的candidate node)
O:query_node的查找顺序(就是一个query_node的list)
Φ \Phi Φ:所有同构的集合
ϕ \phi ϕ:一个同构对象(包含了query_node和对应的data_node)
v:一个data node
u:一个query node
伪代码:
def IsomorphismSearch(G,S,C,O,i,$\phi$,$\Phi$):
if $\phi$.query_node=S.node:
$\Phi$.append($\phi$)
else:
u=O[i]
for v in u的candidate node:
if v not in $\phi$.data_node and IsValid(G,S,$\phi$,u,v):
$\phi$[U]=v
IsomorphismSearch(G,S,C,O,i,$\phi$,$\Phi$)
$\phi$.query_node.remove(u)
return $\Phi$
def IsValid(G,S,$\phi$,u,v):
for u' in u.neighbours:
if neighbour在$\phi$.query_node中,但是u和u'映射的edge(v,$\phi$(u'))却在G中不存在:
return False
if isomorphism是induced的:
for u' in u.query_node:
if u'和u之间不相连,但是他们在G中的映射(v,$\phi$(u'))是相连的:
return False
return True