本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種多跳鄰居節(jié)點(diǎn)的獲取方法和裝置。
背景技術(shù):
一個(gè)社交網(wǎng)絡(luò)是一個(gè)連接獨(dú)立個(gè)體和組織的網(wǎng)絡(luò)?,F(xiàn)在有很多的社交網(wǎng)絡(luò),例如Facebook,Twitter,論文引用網(wǎng)絡(luò),Skype通信網(wǎng)絡(luò),博客網(wǎng)絡(luò)和人人網(wǎng)等等呈現(xiàn)出了一片繁榮的景象。在社交網(wǎng)絡(luò)中一個(gè)頂點(diǎn)代表一個(gè)對象,例如:一個(gè)論文,一個(gè)傳感器,一個(gè)人等等都可以作為一個(gè)頂點(diǎn),邊代表頂點(diǎn)與頂點(diǎn)之間的關(guān)系,關(guān)系可以有合作論文的關(guān)系、朋友關(guān)系、師生關(guān)系、論文的引用關(guān)系等等。
多跳鄰居在大圖上的應(yīng)用非常廣泛,例如社區(qū)發(fā)現(xiàn)、廣告推薦或朋友推薦、鏈接預(yù)測,查找朋友的朋友等等。在大圖上,獲得指定頂點(diǎn)的多跳鄰居的常用方法是進(jìn)行廣度優(yōu)先搜索(英文全稱:Breadth First Search,英文簡稱:BFS),該方法可以從指定頂點(diǎn)開始沿著其出邊向其鄰接頂點(diǎn)進(jìn)行信息傳送,鄰接頂點(diǎn)再將該信息繼續(xù)向自己的鄰居傳送,直到達(dá)到其所需要的鄰居節(jié)點(diǎn)為止。
在分布式圖的處理框架中,采用的BFS方法經(jīng)過多次迭代以獲得所需要的多跳鄰居的信息,而在每次迭代過程中都要在網(wǎng)絡(luò)中發(fā)送消息,隨著搜索過程的加深,消息量不斷加大,網(wǎng)絡(luò)通信代價(jià)非常大。因此現(xiàn)有的BFS方法進(jìn)行多跳鄰居的計(jì)算會產(chǎn)生大量的網(wǎng)絡(luò)通信代價(jià),特別是一些稠密圖或冪律圖,大量的信息傳輸會導(dǎo)致網(wǎng)絡(luò)阻塞,這都會降低在大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供了一種多跳鄰居節(jié)點(diǎn)的獲取方法和裝置,用于提升在 大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
為解決上述技術(shù)問題,本發(fā)明實(shí)施例提供以下技術(shù)方案:
第一方面,本發(fā)明實(shí)施例提供一種多跳鄰居節(jié)點(diǎn)的獲取方法,包括:
獲取拓?fù)渚W(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)的0跳鄰居,得到全節(jié)點(diǎn)0跳鄰居集合,所述全節(jié)點(diǎn)0跳鄰居集合包括:每個(gè)起始節(jié)點(diǎn)和對應(yīng)的目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,其中,所述起始節(jié)點(diǎn)指的是所述拓?fù)渚W(wǎng)絡(luò)中的任意一個(gè)節(jié)點(diǎn),所述目的節(jié)點(diǎn)指的是在所述拓?fù)渚W(wǎng)絡(luò)中與所述起始節(jié)點(diǎn)存在連邊關(guān)系的節(jié)點(diǎn);
當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),通過如下的迭代計(jì)算過程計(jì)算所述第一節(jié)點(diǎn)的k+1跳鄰居集合,所述k為大于等于0且小于預(yù)置的跳數(shù)閾值kmax的自然數(shù),所述迭代計(jì)算過程包括如下的步驟a和步驟b,其中,
步驟a、獲取所述第一節(jié)點(diǎn)的k跳鄰居集合,所述第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對;
步驟b、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合,其中,所述兩個(gè)節(jié)點(diǎn)對分別來自所述第一節(jié)點(diǎn)的k跳鄰居集合、所述全節(jié)點(diǎn)0跳鄰居集合;
在計(jì)算出所述第一節(jié)點(diǎn)的k+1跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
結(jié)合第一方面,在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述方法還包括:
當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1小于所述kmax時(shí),按照所述步驟a和步驟b的迭代計(jì)算方式計(jì)算所述第一節(jié)點(diǎn)的k+2跳鄰居集合;
在計(jì)算出所述第一節(jié)點(diǎn)的k+2跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+2跳鄰居集合中的跳數(shù)k+2等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+2跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
結(jié)合第一方面,在第一方面的第二種可能的實(shí)現(xiàn)方式中,所述步驟a執(zhí)行之后,所述迭代計(jì)算過程還包括:步驟a+1,其中,
步驟a+1,對所述第一節(jié)點(diǎn)的k跳鄰居集合中的節(jié)點(diǎn)對進(jìn)行反轉(zhuǎn),得到所 述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合,所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合包括:反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)和反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,所述反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳目的節(jié)點(diǎn),所述反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳起始節(jié)點(diǎn);
所述步驟b,具體為:步驟b’,其中,
步驟b’、將所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合中反轉(zhuǎn)后的k跳起始節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
結(jié)合第一方面,在第一方面的第三種可能的實(shí)現(xiàn)方式中,所述步驟b,包括:步驟b”和步驟b”’,其中,
步驟b”、從所述全節(jié)點(diǎn)0跳鄰居集合中篩選出所有起始節(jié)點(diǎn)與所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn)相同的節(jié)點(diǎn)對,篩選節(jié)點(diǎn)對完成之后得到所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合;
步驟b”’、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
結(jié)合第一方面的第三種可能的實(shí)現(xiàn)方式,在第一方面的第四種可能的實(shí)現(xiàn)方式中,所述步驟b,還包括:步驟b””,其中,
步驟b””、判斷所述k+1是否等于1,或判斷所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)是否滿足預(yù)置的節(jié)點(diǎn)對條件;
若所述k+1等于1,則執(zhí)行步驟b”和步驟b”’;
若所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)滿足所述節(jié)點(diǎn)對條件,則執(zhí)行步驟b”和步驟b”’。
結(jié)合第一方面,在第一方面的第五種可能的實(shí)現(xiàn)方式中,若所述第一節(jié)點(diǎn)存在至少兩個(gè)的指定節(jié)點(diǎn)k+1跳鄰居集合時(shí),所述迭代計(jì)算過程是并行的計(jì)算所述第一節(jié)點(diǎn)的各個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合。
第二方面,本發(fā)明實(shí)施例還提供一種多跳鄰居節(jié)點(diǎn)的獲取裝置,包括:獲取模塊、迭代計(jì)算模塊和輸出模塊,其中,
所述獲取模塊,用于獲取拓?fù)渚W(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)的0跳鄰居,得到全節(jié)點(diǎn)0跳鄰居集合,所述全節(jié)點(diǎn)0跳鄰居集合包括:每個(gè)起始節(jié)點(diǎn)和對應(yīng)的目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,其中,所述起始節(jié)點(diǎn)指的是所述拓?fù)渚W(wǎng)絡(luò)中的任意一個(gè)節(jié)點(diǎn),所述目的節(jié)點(diǎn)指的是在所述拓?fù)渚W(wǎng)絡(luò)中與所述起始節(jié)點(diǎn)存在連邊關(guān)系的節(jié)點(diǎn);
所述迭代計(jì)算模塊,用于當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),通過如下的迭代計(jì)算過程計(jì)算所述第一節(jié)點(diǎn)的k+1跳鄰居集合,所述k為大于等于0且小于預(yù)置的跳數(shù)閾值kmax的自然數(shù),所述迭代計(jì)算過程包括如下的步驟a和步驟b,其中,
步驟a、獲取所述第一節(jié)點(diǎn)的k跳鄰居集合,所述第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對;
步驟b、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合,其中,所述兩個(gè)節(jié)點(diǎn)對分別來自所述第一節(jié)點(diǎn)的k跳鄰居集合、所述全節(jié)點(diǎn)0跳鄰居集合;
所述輸出模塊,用于在計(jì)算出所述第一節(jié)點(diǎn)的k+1跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
結(jié)合第二方面,在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述迭代計(jì)算模塊,還用于當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1小于所述kmax時(shí),按照所述步驟a和步驟b的迭代計(jì)算方式計(jì)算所述第一節(jié)點(diǎn)的k+2跳鄰居集合;
所述輸出模塊,還用于在計(jì)算出所述第一節(jié)點(diǎn)的k+2跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+2跳鄰居集合中的跳數(shù)k+2等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+2跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
結(jié)合第二方面,在第二方面的第二種可能的實(shí)現(xiàn)方式中,所述迭代計(jì)算模塊,還用于所述步驟a執(zhí)行之后,執(zhí)行所述迭代計(jì)算過程還包括的步驟a+1,其中,
步驟a+1,對所述第一節(jié)點(diǎn)的k跳鄰居集合中的節(jié)點(diǎn)對進(jìn)行反轉(zhuǎn),得到所 述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合,所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合包括:反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)和反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,所述反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳目的節(jié)點(diǎn),所述反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳起始節(jié)點(diǎn);
所述迭代計(jì)算模塊,具體用于執(zhí)行步驟b’,其中,
步驟b’、將所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合中反轉(zhuǎn)后的k跳起始節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
結(jié)合第二方面,在第二方面的第三種可能的實(shí)現(xiàn)方式中,所述迭代計(jì)算模塊,具體用于執(zhí)行步驟b”和步驟b”’,其中,
步驟b”、從所述全節(jié)點(diǎn)0跳鄰居集合中篩選出所有起始節(jié)點(diǎn)與所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn)相同的節(jié)點(diǎn)對,篩選節(jié)點(diǎn)對完成之后得到所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合;
步驟b”’、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第二方面的第四種可能的實(shí)現(xiàn)方式中,所述迭代計(jì)算模塊,具體用于執(zhí)行步驟b””,其中,
步驟b””、判斷所述k+1是否等于1,或判斷所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)是否滿足預(yù)置的節(jié)點(diǎn)對條件;
若所述k+1等于1,則執(zhí)行步驟b”和步驟b”’;
若所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)滿足所述節(jié)點(diǎn)對條件,則執(zhí)行步驟b”和步驟b”’。
結(jié)合第二方面,在第二方面的第五種可能的實(shí)現(xiàn)方式中,若所述第一節(jié)點(diǎn)存在至少兩個(gè)的指定節(jié)點(diǎn)k+1跳鄰居集合時(shí),所述迭代計(jì)算模塊,具體用于并行的計(jì)算所述第一節(jié)點(diǎn)的各個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合。
從以上技術(shù)方案可以看出,本發(fā)明實(shí)施例具有以下優(yōu)點(diǎn):
在本發(fā)明實(shí)施例中,首先根據(jù)拓?fù)渚W(wǎng)絡(luò)中所有節(jié)點(diǎn)之間的連邊關(guān)系得到 全節(jié)點(diǎn)0跳鄰居集合,當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),從第一節(jié)點(diǎn)的k跳鄰居集合通過本發(fā)明實(shí)施例中的迭代計(jì)算過程可以計(jì)算出第一節(jié)點(diǎn)的k+1跳鄰居集合,由于全節(jié)點(diǎn)0跳鄰居集合中記錄有所有節(jié)點(diǎn)作為起始節(jié)點(diǎn)時(shí)對應(yīng)的目的節(jié)點(diǎn),步驟b中第一節(jié)點(diǎn)的k跳鄰居集合和全節(jié)點(diǎn)0跳鄰居集合中滿足k跳目的節(jié)點(diǎn)和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同時(shí)的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,第一節(jié)點(diǎn)的k+1跳鄰居集合相對于第一節(jié)點(diǎn)的k跳鄰居集合增加了具有連邊關(guān)系的節(jié)點(diǎn),當(dāng)跳數(shù)k+1等于預(yù)置的kmax時(shí),將第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出,從第一節(jié)點(diǎn)的kmax跳鄰居集合可以獲取到第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)。本發(fā)明實(shí)施例中通過節(jié)點(diǎn)對之間的連接操作可以完成多跳鄰居節(jié)點(diǎn)的計(jì)算,而不需要在拓?fù)渚W(wǎng)絡(luò)中發(fā)送消息,從而可以提升在大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域的技術(shù)人員來講,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的一種多跳鄰居節(jié)點(diǎn)的獲取方法的流程方框示意圖;
圖2為本發(fā)明實(shí)施例提供的另一種多跳鄰居節(jié)點(diǎn)的獲取方法的流程方框示意圖;
圖3為本發(fā)明實(shí)施例提供的節(jié)點(diǎn)對的連接過程的一種應(yīng)用場景示意圖;
圖4為本發(fā)明實(shí)施例提供的全節(jié)點(diǎn)0跳鄰居集合的過濾過程示意圖;
圖5為本發(fā)明實(shí)施例提供的一種多跳鄰居節(jié)點(diǎn)的獲取裝置的組成結(jié)構(gòu)示意圖;
圖6為本發(fā)明實(shí)施例提供的另一種多跳鄰居節(jié)點(diǎn)的獲取裝置的組成結(jié)構(gòu)示意圖。
具體實(shí)施方式
本發(fā)明實(shí)施例提供了一種多跳鄰居節(jié)點(diǎn)的獲取方法和裝置,用于提升在大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
為使得本發(fā)明的發(fā)明目的、特征、優(yōu)點(diǎn)能夠更加的明顯和易懂,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,下面所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而非全部實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域的技術(shù)人員所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的術(shù)語在適當(dāng)情況下可以互換,這僅僅是描述本發(fā)明的實(shí)施例中對相同屬性的對象在描述時(shí)所采用的區(qū)分方式。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,以便包含一系列單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于那些單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它單元。
以下分別進(jìn)行詳細(xì)說明。
本發(fā)明多跳鄰居節(jié)點(diǎn)的獲取方法的一個(gè)實(shí)施例,可應(yīng)用于大圖中對指定節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)的確定中,請參閱圖1所示,本發(fā)明一個(gè)實(shí)施例提供的多跳鄰居節(jié)點(diǎn)的獲取方法,可以包括如下步驟:
101、獲取拓?fù)渚W(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)的0跳鄰居,得到全節(jié)點(diǎn)0跳鄰居集合。
其中,全節(jié)點(diǎn)0跳鄰居集合包括:每個(gè)起始節(jié)點(diǎn)和對應(yīng)的目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,起始節(jié)點(diǎn)指的是拓?fù)渚W(wǎng)絡(luò)中的任意一個(gè)節(jié)點(diǎn),目的節(jié)點(diǎn)指的是在拓?fù)渚W(wǎng)絡(luò)中與起始節(jié)點(diǎn)存在連邊關(guān)系的節(jié)點(diǎn)。
在本發(fā)明實(shí)施例中,拓?fù)渚W(wǎng)絡(luò)可以是包括很多的節(jié)點(diǎn)(本發(fā)明實(shí)施例中節(jié)點(diǎn)也可以稱為頂點(diǎn))和連邊,該拓?fù)渚W(wǎng)絡(luò)可以是一個(gè)大圖,在大圖中節(jié)點(diǎn)個(gè)數(shù)和節(jié)點(diǎn)之間的連邊都很多,本發(fā)明實(shí)施例中提供的多跳鄰居節(jié)點(diǎn)的獲取方法中可以根據(jù)拓?fù)渚W(wǎng)絡(luò)中的節(jié)點(diǎn)和節(jié)點(diǎn)之間的連邊關(guān)系構(gòu)造出節(jié)點(diǎn)對,例如,拓?fù)渚W(wǎng)絡(luò)中的一個(gè)節(jié)點(diǎn)作為起始節(jié)點(diǎn),與該起始節(jié)點(diǎn)之間存在連邊關(guān)系的節(jié)點(diǎn)作為該起始節(jié)點(diǎn)對應(yīng)的目的節(jié)點(diǎn),一個(gè)起始節(jié)點(diǎn)和一個(gè)目的節(jié)點(diǎn)可以 構(gòu)成一個(gè)節(jié)點(diǎn)對,該節(jié)點(diǎn)對可以表示為(起始節(jié)點(diǎn),對應(yīng)的目的節(jié)點(diǎn))。若一個(gè)起始節(jié)點(diǎn)存在多個(gè)目的節(jié)點(diǎn),則該起始節(jié)點(diǎn)可以多個(gè)目的節(jié)點(diǎn)構(gòu)成多個(gè)節(jié)點(diǎn)對,拓?fù)渚W(wǎng)絡(luò)中的所有節(jié)點(diǎn)都作為起始節(jié)點(diǎn)時(shí)分別可以構(gòu)造出該從該起始節(jié)點(diǎn)對應(yīng)的節(jié)點(diǎn)對,當(dāng)以所有的節(jié)點(diǎn)都作為起始節(jié)點(diǎn)構(gòu)造出節(jié)點(diǎn)對之后,可以得到本發(fā)明實(shí)施例中所述的全節(jié)點(diǎn)0跳鄰居集合,其中0跳指的是具有連接關(guān)系的起始節(jié)點(diǎn)和目的節(jié)點(diǎn)之間的跳數(shù)。舉例說明如下,全節(jié)點(diǎn)0跳鄰居集合中包括:節(jié)點(diǎn)對1和節(jié)點(diǎn)2,節(jié)點(diǎn)對1為(節(jié)點(diǎn)1,節(jié)點(diǎn)2),節(jié)點(diǎn)對2為(節(jié)點(diǎn)2,節(jié)點(diǎn)3),則節(jié)點(diǎn)1和節(jié)點(diǎn)2為0跳鄰居,節(jié)點(diǎn)2和節(jié)點(diǎn)3為0跳鄰居節(jié)點(diǎn)。
需要說明的是,在本發(fā)明實(shí)施例中,全節(jié)點(diǎn)0跳鄰居集合中記錄有所有節(jié)點(diǎn)作為起始節(jié)點(diǎn)時(shí)對應(yīng)的目的節(jié)點(diǎn),在后續(xù)實(shí)施例中每一輪的迭代計(jì)算中都需要從全節(jié)點(diǎn)0跳鄰居集合中來獲取存在連邊關(guān)系的起始節(jié)點(diǎn)和目的節(jié)點(diǎn)。另外本發(fā)明實(shí)施例中,只需要從拓?fù)渚W(wǎng)絡(luò)中提取到全節(jié)點(diǎn)0跳鄰居集合即可,而不需要每次迭代過程中都在拓?fù)渚W(wǎng)絡(luò)中發(fā)送消息,因此本發(fā)明實(shí)施例提供的方法可以適用于查詢大圖的多跳鄰居節(jié)點(diǎn),不會造成網(wǎng)絡(luò)的阻塞。
102、當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),通過如下的迭代計(jì)算過程計(jì)算第一節(jié)點(diǎn)的k+1跳鄰居集合,k為大于等于0且小于預(yù)置的跳數(shù)閾值kmax的自然數(shù),迭代計(jì)算過程包括如下的步驟a和步驟b。其中,
步驟a、獲取第一節(jié)點(diǎn)的k跳鄰居集合,第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對;
步驟b、將第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接(英文名稱:join)為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到第一節(jié)點(diǎn)的k+1跳鄰居集合,其中,兩個(gè)節(jié)點(diǎn)對分別來自第一節(jié)點(diǎn)的k跳鄰居集合、全節(jié)點(diǎn)0跳鄰居集合。
在步驟102中用戶可以指定拓?fù)渚W(wǎng)絡(luò)中的任何一個(gè)節(jié)點(diǎn)進(jìn)行多跳鄰居節(jié)點(diǎn)的查詢,本發(fā)明實(shí)施例中將用戶從拓?fù)渚W(wǎng)絡(luò)中選擇的指定頂點(diǎn)定義為第一節(jié)點(diǎn),步驟102和步驟103中以計(jì)算第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)進(jìn)行說明,進(jìn)一步的,在步驟102中可以包括步驟a和步驟b,具體以迭代計(jì)算過程中從第一節(jié)點(diǎn)的k跳鄰居集合到第一節(jié)點(diǎn)的k+1跳鄰居集合的迭代進(jìn)行詳細(xì)說明。 其中,k可以指的是從0到kmax之間的任何一個(gè)值(k可以取0,1,2,…,kmax-1中的任何一個(gè)值),另外在每一輪的迭代計(jì)算過程中輸入值均來自上一輪的迭代計(jì)算結(jié)果,即每一輪的迭代計(jì)算結(jié)果都可以作為下一輪的輸入值。
需要說明的是,在初始的第一輪迭代計(jì)算中,k的取值為0,此時(shí)第一節(jié)點(diǎn)的0跳鄰居集合指的是從全節(jié)點(diǎn)0跳鄰居集合中篩選出的以第一節(jié)點(diǎn)為起始節(jié)點(diǎn)的所有節(jié)點(diǎn)對,即在全節(jié)點(diǎn)0跳鄰居集合中選擇出起始節(jié)點(diǎn)為第一節(jié)點(diǎn)的節(jié)點(diǎn)對,這些節(jié)點(diǎn)對構(gòu)成了第一節(jié)點(diǎn)的0跳鄰居集合。得到第一節(jié)點(diǎn)的0跳鄰居集合之后,通過執(zhí)行本發(fā)明實(shí)施例中描述的步驟a和步驟b可以得到第一節(jié)點(diǎn)的1跳鄰居集合,然后以第一節(jié)點(diǎn)的1跳鄰居集合作為輸入值來繼續(xù)執(zhí)行步驟a和步驟b,則可以得到第一節(jié)點(diǎn)的2跳鄰居集合,以此類型。需要說明的是,在每完成一輪的迭代計(jì)算之后,都需要判斷是否滿足跳數(shù)k+1等于kmax的條件,若滿足該條件,則需要執(zhí)行步驟103,否則更新k的取值繼續(xù)執(zhí)行步驟a和步驟b,接下來對本發(fā)明實(shí)施例中一輪的迭代計(jì)算過程進(jìn)行詳細(xì)說明。
在步驟a中,獲取第一節(jié)點(diǎn)的k跳鄰居集合,第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對。由前述描述可知,第一節(jié)點(diǎn)的k跳鄰居集合可以通過上一輪的迭代計(jì)算結(jié)果來獲取到,在第一節(jié)點(diǎn)的k跳鄰居集合中記錄有從0跳到k跳的所有鄰居節(jié)點(diǎn)。其中,第一節(jié)點(diǎn)的k跳鄰居集合中包括有k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,該節(jié)點(diǎn)對中k跳起始節(jié)點(diǎn)表示的是在第k跳的迭代計(jì)算過程中具有連邊關(guān)系的起始節(jié)點(diǎn),該節(jié)點(diǎn)對中k跳目的節(jié)點(diǎn)表示的是在第k跳的迭代計(jì)算過程中需要繼續(xù)擴(kuò)展連邊關(guān)系的節(jié)點(diǎn)。舉例說明如下,全節(jié)點(diǎn)0跳鄰居集合中包括:節(jié)點(diǎn)對1和節(jié)點(diǎn)2,節(jié)點(diǎn)對1為(節(jié)點(diǎn)1,節(jié)點(diǎn)2),節(jié)點(diǎn)對2為(節(jié)點(diǎn)2,節(jié)點(diǎn)3),則節(jié)點(diǎn)1和節(jié)點(diǎn)2為0跳鄰居,節(jié)點(diǎn)2和節(jié)點(diǎn)3為0跳鄰居節(jié)點(diǎn)。節(jié)點(diǎn)1和節(jié)點(diǎn)3之間為1跳鄰居節(jié)點(diǎn),并且節(jié)點(diǎn)1和節(jié)點(diǎn)3通過節(jié)點(diǎn)2成為1跳鄰居節(jié)點(diǎn),為了能夠表示節(jié)點(diǎn)1和節(jié)點(diǎn)3之間的連接節(jié)點(diǎn)都有哪些,可以將節(jié)點(diǎn)2寫入到節(jié)點(diǎn)對中,將1跳鄰居節(jié)點(diǎn)對表示為(節(jié)點(diǎn)2,(節(jié)點(diǎn)1,節(jié)點(diǎn)3))。
在第k跳的迭代計(jì)算過程中,步驟a執(zhí)行之后就執(zhí)行步驟b,判斷第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和全節(jié)點(diǎn)0跳鄰居集合中的哪些起始節(jié) 點(diǎn)相同,從全節(jié)點(diǎn)0跳鄰居集合中查找到起始節(jié)點(diǎn)為第一節(jié)點(diǎn)的k跳鄰居集合中的k跳目的節(jié)點(diǎn)的節(jié)點(diǎn)對,將第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到第一節(jié)點(diǎn)的k+1跳鄰居集合,其中,兩個(gè)節(jié)點(diǎn)對分別來自第一節(jié)點(diǎn)的k跳鄰居集合、全節(jié)點(diǎn)0跳鄰居集合。本發(fā)明實(shí)施例中將兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,是將兩個(gè)節(jié)點(diǎn)對中的所有節(jié)點(diǎn)表示在同一個(gè)連接后形成的節(jié)點(diǎn)對中。舉例說明如下,第一節(jié)點(diǎn)的k跳鄰居集合的節(jié)點(diǎn)對為(節(jié)點(diǎn)x,節(jié)點(diǎn)y),則k跳起始節(jié)點(diǎn)為節(jié)點(diǎn)x,k跳目的節(jié)點(diǎn)為節(jié)點(diǎn)y,全節(jié)點(diǎn)0跳鄰居集合的節(jié)點(diǎn)對未(節(jié)點(diǎn)y,節(jié)點(diǎn)z),則全節(jié)點(diǎn)0跳鄰居集合中的起始節(jié)點(diǎn)為節(jié)點(diǎn)y,全節(jié)點(diǎn)0跳鄰居集合的目的節(jié)點(diǎn)為節(jié)點(diǎn)z,則由于兩個(gè)節(jié)點(diǎn)對中均有節(jié)點(diǎn)y,則兩個(gè)節(jié)點(diǎn)可以連接為一個(gè)節(jié)點(diǎn)對,連接后的節(jié)點(diǎn)對可以表示為(節(jié)點(diǎn)y,(節(jié)點(diǎn)x,節(jié)點(diǎn)z))。
需要說明的是,在本發(fā)明實(shí)施例中,可以連接為一個(gè)節(jié)點(diǎn)對的兩個(gè)節(jié)點(diǎn)對分別來自第一節(jié)點(diǎn)的k跳鄰居集合、全節(jié)點(diǎn)0跳鄰居集合,并且兩個(gè)節(jié)點(diǎn)對中,第一節(jié)點(diǎn)的k跳鄰居集合的節(jié)點(diǎn)對的k跳目的節(jié)點(diǎn)和全節(jié)點(diǎn)0跳鄰居集合的節(jié)點(diǎn)對的起始節(jié)點(diǎn)相同。
在本發(fā)明的一些實(shí)施例中,步驟a執(zhí)行之后,本發(fā)明實(shí)施例中步驟102所述的迭代計(jì)算過程還可以包括:步驟a+1,其中,
步驟a+1,對第一節(jié)點(diǎn)的k跳鄰居集合中的節(jié)點(diǎn)對進(jìn)行反轉(zhuǎn),得到第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合,第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合包括:反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)和反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)為第一節(jié)點(diǎn)的k跳鄰居集合中的k跳目的節(jié)點(diǎn),反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)為第一節(jié)點(diǎn)的k跳鄰居集合中的k跳起始節(jié)點(diǎn)。
具體的,在步驟a中獲取到第一節(jié)點(diǎn)的k跳鄰居集合之后,第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,則對第一節(jié)點(diǎn)的k跳鄰居集合進(jìn)行反轉(zhuǎn)指的是對第一節(jié)點(diǎn)的k跳鄰居集合中的起始節(jié)點(diǎn)和目的節(jié)點(diǎn)進(jìn)行對調(diào),則第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合包括:反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)和反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對。通過步驟a+1的反轉(zhuǎn)步驟,可以使得第一節(jié)點(diǎn)的k跳鄰居集合中的起始節(jié)點(diǎn)和目的節(jié)點(diǎn)進(jìn)行對 調(diào),方便于后續(xù)步驟的兩個(gè)節(jié)點(diǎn)對的連接操作。
在本發(fā)明實(shí)施例的迭代計(jì)算過程中執(zhí)行步驟a+1的情況下,上述的步驟b,具體為:步驟b’,其中,
步驟b’、將第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合中反轉(zhuǎn)后的k跳起始節(jié)點(diǎn),和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到第一節(jié)點(diǎn)的k+1跳鄰居集合。
通過前述步驟a和步驟a+1的描述可知,可以獲取到第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合,則可以從第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合和全節(jié)點(diǎn)0跳鄰居集合中選擇兩個(gè)集合采用相同起始節(jié)點(diǎn)的兩個(gè)節(jié)點(diǎn)對,從而便于步驟b’中兩個(gè)節(jié)點(diǎn)對的連接操作,其中,步驟b’中的連接操作的方式與前述步驟b中所述的連接操作相類似,此處不再贅述。
在本發(fā)明的一些實(shí)施例中,前述的步驟b,具體包括:步驟b”和步驟b”’,其中,
步驟b”、從全節(jié)點(diǎn)0跳鄰居集合中篩選出所有起始節(jié)點(diǎn)與第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn)相同的節(jié)點(diǎn)對,篩選節(jié)點(diǎn)對完成之后得到第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合;
步驟b”’、將第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到第一節(jié)點(diǎn)的k+1跳鄰居集合。
其中,步驟b的一種可實(shí)現(xiàn)方式是通過步驟b”和步驟b”’來完成。步驟b”中首先對全節(jié)點(diǎn)0跳鄰居集合進(jìn)行篩選,從而可以得到第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合,通過步驟b”的篩選操作,可以節(jié)省后續(xù)步驟中的連接操作的數(shù)據(jù)量,從而可以有效提高節(jié)點(diǎn)對的連接效率。在步驟b”中,篩選出全節(jié)點(diǎn)0跳鄰居集合中以第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn)作為起始節(jié)點(diǎn)的節(jié)點(diǎn)對,全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)不是上述k跳目的節(jié)點(diǎn)的節(jié)點(diǎn)對與本次的迭代計(jì)算過程無關(guān),因此可以在根據(jù)第一節(jié)點(diǎn)的k跳鄰居集合對全節(jié)點(diǎn)0跳鄰居集合進(jìn)行過濾,減少步驟b”’中的連接操作的計(jì)算量。
進(jìn)一步的,在本發(fā)明的一些實(shí)施例中,在執(zhí)行步驟b”和步驟b”’之前,步驟b還可以包括:步驟b””,其中,
步驟b””、判斷k+1是否等于1,或判斷第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)是否滿足預(yù)置的節(jié)點(diǎn)對條件;
若k+1等于1,則執(zhí)行步驟b”和步驟b”’;
若第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)滿足節(jié)點(diǎn)對條件,則執(zhí)行步驟b”和步驟b”’。
例如,若k=0,則說明步驟b”和步驟b”’中是0跳的迭代計(jì)算,此時(shí)可以執(zhí)行步驟b”和步驟b”’,通過根據(jù)第一節(jié)點(diǎn)的k跳鄰居集合對全節(jié)點(diǎn)0跳鄰居集合進(jìn)行過濾,減少步驟b”’中的連接操作的計(jì)算量。例如,還可以根據(jù)第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)來判斷是否執(zhí)行步驟b”和步驟b”’,具體的,可以設(shè)置節(jié)點(diǎn)對條件,例如節(jié)點(diǎn)對條件為小于節(jié)點(diǎn)對個(gè)數(shù)閾值,或者小于全節(jié)點(diǎn)0跳鄰居集合包括的節(jié)點(diǎn)對個(gè)數(shù)的某個(gè)比例值,當(dāng)設(shè)置完成節(jié)點(diǎn)對條件設(shè)置后,可以先判斷第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)是否滿足預(yù)置的節(jié)點(diǎn)對條件,在條件滿足時(shí)執(zhí)行步驟b”和步驟b”’。
需要說明的是,在本發(fā)明實(shí)施例中,為了保證迭代計(jì)算過程的計(jì)算效率,可以采用并行的計(jì)算方式,若第一節(jié)點(diǎn)存在至少兩個(gè)的指定節(jié)點(diǎn)k+1跳鄰居集合時(shí),迭代計(jì)算過程是并行的計(jì)算第一節(jié)點(diǎn)的各個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合。其中,當(dāng)本發(fā)明實(shí)施例中拓?fù)渚W(wǎng)絡(luò)的規(guī)模很大時(shí),可以對該拓?fù)渚W(wǎng)絡(luò)中劃分為多個(gè)塊圖,在每一個(gè)塊圖中都可以執(zhí)行步驟a和步驟b,則在每一個(gè)塊圖中都可以得到第一節(jié)點(diǎn)的一個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合,則第一節(jié)點(diǎn)存在至少兩個(gè)的指定節(jié)點(diǎn)k+1跳鄰居集合,在這種情況下,可以對每個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合并行的執(zhí)行迭代計(jì)算過程,從而可以進(jìn)一步的提高多跳鄰居節(jié)點(diǎn)的獲取效率。
103、在計(jì)算出第一節(jié)點(diǎn)的k+1跳鄰居集合之后,當(dāng)?shù)谝还?jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1等于kmax時(shí),將第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
在本發(fā)明實(shí)施例中,步驟102中的包括的步驟a和步驟b只描述了第k跳的迭代計(jì)算過程,則隨著k取值的依次遞增,可以計(jì)算出多輪的迭代計(jì)算過程,在每完成一輪的迭代計(jì)算之后,都需要判斷是否滿足跳數(shù)k+1等于kmax的條件,若滿足該條件,則需要執(zhí)行步驟103,否則更新k的取值繼續(xù)執(zhí)行步 驟a和步驟b。在通過步驟a和步驟b的迭代計(jì)算之后,當(dāng)?shù)谝还?jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1等于kmax時(shí),將第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。其中,k+1跳鄰居集合對應(yīng)的k+1跳路徑,指的是在k+1跳鄰居集合中的節(jié)點(diǎn)對包括的所有節(jié)點(diǎn)的之間的連接關(guān)系路徑,舉例說明,若節(jié)點(diǎn)對可以示為(節(jié)點(diǎn)y,(節(jié)點(diǎn)x,節(jié)點(diǎn)z)),則可以輸出的2跳路徑為:節(jié)點(diǎn)x->2節(jié)點(diǎn)y->節(jié)點(diǎn)z。在第一節(jié)點(diǎn)的k+1跳鄰居集合中包含了第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn),用戶可以通過第一節(jié)點(diǎn)的k+1跳鄰居集合確定出第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)。
由前述內(nèi)容對本發(fā)明實(shí)施例的描述可知,本發(fā)明實(shí)施例中,步驟a和步驟b中通過迭代計(jì)算實(shí)現(xiàn)節(jié)點(diǎn)對的連接,從而可以將第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)增加到連接后的節(jié)點(diǎn)對中,在達(dá)到跳數(shù)閾值時(shí)可以輸出第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn),本發(fā)明實(shí)施例中,只需要從拓?fù)渚W(wǎng)絡(luò)中提取到全節(jié)點(diǎn)0跳鄰居集合進(jìn)行后續(xù)的迭代計(jì)算過程,而不需要每次迭代過程中都在拓?fù)渚W(wǎng)絡(luò)中發(fā)送消息,因此本發(fā)明實(shí)施例提供的方法可以適用于查詢大圖的多跳鄰居節(jié)點(diǎn),不會造成網(wǎng)絡(luò)的阻塞。
在本發(fā)明的一些實(shí)施例中,本發(fā)明實(shí)施例提供的多跳鄰居節(jié)點(diǎn)的獲取方法,還可以包括如下步驟:
當(dāng)?shù)谝还?jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1小于kmax時(shí),按照步驟a和步驟b的迭代計(jì)算方式計(jì)算第一節(jié)點(diǎn)的k+2跳鄰居集合;
在計(jì)算出第一節(jié)點(diǎn)的k+2跳鄰居集合之后,當(dāng)?shù)谝还?jié)點(diǎn)的k+2跳鄰居集合中的跳數(shù)k+2等于kmax時(shí),將第一節(jié)點(diǎn)的k+2跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
其中,步驟103中描述了k+1等于kmax的情況下輸出第一節(jié)點(diǎn)的k+1跳鄰居集合,而當(dāng)跳數(shù)k+1小于kmax時(shí),還可以上述的步驟,即需要再次執(zhí)行步驟a和步驟b,將步驟a和步驟b的輸入條件更新為第一節(jié)點(diǎn)的k+1跳鄰居集合,則步驟a和步驟b執(zhí)行完成之后可以輸出第一節(jié)點(diǎn)的k+2跳鄰居集合。
需要說明的是,在本發(fā)明的一些實(shí)施例中,若k+2還小于kmax時(shí),仍需要再次執(zhí)行步驟a和步驟b,直至跳數(shù)達(dá)到kmax時(shí),將第一節(jié)點(diǎn)的kmax跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
通過前述對本發(fā)明實(shí)施例的舉例說明可知,首先根據(jù)拓?fù)渚W(wǎng)絡(luò)中所有節(jié)點(diǎn)之間的連邊關(guān)系得到全節(jié)點(diǎn)0跳鄰居集合,當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),從第一節(jié)點(diǎn)的k跳鄰居集合通過本發(fā)明實(shí)施例中的迭代計(jì)算過程可以計(jì)算出第一節(jié)點(diǎn)的k+1跳鄰居集合,由于全節(jié)點(diǎn)0跳鄰居集合中記錄有所有節(jié)點(diǎn)作為起始節(jié)點(diǎn)時(shí)對應(yīng)的目的節(jié)點(diǎn),步驟b中第一節(jié)點(diǎn)的k跳鄰居集合和全節(jié)點(diǎn)0跳鄰居集合中滿足k跳目的節(jié)點(diǎn)和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同時(shí)的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,第一節(jié)點(diǎn)的k+1跳鄰居集合相對于第一節(jié)點(diǎn)的k跳鄰居集合增加了具有連邊關(guān)系的節(jié)點(diǎn),當(dāng)跳數(shù)k+1等于預(yù)置的kmax時(shí),將第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出,從第一節(jié)點(diǎn)的kmax跳鄰居集合可以獲取到第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)。本發(fā)明實(shí)施例中通過節(jié)點(diǎn)對之間的連接操作可以完成多跳鄰居節(jié)點(diǎn)的計(jì)算,而不需要在拓?fù)渚W(wǎng)絡(luò)中發(fā)送消息,從而可以提升在大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
為便于更好的理解和實(shí)施本發(fā)明實(shí)施例的上述方案,下面舉例相應(yīng)的應(yīng)用場景來進(jìn)行具體說明。
請參閱如圖2所示,本發(fā)明實(shí)施例提供的另一種多跳鄰居節(jié)點(diǎn)的獲取方法的流程方框示意圖。本發(fā)明實(shí)施例通過Join操作完成節(jié)點(diǎn)對的連接,并盡量減少Join操作的數(shù)據(jù)量來實(shí)現(xiàn)在大圖中高效的查詢多跳鄰居節(jié)點(diǎn)。
圖2中給出了本發(fā)明實(shí)施例的一種應(yīng)用場景示意圖,首先計(jì)算并存儲每個(gè)節(jié)點(diǎn)的0-跳(英文名稱:hop)鄰居節(jié)點(diǎn),得到全節(jié)點(diǎn)0跳鄰居集合。并將其表示為鍵值對的存儲。從起始節(jié)點(diǎn)到k-hop鄰居節(jié)點(diǎn)路徑的計(jì)算通過一系列的鍵值關(guān)聯(lián)實(shí)現(xiàn)。如圖3所示,為本發(fā)明實(shí)施例提供的節(jié)點(diǎn)對的連接過程的一種應(yīng)用場景示意圖。例如,要獲得1->2->3這樣一條路徑,是通過(1,2)鍵值交替為(2,1),(2,1)關(guān)聯(lián)(2,3)得到(2,(1,3)),最后可拼裝出多跳鄰居節(jié)點(diǎn)為1->2->3。接下來進(jìn)行詳細(xì)舉例說明,圖2主要包括如下步驟:
S1、根據(jù)原始的拓?fù)渚W(wǎng)絡(luò)圖的邊構(gòu)造,將其映射為key-value對集合,即只要存在一條邊,則形成該邊的兩個(gè)節(jié)點(diǎn)就構(gòu)造為一個(gè)key-value節(jié)點(diǎn)對,圖3中的key-value對,例如(id1,id2),所有key-value對的集合構(gòu)成了全節(jié)點(diǎn)0跳鄰居節(jié)點(diǎn)集合P,P包括:(id1,id2)節(jié)點(diǎn)對、(id1,id3)節(jié)點(diǎn)對、(id1,id4)節(jié)點(diǎn)對、(id2,id5)節(jié)點(diǎn)對、(id3,id6)節(jié)點(diǎn)對、(id4,id7)節(jié)點(diǎn)對、(id5,id8) 節(jié)點(diǎn)對。
S2、從集合P中篩選出key為指定節(jié)點(diǎn)的key-value對集合,如圖3中的P1,以id1為第一節(jié)點(diǎn)為例,P1包括:(id1,id2)節(jié)點(diǎn)對、(id1,id3)節(jié)點(diǎn)對、(id1,id4)節(jié)點(diǎn)對。
S3、將P1進(jìn)行key和value的反轉(zhuǎn),獲得集合P1',集合P1'為集合P的反轉(zhuǎn),集合P1'包括:(id2,id1)節(jié)點(diǎn)對、(id3,id1)節(jié)點(diǎn)對、(id4,id1)節(jié)點(diǎn)對。
S4、從集合P中篩選出所有key不等于指定節(jié)點(diǎn)的key-value對的集合,如圖3中的集合P2,集合P2包括:(id2,id5)節(jié)點(diǎn)對、(id3,id6)節(jié)點(diǎn)對、(id4,id7)節(jié)點(diǎn)對、(id5,id8)節(jié)點(diǎn)對。
S5、將P1'和P2進(jìn)行連接操作,獲得1跳鄰居節(jié)點(diǎn)集合,如圖3中的N2,其中,可連接的條件為P1'.key=P2.key,其中,N2包括:(id2,(id1,id5))節(jié)點(diǎn)對、(id3,(id1,id6))節(jié)點(diǎn)對、(id4,(id1,id7))節(jié)點(diǎn)對。
S6、如果跳數(shù)已經(jīng)達(dá)到跳數(shù)閾值,則將N2轉(zhuǎn)換輸出節(jié)點(diǎn)id1的多跳鄰居節(jié)點(diǎn),反之進(jìn)行S7。
S7、令P1=N2,迭代執(zhí)行步驟S3-S6。
例如,如圖3中,迭代執(zhí)行步驟S3-S6時(shí),集合N2反轉(zhuǎn),得到集合N2',集合N2'包括:(id5,(id1,id1))節(jié)點(diǎn)對、(id6,(id1,id3))節(jié)點(diǎn)對、(id7,(id1,id4))節(jié)點(diǎn)對。接下來對集合N2'和集合P2進(jìn)行合并,可以得到集合N3,該集合N3包括:(id5,((id1,id2),id8))。若此時(shí)跳數(shù)已經(jīng)達(dá)到跳數(shù)閾值,則可以將N3轉(zhuǎn)換為1->2->5->8,輸出該路徑作為節(jié)點(diǎn)id1的多跳鄰居節(jié)點(diǎn)。
接下來對本發(fā)明另一實(shí)施例進(jìn)行舉例說明,請參閱如圖4所示,為本發(fā)明實(shí)施例提供的全節(jié)點(diǎn)0跳鄰居集合的過濾過程示意圖。其中,可以對步驟S4進(jìn)一步的精確過濾,而且隨著跳數(shù)增大,上述實(shí)施例中的P1增大到一定程度后,不再執(zhí)行過濾操作,改為直接使用前述實(shí)施例中的P作為P2進(jìn)行后續(xù)的計(jì)算。如圖4所示,精確過濾的具體步驟如下:
S4-1、如果是第1跳,或者前一輪迭代計(jì)算出的N2包括的節(jié)點(diǎn)對個(gè)數(shù)小于設(shè)定的閾值或N2包括的節(jié)點(diǎn)對個(gè)數(shù)與P包括的節(jié)點(diǎn)對個(gè)數(shù)小于設(shè)定的20%比例,則執(zhí)行步驟S4-1-1直至S4-1-2,否則執(zhí)行S4-2-1。
S4-1-1、計(jì)算出P1的目的節(jié)點(diǎn)的集合,即value的集合Pd;
S4-1-2、從集合P中篩選出所有起始節(jié)點(diǎn)存在于Pd的key-value節(jié)點(diǎn)對的集合P2。
S4-2-1、直接使用P作為P2,進(jìn)行后續(xù)計(jì)算。
通過前述對本發(fā)明的舉例說明可知,由于本發(fā)明實(shí)施例中通過S1步驟將源拓?fù)渚W(wǎng)絡(luò)圖的邊映射為了全節(jié)點(diǎn)的0跳鄰居集合,并通過0跳鄰居節(jié)點(diǎn)的連接操作來獲得多跳鄰居節(jié)點(diǎn),本發(fā)明實(shí)施例中不需要進(jìn)行消息傳遞,減少了網(wǎng)絡(luò)通信量。由于本發(fā)明實(shí)施例中可以對連接的key-value節(jié)點(diǎn)對根據(jù)上一跳鄰居集合進(jìn)行精確過濾,減少連接操作的數(shù)據(jù)量,可以有效的提高連接效率。
需要說明的是,對于前述的各方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因?yàn)橐罁?jù)本發(fā)明,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。
為便于更好的實(shí)施本發(fā)明實(shí)施例的上述方案,下面還提供用于實(shí)施上述方案的相關(guān)裝置。
請參閱圖5所示,本發(fā)明實(shí)施例提供的一種多跳鄰居節(jié)點(diǎn)的獲取裝置500,可以包括:獲取模塊501、迭代計(jì)算模塊502和輸出模塊503,其中,
所述獲取模塊501,用于獲取拓?fù)渚W(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)的0跳鄰居,得到全節(jié)點(diǎn)0跳鄰居集合,所述全節(jié)點(diǎn)0跳鄰居集合包括:每個(gè)起始節(jié)點(diǎn)和對應(yīng)的目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,其中,所述起始節(jié)點(diǎn)指的是所述拓?fù)渚W(wǎng)絡(luò)中的任意一個(gè)節(jié)點(diǎn),所述目的節(jié)點(diǎn)指的是在所述拓?fù)渚W(wǎng)絡(luò)中與所述起始節(jié)點(diǎn)存在連邊關(guān)系的節(jié)點(diǎn);
所述迭代計(jì)算模塊502,用于當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),通過如下的迭代計(jì)算過程計(jì)算所述第一節(jié)點(diǎn)的k+1跳鄰居集合,所述k為大于等于0且小于預(yù)置的跳數(shù)閾值kmax的自然數(shù),所述迭代計(jì)算過程包括如下的步驟a和步驟b,其中,
步驟a、獲取所述第一節(jié)點(diǎn)的k跳鄰居集合,所述第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對;
步驟b、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合,其中,所述兩個(gè)節(jié)點(diǎn)對分別來自所述第一節(jié)點(diǎn)的k跳鄰居集合、所述全節(jié)點(diǎn)0跳鄰居集合;
所述輸出模塊503,用于在計(jì)算出所述第一節(jié)點(diǎn)的k+1跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
在本發(fā)明的一些實(shí)施例中,所述迭代計(jì)算模塊502,還用于當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1小于所述kmax時(shí),按照所述步驟a和步驟b的迭代計(jì)算方式計(jì)算所述第一節(jié)點(diǎn)的k+2跳鄰居集合;
所述輸出模塊503,還用于在計(jì)算出所述第一節(jié)點(diǎn)的k+2跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+2跳鄰居集合中的跳數(shù)k+2等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+2跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
在本發(fā)明的一些實(shí)施例中,所述迭代計(jì)算模塊502,還用于所述步驟a執(zhí)行之后,執(zhí)行所述迭代計(jì)算過程還包括的步驟a+1,其中,
步驟a+1,對所述第一節(jié)點(diǎn)的k跳鄰居集合中的節(jié)點(diǎn)對進(jìn)行反轉(zhuǎn),得到所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合,所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合包括:反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)和反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,所述反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳目的節(jié)點(diǎn),所述反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳起始節(jié)點(diǎn);
所述迭代計(jì)算模塊502,具體用于執(zhí)行步驟b’,其中,
步驟b’、將所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合中反轉(zhuǎn)后的k跳起始節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
在本發(fā)明的一些實(shí)施例中,所述迭代計(jì)算模塊502,具體用于執(zhí)行步驟b”和步驟b”’,其中,
步驟b”、從所述全節(jié)點(diǎn)0跳鄰居集合中篩選出所有起始節(jié)點(diǎn)與所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn)相同的節(jié)點(diǎn)對,篩選節(jié)點(diǎn)對完成之后得 到所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合;
步驟b”’、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
在本發(fā)明的一些實(shí)施例中,所述迭代計(jì)算模塊502,具體用于執(zhí)行步驟b””,其中,
步驟b””、判斷所述k+1是否等于1,或判斷所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)是否滿足預(yù)置的節(jié)點(diǎn)對條件;
若所述k+1等于1,則執(zhí)行步驟b”和步驟b”’;
若所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)滿足所述節(jié)點(diǎn)對條件,則執(zhí)行步驟b”和步驟b”’。
在本發(fā)明的一些實(shí)施例中,若所述第一節(jié)點(diǎn)存在至少兩個(gè)的指定節(jié)點(diǎn)k+1跳鄰居集合時(shí),所述迭代計(jì)算模塊502,具體用于并行的計(jì)算所述第一節(jié)點(diǎn)的各個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合。
通過前述對本發(fā)明實(shí)施例的舉例說明可知,首先根據(jù)拓?fù)渚W(wǎng)絡(luò)中所有節(jié)點(diǎn)之間的連邊關(guān)系得到全節(jié)點(diǎn)0跳鄰居集合,當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),從第一節(jié)點(diǎn)的k跳鄰居集合通過本發(fā)明實(shí)施例中的迭代計(jì)算過程可以計(jì)算出第一節(jié)點(diǎn)的k+1跳鄰居集合,由于全節(jié)點(diǎn)0跳鄰居集合中記錄有所有節(jié)點(diǎn)作為起始節(jié)點(diǎn)時(shí)對應(yīng)的目的節(jié)點(diǎn),步驟b中第一節(jié)點(diǎn)的k跳鄰居集合和全節(jié)點(diǎn)0跳鄰居集合中滿足k跳目的節(jié)點(diǎn)和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同時(shí)的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,第一節(jié)點(diǎn)的k+1跳鄰居集合相對于第一節(jié)點(diǎn)的k跳鄰居集合增加了具有連邊關(guān)系的節(jié)點(diǎn),當(dāng)跳數(shù)k+1等于預(yù)置的kmax時(shí),將第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出,從第一節(jié)點(diǎn)的kmax跳鄰居集合可以獲取到第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)。本發(fā)明實(shí)施例中通過節(jié)點(diǎn)對之間的連接操作可以完成多跳鄰居節(jié)點(diǎn)的計(jì)算,而不需要在拓?fù)渚W(wǎng)絡(luò)中發(fā)送消息,從而可以提升在大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
需要說明的是,上述裝置各模塊/單元之間的信息交互、執(zhí)行過程等內(nèi)容,由于與本發(fā)明方法實(shí)施例基于同一構(gòu)思,其帶來的技術(shù)效果與本發(fā)明方法實(shí)施例相同,具體內(nèi)容可參見本發(fā)明前述所示的方法實(shí)施例中的敘述,此處不 再贅述。
本發(fā)明實(shí)施例還提供一種計(jì)算機(jī)存儲介質(zhì),其中,該計(jì)算機(jī)存儲介質(zhì)存儲有程序,該程序執(zhí)行包括上述方法實(shí)施例中記載的部分或全部步驟。
接下來介紹本發(fā)明實(shí)施例提供的另一種多跳鄰居節(jié)點(diǎn)的獲取裝置,請參閱圖6所示,多跳鄰居節(jié)點(diǎn)的獲取裝置600包括:
輸入裝置601、輸出裝置602、處理器603和存儲器604(其中多跳鄰居節(jié)點(diǎn)的獲取裝置600中的處理器603的數(shù)量可以一個(gè)或多個(gè),圖6中以一個(gè)處理器為例)。在本發(fā)明的一些實(shí)施例中,輸入裝置601、輸出裝置602、處理器603和存儲器604可通過總線或其它方式連接,其中,圖6中以通過總線連接為例。
其中,處理器603,用于執(zhí)行前述實(shí)施例中的多跳連接節(jié)點(diǎn)的獲取方法。具體的,處理器603,用于執(zhí)行如下步驟:
獲取拓?fù)渚W(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)的0跳鄰居,得到全節(jié)點(diǎn)0跳鄰居集合,所述全節(jié)點(diǎn)0跳鄰居集合包括:每個(gè)起始節(jié)點(diǎn)和對應(yīng)的目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,其中,所述起始節(jié)點(diǎn)指的是所述拓?fù)渚W(wǎng)絡(luò)中的任意一個(gè)節(jié)點(diǎn),所述目的節(jié)點(diǎn)指的是在所述拓?fù)渚W(wǎng)絡(luò)中與所述起始節(jié)點(diǎn)存在連邊關(guān)系的節(jié)點(diǎn);
當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),通過如下的迭代計(jì)算過程計(jì)算所述第一節(jié)點(diǎn)的k+1跳鄰居集合,所述k為大于等于0且小于預(yù)置的跳數(shù)閾值kmax的自然數(shù),所述迭代計(jì)算過程包括如下的步驟a和步驟b,其中,
步驟a、獲取所述第一節(jié)點(diǎn)的k跳鄰居集合,所述第一節(jié)點(diǎn)的k跳鄰居集合包括:k跳起始節(jié)點(diǎn)和k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對;
步驟b、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合,其中,所述兩個(gè)節(jié)點(diǎn)對分別來自所述第一節(jié)點(diǎn)的k跳鄰居集合、所述全節(jié)點(diǎn)0跳鄰居集合;
在計(jì)算出所述第一節(jié)點(diǎn)的k+1跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
在本發(fā)明的一些實(shí)施例中,處理器603,還用于執(zhí)行如下步驟:
當(dāng)所述第一節(jié)點(diǎn)的k+1跳鄰居集合中的跳數(shù)k+1小于所述kmax時(shí),按照所述步驟a和步驟b的迭代計(jì)算方式計(jì)算所述第一節(jié)點(diǎn)的k+2跳鄰居集合;
在計(jì)算出所述第一節(jié)點(diǎn)的k+2跳鄰居集合之后,當(dāng)所述第一節(jié)點(diǎn)的k+2跳鄰居集合中的跳數(shù)k+2等于所述kmax時(shí),將所述第一節(jié)點(diǎn)的k+2跳鄰居集合以及對應(yīng)的k+1跳路徑輸出。
在本發(fā)明的一些實(shí)施例中,處理器603,還用于執(zhí)行所述步驟a執(zhí)行之后,所述迭代計(jì)算過程還包括:步驟a+1,其中,
步驟a+1,對所述第一節(jié)點(diǎn)的k跳鄰居集合中的節(jié)點(diǎn)對進(jìn)行反轉(zhuǎn),得到所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合,所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合包括:反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)和反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)構(gòu)成的節(jié)點(diǎn)對,所述反轉(zhuǎn)后的k跳起始節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳目的節(jié)點(diǎn),所述反轉(zhuǎn)后的k跳目的節(jié)點(diǎn)為所述第一節(jié)點(diǎn)的k跳鄰居集合中的k跳起始節(jié)點(diǎn);
所述步驟b,具體為:步驟b’,其中,
步驟b’、將所述第一節(jié)點(diǎn)的反轉(zhuǎn)指定節(jié)點(diǎn)k跳鄰居集合中反轉(zhuǎn)后的k跳起始節(jié)點(diǎn),和所述全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
在本發(fā)明的一些實(shí)施例中,處理器603,具體用于執(zhí)行如下步驟:步驟b”和步驟b”’,其中,
步驟b”、從所述全節(jié)點(diǎn)0跳鄰居集合中篩選出所有起始節(jié)點(diǎn)與所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn)相同的節(jié)點(diǎn)對,篩選節(jié)點(diǎn)對完成之后得到所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合;
步驟b”’、將所述第一節(jié)點(diǎn)的k跳鄰居集合中k跳目的節(jié)點(diǎn),和所述第一節(jié)點(diǎn)的篩選指定節(jié)點(diǎn)k跳鄰居集合中起始節(jié)點(diǎn)相同的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,完成節(jié)點(diǎn)對的連接后得到所述第一節(jié)點(diǎn)的k+1跳鄰居集合。
進(jìn)一步的,在本發(fā)明的一些實(shí)施例中,處理器603,還用于執(zhí)行如下步驟:步驟b””,其中,
步驟b””、判斷所述k+1是否等于1,或判斷所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)是否滿足預(yù)置的節(jié)點(diǎn)對條件;
若所述k+1等于1,則執(zhí)行步驟b”和步驟b”’;
若所述第一節(jié)點(diǎn)的k跳鄰居集合中包括的節(jié)點(diǎn)對個(gè)數(shù)滿足所述節(jié)點(diǎn)對條件,則執(zhí)行步驟b”和步驟b”’。
在本發(fā)明的一些實(shí)施例中,若所述第一節(jié)點(diǎn)存在至少兩個(gè)的指定節(jié)點(diǎn)k+1跳鄰居集合時(shí),處理器603,具體用于執(zhí)行的所述迭代計(jì)算過程是并行的計(jì)算所述第一節(jié)點(diǎn)的各個(gè)指定節(jié)點(diǎn)k+1跳鄰居集合。
通過前述對本發(fā)明實(shí)施例的舉例說明可知,首先根據(jù)拓?fù)渚W(wǎng)絡(luò)中所有節(jié)點(diǎn)之間的連邊關(guān)系得到全節(jié)點(diǎn)0跳鄰居集合,當(dāng)?shù)谝还?jié)點(diǎn)作為指定節(jié)點(diǎn)時(shí),從第一節(jié)點(diǎn)的k跳鄰居集合通過本發(fā)明實(shí)施例中的迭代計(jì)算過程可以計(jì)算出第一節(jié)點(diǎn)的k+1跳鄰居集合,由于全節(jié)點(diǎn)0跳鄰居集合中記錄有所有節(jié)點(diǎn)作為起始節(jié)點(diǎn)時(shí)對應(yīng)的目的節(jié)點(diǎn),步驟b中第一節(jié)點(diǎn)的k跳鄰居集合和全節(jié)點(diǎn)0跳鄰居集合中滿足k跳目的節(jié)點(diǎn)和全節(jié)點(diǎn)0跳鄰居集合中起始節(jié)點(diǎn)相同時(shí)的兩個(gè)節(jié)點(diǎn)對連接為一個(gè)節(jié)點(diǎn)對,第一節(jié)點(diǎn)的k+1跳鄰居集合相對于第一節(jié)點(diǎn)的k跳鄰居集合增加了具有連邊關(guān)系的節(jié)點(diǎn),當(dāng)跳數(shù)k+1等于預(yù)置的kmax時(shí),將第一節(jié)點(diǎn)的k+1跳鄰居集合以及對應(yīng)的k+1跳路徑輸出,從第一節(jié)點(diǎn)的kmax跳鄰居集合可以獲取到第一節(jié)點(diǎn)的多跳鄰居節(jié)點(diǎn)。本發(fā)明實(shí)施例中通過節(jié)點(diǎn)對之間的連接操作可以完成多跳鄰居節(jié)點(diǎn)的計(jì)算,而不需要在拓?fù)渚W(wǎng)絡(luò)中發(fā)送消息,從而可以提升在大圖中查詢多跳鄰居節(jié)點(diǎn)的計(jì)算效率。
另外需說明的是,以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來實(shí)現(xiàn)本實(shí)施例方案的目的。另外,本發(fā)明提供的裝置實(shí)施例附圖中,模塊之間的連接關(guān)系表示它們之間具有通信連接,具體可以實(shí)現(xiàn)為一條或多條通信總線或信號線。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實(shí)施。
通過以上的實(shí)施方式的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件的方式來實(shí)現(xiàn),當(dāng)然也可以通過專用硬件包括專用集成電路、專用CPU、專用存儲器、專用元器件等來實(shí)現(xiàn)。一般情 況下,凡由計(jì)算機(jī)程序完成的功能都可以很容易地用相應(yīng)的硬件來實(shí)現(xiàn),而且,用來實(shí)現(xiàn)同一功能的具體硬件結(jié)構(gòu)也可以是多種多樣的,例如模擬電路、數(shù)字電路或?qū)S秒娐返?。但是,對本發(fā)明而言更多情況下軟件程序?qū)崿F(xiàn)是更佳的實(shí)施方式。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲在可讀取的存儲介質(zhì)中,如計(jì)算機(jī)的軟盤、U盤、移動硬盤、只讀存儲器(ROM,Read-Only Memory)、隨機(jī)存取存儲器(RAM,Random Access Memory)、磁碟或者光盤等,包括若干指令用以使得一臺計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述的方法。
綜上所述,以上實(shí)施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照上述實(shí)施例對本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對上述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。