令G(V,E,LV,LE,φ)表示一个带标签的图,其中V和E分别表示顶点集和边集,LV和LE分别表示顶点和边的标签集,φ是一个标签函数定义了V→LV和E→LE的映射。
FSM算法根据操作的数据不同,可以分为针对图数据库的和针对一个大图的(现在只讨论exact match方法)。
根据每个顶点标签的id对顶点进行排序,然后根据该顺序生成邻接矩阵Xk,k表示顶点个数。邻接矩阵中每个元素表示该边标签的id。
对于
Xk=⎝⎜⎜⎜⎜⎜⎛x1,1x2,1x3,1⋮xk,1x1,2x2,2x3,2⋮xk,2x1,3x2,3x3,3⋮xk,3⋯⋯⋯⋱⋯x1,kx2,kx3,k⋮xk,k⎠⎟⎟⎟⎟⎟⎞
如果是无向图,则code(Xk)=x1,1x1,2x2,2x1,3x2,3x3,3x1,4⋯xk−1,kxk,k
如果是有向图,则code(Xk)=x1,1x1,2x2,1x2,2x1,3x3,1x2,3x3,2⋯xk−1,kxk,k−1xk,k。
对于一个子图Gs,定义它的支持度sup(Gs)为数据库中包含该子图的图的个数与总数的比值。
如果两个邻接矩阵Xk,Yk除了第k行和第k列不同外,其余元素均相同,则将两个矩阵合并生成Zk+1。如下所示:
Xk=(Xk−1x2Tx1xkk),Yk=(Yk−1y2Ty1ykk)
Zk+1=⎝⎛Xk−1x2Ty2Tx1xkkzk+1,ky1zk,k+1ykk⎠⎞,也可写成

其中,新矩阵中的元素满足下列关系:

如果是无向图,那么zk+1,k和zk,k+1相同。该合并操作可以产生多个Zk+1矩阵,这是因为vk和vk+1的构成的边的label可以有多种选择,因为图数据库中不同的图中这两个点之间的边的不同,也就造成了该边的label的不同,因此zk+1,k和zk,k+1有多个选择,还有一种选择是没有边,既0。
当Xk和Yk中的vk的label相同时,交换Xk和Yk后生成的矩阵是一样的,为了避免这种情况,只有当code(the first matrix)<=code(the second matrix)时才生成矩阵,生成的矩阵也被称为normal form。只有当大小为k+1的图G的所有k子图都是频繁子图时,G才是频繁子图候选项。
如果通过删除一个节点得到的子图不是normal form,必须将其转换成normal form之后才能判断该子图是否已经生成过。通过以下步骤,可以将一个non-normal form 的矩阵Xk转换成normal form的矩阵Xk′:(1)对Xk中的每个节点生成一个1×1的邻接矩阵;(2)对于点vi,vj∈G(Xk),如果其邻接矩阵符合合并条件,则合并;(3)不断地合并新生成的矩阵,知道获得了一个k×k的矩阵Xk′。该过程涉及到的是行列式的操作,因此可以表示成Xk′=(Tk)TXkTk。
当所有候选子图生成后,需要统计每个子图的支持度。但是每个图的normal form并不是唯一的。因此需要将代表同一个子图的不同的normal form的支持度加在一起。为了索引代表同一个子图的不同normal form,定义了normal form的canonical form。定义G的canonical form是G的normal form中code最小的。令Xk−1m表示G(Xk)移除点vm后得到的图。Xk−1′m表示Xk−1m经过Tk−1m变换后得到的normal form。Xk−1′m经过Sk−1m变换后得到canonical form。整体过程可表示为(Tk−1mSk−1m)TXk−1mTk−1mSk−1m。
那么我们可以用Skm和Tkm将Xk转换成canonical formXck。而Skm和Tkm又可以通过Sk−1m和Tk−1m获得。具体过程如下所示:

寻找频繁子图时,对数据库中的每个图从1到k的构造子图,并计算每个子图的支持度。