程會在搜索完I度后停止搜索,這種情況即為一種lazy情況。
[0065]在一可選實施方式中,上一次圖搜索的結(jié)果信息包括上一次圖搜索已經(jīng)遍歷到的圖頂點。則獲取裝置可以先判斷上述初始狀態(tài)具體是哪種狀態(tài)。若初始狀態(tài)為第一狀態(tài),當(dāng)本次圖搜索的終點對象對應(yīng)的圖頂點不屬于上一次圖搜索已經(jīng)遍歷到的圖頂點,且上一次圖搜索使用的搜索限制條件與本次圖搜索使用的搜索限制條件兼容且是小于關(guān)系時,將初始狀態(tài)修正為第二狀態(tài),以作為圖搜索狀態(tài);若初始狀態(tài)為第二狀態(tài),當(dāng)本次圖搜索的終點對象對應(yīng)的圖頂點屬于上一次圖搜索已經(jīng)遍歷到的圖頂點時,將初始狀態(tài)修改為第一狀態(tài),以作為圖搜索狀態(tài)。進(jìn)一步還包括:若初始狀態(tài)為第三狀態(tài),則直接將初始狀態(tài)作為圖搜索狀態(tài)。
[0066]2024、將初始狀態(tài)作為圖搜索狀態(tài)。
[0067]若上一次圖搜索過程未出現(xiàn)lazy情況,則獲取裝置可以直接將上述初始狀態(tài)作為圖搜索狀態(tài)。
[0068]基于上述,若圖搜索狀態(tài)為第一狀態(tài),則獲取裝置可以直接從上一次圖搜索的結(jié)果信息中獲取本次圖搜索的結(jié)果信息;若圖搜索狀態(tài)為第二狀態(tài),則圖搜索狀態(tài)可以使用本次圖搜索的起始對象、本次圖搜索的終點對象、本次圖搜索的搜索需求和本次圖搜索使用的搜索限制條件,沿著上一次圖搜索最后遍歷到的圖頂點繼續(xù)進(jìn)行圖搜索,以獲得本次圖搜索的結(jié)果信息。
[0069]值得說明的是,本實施例重點描述在同一圖上所進(jìn)行的前后兩次圖搜索中,后一次圖搜索的結(jié)果信息是否可以基于上一次圖搜索的結(jié)果信息獲得,并未限定上一次圖搜索的具體過程。對于上一次圖搜索來說,其結(jié)果信息可以基于其上一次的圖搜索的結(jié)果信息獲得,或者也可以是根據(jù)指定搜索算法重新進(jìn)行圖搜索而獲得。
[0070]在本實施例中,當(dāng)需要獲取圖搜索結(jié)果時,獲取裝置直接獲取本次圖搜索所需的搜索參數(shù),并根據(jù)本次圖搜索所需的搜索參數(shù)和上一次圖搜索信息進(jìn)行比較,確定本次圖搜索的結(jié)果信息可否基于上一次圖搜索的結(jié)果信息得到,并在可以基于上一次圖搜索的結(jié)果信息得到本次圖搜索的結(jié)果信息時,根據(jù)上一次圖搜索的結(jié)果信息獲得本次圖搜索的結(jié)果信息,使得本次圖搜索的結(jié)果信息可以在不啟動或不重新啟動全新圖搜索的條件既可獲得,有利于降低資源消耗,提高圖搜索的響應(yīng)速度和處理效率。
[0071]雖然在上述實施例中并未限定上一次圖搜索的結(jié)果信息是如何獲得的,但在整個圖搜索過程中,始終是需要根據(jù)指定搜索算法進(jìn)行圖搜索的,為便于進(jìn)行圖搜索,獲取裝置需要預(yù)先生成圖搜索所使用的圖。例如,獲取裝置可以預(yù)先獲取關(guān)系網(wǎng)絡(luò)中由各對象之間的關(guān)聯(lián)關(guān)系產(chǎn)生的原始數(shù)據(jù),根據(jù)所獲取的原始數(shù)據(jù)在初始圖中添加圖頂點和邊,以獲得圖搜索使用的圖。
[0072]具體來說,關(guān)系網(wǎng)絡(luò)中的對象可以是昵稱、手機、姓名、地址等。關(guān)系網(wǎng)絡(luò)中有各種各樣的對象,每個對象都是唯一的、不相等的。不同關(guān)系網(wǎng)絡(luò)中的對象根據(jù)信息量的不等可以有多種表示方法。對象之間的關(guān)聯(lián)關(guān)系可以表示為:第一對象、第二對象和關(guān)聯(lián)屬性。比如,第一用戶使用了信用卡進(jìn)行了支付,那么第一對象是:第一用戶,第二對象是:信用卡,兩個對象之間的關(guān)聯(lián)屬性是:支付,這兩個對象之間的關(guān)聯(lián)關(guān)系是有向的。上述對象之間的關(guān)聯(lián)關(guān)系可以存儲為生成圖所需的原始數(shù)據(jù),一般是保存在數(shù)據(jù)庫(例如Hbase數(shù)據(jù)庫)或者文件系統(tǒng)中,在生成圖時由獲取裝置讀取并使用。
[0073]值得說明的是,對象之間的關(guān)聯(lián)關(guān)系的存儲格式會影響構(gòu)建圖的步驟。因為構(gòu)建圖的過程是解析對象之間的關(guān)聯(lián)關(guān)系的過程,需要與對象之間的關(guān)聯(lián)關(guān)系的存儲過程相匹配,只要兩個過程相匹配即可,不限于具體的存儲形式。例如,假設(shè)關(guān)系網(wǎng)絡(luò)有第一對象和第二對象的一條邊,若使用“有向”的方式存儲,那么在數(shù)據(jù)庫中可能會存儲為2行數(shù)據(jù);若使用“無向(無向,即雙向)”的方式存儲,那么在數(shù)據(jù)庫中可能只會存儲為I行數(shù)據(jù)。當(dāng)然,還有其他的存儲方法,例如,如果對象之間的關(guān)聯(lián)關(guān)系表示為:第一對象、第二對象、關(guān)聯(lián)關(guān)系和方向,那么不管邊方向是單向的(只能從一個對象指向另一個對象),還是雙向的,都可以通過“方向”表示出來,那么數(shù)據(jù)庫中也只需要存儲為I行數(shù)據(jù)。
[0074]獲取裝置可以從數(shù)據(jù)庫或文件系統(tǒng)中獲取關(guān)系網(wǎng)絡(luò)中由各對象之間的關(guān)聯(lián)關(guān)系產(chǎn)生的原始數(shù)據(jù),將原始數(shù)據(jù)構(gòu)成原始數(shù)據(jù)列表,該步驟與上述存儲對象之間的關(guān)聯(lián)關(guān)系的過程相對應(yīng)。之后,獲取裝置創(chuàng)建一個鄰接表圖對象,例如通過Map〈圖頂點,列表〈圖邊》存儲所生成的圖的結(jié)構(gòu)、圖頂點和圖邊等信息,并通過Map〈對象,圖頂點〉存儲原始數(shù)據(jù)中對象和其圖頂點的對應(yīng)關(guān)系;從原始數(shù)據(jù)列表中獲取一個未經(jīng)處理的原始數(shù)據(jù),接下來,判斷該原始數(shù)據(jù)對應(yīng)的第一對象是否在圖的Map〈對象,圖頂點 > 的對象中;若不存在,則根據(jù)第一對象構(gòu)造第一對象的圖頂點(主要是指初始化圖頂點有關(guān)信息的過程),并將第一對象放到圖的Map〈對象,圖頂點 > 中;若存在,則獲取第一對象對應(yīng)的圖頂點,根據(jù)原始數(shù)據(jù)對應(yīng)的第二對象構(gòu)造邊(主要是初始化該邊的有關(guān)信息的過程),將由第一對象對應(yīng)的圖頂點和到第二對象對應(yīng)的圖頂點的邊放到圖的Map〈圖頂點,列表 < 圖邊 >> 中,并返回繼續(xù)從原始數(shù)據(jù)列表中獲取一個未經(jīng)處理的原始數(shù)據(jù)及后續(xù)操作,直到原始數(shù)據(jù)列表中不存在未經(jīng)處理的原始數(shù)據(jù)為止,最終獲得圖搜索所使用的圖。
[0075]值得說明的是,上述獲取裝置生成的圖可以是有向圖,也可以是無向圖,具體視關(guān)系網(wǎng)絡(luò)中各對象之間的關(guān)聯(lián)關(guān)系而定。
[0076]在具體實現(xiàn)上,獲取裝置可以通過創(chuàng)建圖搜索裝置,通過圖搜索裝置進(jìn)行圖搜索。獲取裝置可以根據(jù)每次圖搜索所需的搜索參數(shù),對圖搜索裝置進(jìn)行有關(guān)參數(shù)的配置,以便進(jìn)行圖搜索,例如可以配置圖搜索裝置的起始對象、版本號、搜索限制條件以及在圖搜索過程中對應(yīng)搜索限制條件的狀態(tài)參數(shù)等。在圖搜索裝置首次被創(chuàng)建時,可以對圖搜索裝置的各參數(shù)進(jìn)行初始化,例如可以是設(shè)置將起始對象初始化為空,將版本號初始化為預(yù)設(shè)值,例如0,并根據(jù)圖搜索使用的搜索限制條件的不同,將圖搜索裝置的搜索限制條件初始化為不同的預(yù)設(shè)值,將圖搜索裝置的狀態(tài)參數(shù)初始為空等。
[0077]在本實施例中,上述版本號一方面用于標(biāo)記圖搜索裝置的圖搜索過程,另一方面用于標(biāo)記圖搜索裝置在圖搜索過程中已經(jīng)遍歷到的圖頂點。具體的,在圖搜索裝置進(jìn)行圖搜索過程中,可以將已經(jīng)遍歷到的圖頂點的版本號配置為圖搜索裝置的版本號,以標(biāo)識在圖搜索裝置的本次圖搜索過程中已經(jīng)遍歷到的圖頂點。
[0078]基于上述,當(dāng)需要進(jìn)行圖搜索以獲得圖搜索的結(jié)果信息時,可以先對圖搜索裝置進(jìn)行參數(shù)設(shè)置,之后再按照指定的搜索算法進(jìn)行圖搜索。上述需要進(jìn)行圖搜索以獲得圖搜索的結(jié)果信息的場景可以是:上述本次圖搜索的結(jié)果信息需要根據(jù)指定搜索算法重新進(jìn)行圖搜索,即圖搜索狀態(tài)為第三狀態(tài)的場景,或者可以是上述本次圖搜索的結(jié)果信息需要在上一次圖搜索最后遍歷到的圖頂點的基礎(chǔ)上繼續(xù)進(jìn)行圖搜索獲得,即圖搜索狀態(tài)為第二狀態(tài)的場景,或者還可以是第一次獲取圖搜索的結(jié)果信息的場景,等等。
[0079]對于本次圖搜索的結(jié)果信息需要根據(jù)指定搜索算法重新進(jìn)行圖搜索,即圖搜索狀態(tài)為第三狀態(tài)的場景,則可以將圖搜索裝置的版本號加1,將圖搜索裝置的搜索限制條件設(shè)備為本次圖搜索使用的搜索限制條件,清空圖搜索裝置的隊列,將圖搜索裝置的起始對象設(shè)置為本次圖搜索的初始對象,將圖中本次圖搜索的起始對象對應(yīng)的圖頂點的版本號設(shè)置為圖搜索裝置的版本號,將本次圖搜索的起始對象對應(yīng)的圖頂點添加到隊列中,并初始圖搜索過程中對應(yīng)搜索限制條件的狀態(tài)參數(shù)為指定值,例如該狀態(tài)參數(shù)可以是已搜索度數(shù)。
[0080]對于本次圖搜索的結(jié)果信息需要在上一次圖搜索最后遍歷到的圖頂點的基礎(chǔ)上繼續(xù)進(jìn)行圖搜索獲得,即圖搜索狀態(tài)為第二狀態(tài)的場景,則可以將圖搜索裝置的搜索限制條件設(shè)備為本次圖搜索使用的搜索限制條件,并初始化圖搜索過程中對應(yīng)搜索限制條件的狀態(tài)參數(shù)為指定值,例如該狀態(tài)參數(shù)可以是已搜索度數(shù),圖搜索裝置的其他參數(shù)保持不變。[0081 ] 本實施例以圖搜索使用的圖為無向圖,且以指定的搜索算法為廣度優(yōu)先搜索算法為例,說明一次圖搜索的過程,如圖4所示,該過程具體包括:
[0082]1、判斷圖搜索裝置的隊列是否為空(即隊列中圖頂點個數(shù)是否為O),如果為空,則結(jié)束當(dāng)前步驟,進(jìn)入步驟18 ;如果不為空,則進(jìn)入步驟2。
[0083]2、從隊列獲取第一個圖頂點V,并獲取圖頂點V中最短路徑度數(shù)值,并進(jìn)入步驟3。
[0084]3、判斷圖頂點V的最短路徑度數(shù)是否大于圖搜索裝置的已遍歷度數(shù),如果是,則結(jié)束當(dāng)前步驟,進(jìn)入步驟18 ;如果否,則進(jìn)入步驟4。
[0085]4、從隊列中刪除第一個圖頂點V,獲取圖頂點V的相鄰圖邊列表,計算通過圖頂點V往下I度遍歷到的圖頂點的最短路徑度數(shù)dh為圖頂點V的最短路徑度數(shù)+1。
[0086]5、判斷圖頂點V的相鄰圖列表中的圖邊是否已經(jīng)全部被遍歷到,如果是,則結(jié)束當(dāng)前步驟,進(jìn)入步驟I,如果否,進(jìn)入步驟6。
[0087]6、獲取圖頂點V的相鄰圖列表中一個還未被遍歷到的圖邊,并進(jìn)入步驟7。
[0088]7、判斷上述獲取的圖邊的邊屬性和/或相鄰圖頂點(記為圖頂點vu)是否會被圖搜索限制條件給限制(過濾),并將判斷結(jié)果記為isFilter,并進(jìn)入步驟8。其中,isFilter取值為真(true):表示會被限定條件給過濾,isFilter取值為假(false):表示不被過濾。
[0089]8、判斷圖頂點vu的版本號小于圖搜索裝置的當(dāng)前版本號,若是,即圖頂點vu的版本號小于圖搜索裝置的當(dāng)前版本號,進(jìn)入步驟9 ;若否,進(jìn)行步驟16。
[0090]9、判斷isFilter的取值是否為真,且圖頂點vu對應(yīng)的對象是否不等于本次圖搜索的終點對象,若是,即isFilter的取值為真,且圖頂點vu對應(yīng)的對象不等于本次圖搜索的終點對象,進(jìn)入步驟10 ;若否,進(jìn)行如步驟11
[0091]10、設(shè)置圖頂點vu