子图同构进阶版-advanced subgraph matching

  1. local candidate reduction
    在之前的compute candidate的基础上增加一个profile选项,profile包含S中每个node的neighbour所拥有的label(可以重复),按照字母顺序排序,在判断candidate时考虑是否G中对应的node(v)的profile包含S中node(u)的profile
    伪代码:

 

candidate_node=list()
for node_u in S:
    for node_v in G:
        if v拥有所有u的label and len(v.neighbours)>=len(u.neighbours) and v的neighbour拥有所有u的neighbour的label:
            candidate_node.append(v)
  1. Global candidate reduction
    这个基本思路就是查看每个node(u)和其对应的candidate(v)的neighbour,如果v的neighbour无法在u的neighbour中找到相对应的node,那么就排除v。一个比较直观的图示:

    Graphs-at-a-time: Query Language and Access Methods for Graph Databases
for 所有node(u)和其candidate(v)的组合T:
    针对每对<u,v>构建一个双向图B,里面的node是u和v的所有neighbour
    u'=u的neighbour
    v'=v的neighbour
    foreach u':
        foreach v':
            如果v'是u'的candidate的话我们就把(u',v')这个edge加到B里面
    构建一个M,使之为B的最大匹配(Maximum matching下面会说怎么找)
    if M里的data node与u的neighbour不相等:
        v就不是u的candidate
        不过这时候我们要把所有u',v'的组合加到T中进行遍历
    直到T里面没有东西了才停止

为了找maximum matching,我们首先需要一个辅助function去寻找augmenting path

方程接受两个input:B:原始的双向图,M:匹配到一半的maximum matching双向图
# 先获取所有free node
U'=U 去掉 M.query_node
V'=V 去掉 M.data_node
构建一个全新的双向图B_m,里面的node是所有u和v
在B_m中加入所有B中的(u,v)edge
在B_m中加入所有M中的(u,v)的反向edge,也即(v,u)edge
对于所有U'和V'中node的组合:
    # 因为U中node不会互相直连,V中node也不会,所以只要有路径就一定是最短的,当然,前提是不重复走同一个edge
    P=找到u'到v'的最短路径.
    if 找到了P:
        return P
    else:
        继续找

以下是find maximum matching的主function
Maximum matching, 也即maximum bipartite matching,目的是找到一个biparite graph的最大匹配,也即尽量多的让左边的node映射到右边的Node上。而算法就是挨个帮助左边的空node找到右边的空node,path可以帮助一路上的pair挨个switch。

方程接受一个input,就是B:原始的双向图
M=一个空双向图
while true:
    P=用前一个function找到B,M之间的任意一个P
    if 找不到P了:
        break
    else:
        # 这里i就是P中edge的序号
        for i in range(1,|P|):
            # 也即第1,3,5,7个edge的时候,这些都是从U到V的edge
            if i%2==1:
                这时候就把这个edge作为新的(u,v)存到M中
            # 当这是从V到U的edge的时候
            else:
                把M中的query node u移除(u这时候是edge的第二个node)
  1. Query processing order
    基本思路就是先process分支少,candidate少的node
u_next=拥有最少candidate的node
min=拥有最少candidate的node的candidate数量
while processing order还没有包含所有的query node:
    foreach 没包含的query node:
        计算搜索需要用的estimate cost(cost of previous node*current node's candidate number*gama^(connections between current node and all node already exist in the processing order))
        把cost最小的一个node加到order里
  1. VF2 rule
    这个是用来提前结束搜索的方法。叫做k-look-ahead
    比如1-look-ahead:
    假设u是query node, v是想加的data node。
    则我们就看u的neighbour和已匹配的所有node的neighbour的重合的node数量 是不是小于等于 v的neighbour和已匹配的所有node的neighbour的重合的node数量。如果成立的话就继续,不成立就终止。
    2-look-ahead:
    在上面的前提上要求那些node也需要属于已匹配的node
    要注意的是induced和noninduced是不同的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值