問題定義
子圖匹配:假設有兩個圖
和圖
子圖 同構即從
到
存在這樣一個函數
而且
使得
一樣成立
叫作子圖同構的一個映射。在這篇論文中,兩個圖的頂點都是帶
屬性的,這樣還須要知足
.算法
論文的核心想法
主要討論如何經過推遲笛卡爾積操做來減小子圖匹配運算的中間結果數量數據結構
- 在一個個查詢點進行匹配的過程當中,實時構建一個叫壓縮路徑索引(compact path-index,CPI)的數據結構來存儲全部查詢點的候選以及候選之間的鏈接關係。
算法的大致流程
- 基於查詢圖
和數據圖
構建CPI
- 將查詢圖
進行CFL分解(對於不一樣類型點的進行的不一樣的匹配策略)
- 將查詢圖上的點分紅三種:核心點(Core)、森林點(Forest)和葉子點(Leaf)
- 核心點就是查詢圖中知足以下要求的點:任意一個生成樹中這個點都不會包含生成樹之外的相鄰邊;
- 葉子點就是查詢圖中度數爲1的點;
- 森林點就是其它點
- 步驟
- 拿出一個查詢圖中全部度數爲1的點,這些點做爲葉子點;
- 而後,去掉葉子點以後,度數爲1的點就是森林點;
- 這些森林點再被去掉,剩下的結構中度數爲1的點仍是森林點,如此迭代,直到圖中沒有剩下度數爲1點;
- 剩下的點就是核心點。
- 直接使用CPI,查詢點匹配順序必定按照核心點,森林點和葉子點計算
到
全部映射。
算法的具體過程
CPI 簡介
本文根據查詢圖構建一個所謂的壓縮路徑索引(compact path-index,CPI)來實現查詢匹配。框架
算法流程
- 挑選候選匹配少且相鄰邊多的點做爲CPI的根,進而獲得CPI背後的寬度優先搜索樹(CPI構建的具體過程參考下面)
- 根據這個CPI來肯定查詢點匹配,查詢點匹配順序列表爲seq。
- 核心部分
- 首先,對於核心點部分,本文能夠根據CPI獲得從根到葉子的k條路徑p1, p2, …, pk。
- 而後,本文定義一個代價模型肯定各個路徑的匹配代價,假設k條路徑代價從大到小仍然是p1, p2, …, pk
- 最後,依次將p1, p2, …, pk中各個查詢點放到seq中,seq中出現過的點不重複出現。
- 森林點和核心部分相似,也是先獲得若干條路徑,再依次放進seq中。
- 葉子點匹配順序按照葉子點匹配數量來定
CPI的構建
構建過程
- 按寬度優先搜索樹的層次從頂向下依次獲得每一個查詢點的匹配。
- 對於每一層,都儘量多地利用每一個點的父親節點的匹配候選以及這層中其餘兄弟節點的匹配候選來剪枝掉其的匹配候選。
- 利用每一個匹配候選的鄰接表來獲得CPI。
- 在這個CPI上進行自底向上地剪枝,即利用每一個點的孩子節點的匹配候選來剪枝掉其的匹配候選。
例子
自上向下的構建
考慮圖
中的查詢
和圖
中的BFS樹,其中
是根頂點。而後q的頂點被劃分爲三個級別,
級別爲1,
級別爲2,
級別爲3級。rest
- 處理級別1的頂點(即
)。
的候選集合被指定爲
- 考慮級別2的頂點(即
和
)。
- 正向處理,咱們首先處理
,
和
;
被指定爲具備相同標籤
的頂點集合,而且與頂點
相鄰,而且
。其次處理
和
;
被指定爲具備相同標籤
的頂點集合,而且與頂點
相鄰,而且
,但因爲須要
是標籤爲D節點的鄰居,所以由CandVerify修剪
。
- 後向處理,
因爲在
中沒有鄰居,也從
中刪除,
。3)
- 鄰接列表構造,鄰接列表構造如圖
所示。
- 依次類推第三層
自下向上的改進
- 繼續上面例子咱們以
的自下而上的方式細化
的查詢頂點的候選者;假設它們按
的順序處理。
- 首先,
沒有較低級別的鄰居,咱們什麼都不作。在處理
時,咱們經過
的候選
來細化
的候選
;
從
中刪除,由於它在
中沒有鄰居。
- 接下來,在處理
時,從
中刪除
,而且還刪除
的鄰
接列表,如圖
所示。
- 最後,咱們處理
;
實驗
和現有方法方法比
新框架的有效性