- 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)
-
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)
- 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里
- 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是不同的