本發(fā)明涉及圖數(shù)據(jù)技術(shù)領(lǐng)域,具體涉及一種基于圖計(jì)算引擎的消息同步方法及系統(tǒng)。
背景技術(shù):
大圖形可以很好地應(yīng)用于各種圖形分析和挖掘應(yīng)用程序,例如,社會(huì)網(wǎng)絡(luò)分析、模式識(shí)別、網(wǎng)站分類和社會(huì)媒體營(yíng)銷等。但是,隨著需要處理圖形的體積越來(lái)越龐大,單個(gè)服務(wù)器已經(jīng)不堪重負(fù),因此,一系列大規(guī)模分布式并行框架圖應(yīng)運(yùn)而生。分布式并行框架圖是將一張大圖分割成多個(gè)子圖,然后將這些分開存儲(chǔ),因此計(jì)算時(shí)可以多個(gè)子圖并行運(yùn)行,大大提高運(yùn)算效率,可應(yīng)用于大規(guī)模的現(xiàn)實(shí)世界的圖形問(wèn)題。
圖的切割方法分為邊切割和頂點(diǎn)切割。邊切割通過(guò)切割邊,將頂點(diǎn)均勻地分配到各個(gè)子圖內(nèi),被切割的邊跨越多個(gè)子圖,邊切割后的通信和存儲(chǔ)開銷與切割的邊的數(shù)量成正比的。與邊切割相比,頂點(diǎn)切割將各個(gè)邊均勻地分配到各個(gè)子圖內(nèi),并允許頂點(diǎn)跨越多個(gè)子圖,頂點(diǎn)切割的通信和存儲(chǔ)開銷與每個(gè)頂點(diǎn)所跨越的圖形分區(qū)的數(shù)目成正比。有理論和實(shí)驗(yàn)結(jié)果表明,現(xiàn)實(shí)世界的圖有良好的頂點(diǎn)切割,因此,頂點(diǎn)切割更適用于現(xiàn)實(shí)世界的圖形問(wèn)題。
切分后的子圖分別存儲(chǔ)在多臺(tái)機(jī)器上,每一個(gè)子圖的信息轉(zhuǎn)換需要消耗網(wǎng)絡(luò)資源,尤其對(duì)一些大的現(xiàn)實(shí)世界的圖形來(lái)說(shuō),子圖的數(shù)量很多,子圖間的信息交互也會(huì)很頻繁。
基于現(xiàn)有的圖數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),子圖存儲(chǔ)的信息包括點(diǎn)的信息和邊的信息,點(diǎn)的信包括點(diǎn)的編號(hào)和點(diǎn)的屬性,邊的信息包括邊的源點(diǎn)、終點(diǎn)以及邊的屬性。基于現(xiàn)有的圖數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),頂點(diǎn)和邊的信息分開存儲(chǔ),增加了通信開銷;而且存儲(chǔ)結(jié)構(gòu)中缺少索引信息,大大降低了計(jì)算速率。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中的缺陷,本發(fā)明提供的基于圖計(jì)算引擎的消息同步方法及系統(tǒng),基于一種新的存儲(chǔ)結(jié)構(gòu),提高了不同子圖間同步數(shù)據(jù)的效率。
第一方面,本發(fā)明提供的一種基于圖計(jì)算引擎的消息同步方法,包括:步驟S1,在各個(gè)子圖中,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);步驟S2,若所述下一頂點(diǎn)有主頂點(diǎn)索引,則根據(jù)所述下一頂點(diǎn)的主頂點(diǎn)索引,將所述下一頂點(diǎn)接收到的消息發(fā)送給所述下一頂點(diǎn)的主頂點(diǎn);步驟S3,融合所述下一頂點(diǎn)的主頂點(diǎn)接收到的所有消息;步驟S4,根據(jù)所述下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將融合后的消息發(fā)送給所述下一頂點(diǎn)的所有從頂點(diǎn);步驟S5,若未滿足終止條件,則返回執(zhí)行步驟S1。
本發(fā)明提供的基于圖計(jì)算引擎的消息同步方法,在消息同步過(guò)程中,通過(guò)主頂點(diǎn)索引和從頂點(diǎn)索引快速查找到頂點(diǎn)在不同子圖間的位置,不再需要計(jì)算,提高了不同子圖間同步數(shù)據(jù)的效率。
優(yōu)選地,所述將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn),包括:若滿足觸發(fā)條件,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
優(yōu)選地,所述若滿足觸發(fā)條件,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn),包括:若邊被激活,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
優(yōu)選地,若邊被激活,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn),包括:若當(dāng)前頂點(diǎn)接收到消息,則激活所述當(dāng)前頂點(diǎn);若所述當(dāng)前頂點(diǎn)被激活,則按照邊激活條件激活所述當(dāng)前頂點(diǎn)相應(yīng)的邊;
若所述當(dāng)前頂點(diǎn)相應(yīng)的邊被激活,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);將所述當(dāng)前頂點(diǎn)的激活狀態(tài)清零。
優(yōu)選地,還包括:根據(jù)所述融合后的消息更新所述下一頂點(diǎn)的主頂點(diǎn)的屬性;根據(jù)所述下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將更新后的所述下一頂點(diǎn)的主頂點(diǎn)的屬性發(fā)送給所述下一頂點(diǎn)的所有從頂點(diǎn);根據(jù)更新后的所述下一頂點(diǎn)的主頂點(diǎn)的屬性,更新所述下一頂點(diǎn)的從頂點(diǎn)的屬性。
第二方面,本發(fā)明提供的一種基于圖計(jì)算引擎的消息同步系統(tǒng),包括:消息發(fā)送模塊,用于在各個(gè)子圖中,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);消息匯總模塊,用于若所述下一頂點(diǎn)有主頂點(diǎn)索引,則根據(jù)所述下一頂點(diǎn)的主頂點(diǎn)索引,將所述下一頂點(diǎn)接收到的消息發(fā)送給所述下一頂點(diǎn)的主頂點(diǎn);消息融合模塊,用于融合所述下一頂點(diǎn)的主頂點(diǎn)接收到的所有消息;消息同步模塊,用于根據(jù)所述下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將融合后的消息發(fā)送給所述下一頂點(diǎn)的所有從頂點(diǎn);循環(huán)判斷模塊,用于若未滿足終止條件,則返回執(zhí)行消息發(fā)送模塊的功能。
本發(fā)明提供的基于圖計(jì)算引擎的消息同步系統(tǒng),在消息同步過(guò)程中,通過(guò)主頂點(diǎn)索引和從頂點(diǎn)索引快速查找到頂點(diǎn)在不同子圖間的位置,不再需要計(jì)算,提高了不同子圖間同步數(shù)據(jù)的效率。
優(yōu)選地,所述消息發(fā)送模塊具體用于:若滿足觸發(fā)條件,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
優(yōu)選地,所述消息發(fā)送模塊具體用于:若邊被激活,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
優(yōu)選地,所述消息發(fā)送模塊具體用于:若當(dāng)前頂點(diǎn)接收到消息,則激活所述當(dāng)前頂點(diǎn);若所述當(dāng)前頂點(diǎn)被激活,則按照邊激活條件激活所述當(dāng)前頂點(diǎn)相應(yīng)的邊;若所述當(dāng)前頂點(diǎn)相應(yīng)的邊被激活,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿所述當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);將所述當(dāng)前頂點(diǎn)的激活狀態(tài)清零。
優(yōu)選地,還包括屬性更新模塊,用于:根據(jù)所述融合后的消息更新所述下一頂點(diǎn)的主頂點(diǎn)的屬性;根據(jù)所述下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將更新后的所述下一頂點(diǎn)的主頂點(diǎn)的屬性發(fā)送給所述下一頂點(diǎn)的所有從頂點(diǎn);根據(jù)更新后的所述下一頂點(diǎn)的主頂點(diǎn)的屬性,更新所述下一頂點(diǎn)的從頂點(diǎn)的屬性。
附圖說(shuō)明
圖1為一個(gè)完整的大圖的示意圖;
圖2為將大圖切分后的三個(gè)子圖;
圖3為本發(fā)明實(shí)施例所提供的基于圖計(jì)算引擎的存儲(chǔ)結(jié)構(gòu);
圖4為本發(fā)明實(shí)施例所提供的基于圖計(jì)算引擎的消息同步方法的流程圖;
圖5為本發(fā)明實(shí)施例所提供的基于圖計(jì)算引擎的消息同步系統(tǒng)的結(jié)構(gòu)框圖。
具體實(shí)施方式
下面將結(jié)合附圖對(duì)本發(fā)明技術(shù)方案的實(shí)施例進(jìn)行詳細(xì)的描述。以下實(shí)施例僅用于更加清楚地說(shuō)明本發(fā)明的技術(shù)方案,因此只是作為示例,而不能以此來(lái)限制本發(fā)明的保護(hù)范圍。
需要注意的是,除非另有說(shuō)明,本申請(qǐng)使用的技術(shù)術(shù)語(yǔ)或者科學(xué)術(shù)語(yǔ)應(yīng)當(dāng)為本發(fā)明所屬領(lǐng)域技術(shù)人員所理解的通常意義。
為了提高子圖之間的數(shù)據(jù)同步效率,本發(fā)明實(shí)施例提供了一種圖數(shù)據(jù)的存儲(chǔ)方法,包括:
按照頂點(diǎn)分割的方式將一個(gè)完整的大圖切分為多個(gè)子圖,其中,在每個(gè)子圖中的邊都是完整的,一個(gè)頂點(diǎn)可能存在于兩個(gè)或兩個(gè)以上的子圖中;
對(duì)于存在兩個(gè)或兩個(gè)以上子圖中的頂點(diǎn),指定其中一個(gè)子圖為該頂點(diǎn)的主子圖,其余的子圖為該頂點(diǎn)的從子圖,在主子圖中的該頂點(diǎn)就為主頂點(diǎn),在從子圖中的該頂點(diǎn)為從頂點(diǎn)。
根據(jù)預(yù)定的存儲(chǔ)結(jié)構(gòu),保存每個(gè)子圖中的頂點(diǎn)和邊的數(shù)據(jù)。
圖1給出了一個(gè)完整的大圖。
沿著圖1中的虛線進(jìn)行切分就得到如圖2所示的三個(gè)子圖。其中,實(shí)線圈為主頂點(diǎn)(如子圖0中的頂點(diǎn)a、b、c、d),虛線圈為從頂點(diǎn)(如子圖0中的頂點(diǎn)g、f,子圖1中的頂點(diǎn)c);以頂點(diǎn)c為例,頂點(diǎn)c在子圖0中為主頂點(diǎn),則子圖0為頂點(diǎn)c的主子圖,子圖1和子圖2為頂點(diǎn)c的從子圖。
圖3給出了按上述方式進(jìn)行存儲(chǔ)的存儲(chǔ)結(jié)構(gòu)。該存儲(chǔ)結(jié)構(gòu)中,每個(gè)子圖是單獨(dú)存儲(chǔ)的,因此該存儲(chǔ)結(jié)構(gòu)適用于并行計(jì)算。每個(gè)子圖中存儲(chǔ)有3部分內(nèi)容:
第一部分為ID映射。local2Global存儲(chǔ)了子圖內(nèi)所有頂點(diǎn)在全局ID(頂點(diǎn)在大圖中的ID),其中所有主頂點(diǎn)的索引號(hào)小于從頂點(diǎn)。global2Local存儲(chǔ)了子圖中每個(gè)頂點(diǎn)的全局ID的索引與本地ID(頂點(diǎn)在子圖中的ID)的映射,以圖3中的子圖0(Partition0)為例,global2Local字段下,“231”為頂點(diǎn)a的全局ID,“0”為頂點(diǎn)a的本地ID。在一個(gè)子圖中,如果主頂點(diǎn)和從頂點(diǎn)的數(shù)量分別為m和n,若一個(gè)頂點(diǎn)的本地ID小于m,則該頂點(diǎn)是主頂點(diǎn),否則該頂點(diǎn)是從頂點(diǎn)。
第二部分為頂點(diǎn)信息(vertices)。attributesOfMaster用于存儲(chǔ)主頂點(diǎn)的屬性值,其排序與local2Global的順序相同。slaveInfoOfMaster用于存儲(chǔ)主頂點(diǎn)對(duì)應(yīng)的從頂點(diǎn)索引,從頂點(diǎn)索引包括從頂點(diǎn)所在的子圖編號(hào)和在子圖中的本地ID,如果一個(gè)頂點(diǎn)被切分,將存在一個(gè)或多個(gè)從頂點(diǎn)分布在其他的子圖中,例如,在子圖0中的頂點(diǎn)891(即頂點(diǎn)c)有兩個(gè)從頂點(diǎn),在子圖1和子圖2中的本地ID分別為4和3(見子圖1和子圖2中的global2Local),因此在子圖0中slaveInfoOfMaster相應(yīng)的位置存儲(chǔ)頂點(diǎn)891的從頂點(diǎn)索引“1,4”和“2,3”。attributesOfSlave用于存儲(chǔ)從頂點(diǎn)的屬性值。masterInfoOfSlave用于存儲(chǔ)從頂點(diǎn)對(duì)應(yīng)的主頂點(diǎn)索引,主頂點(diǎn)索引包括主頂點(diǎn)所在的子圖編號(hào)和主頂點(diǎn)在子圖中的本地ID,例如在子圖0中,從頂點(diǎn)412(即頂點(diǎn)g)的主頂點(diǎn)在子圖2中,其在子圖2中的本地ID是0,因此在子圖0中masterInfoOfSlave相應(yīng)的位置存儲(chǔ)頂點(diǎn)412的主頂點(diǎn)索引“2,0”。從頂點(diǎn)的屬性可以根據(jù)主頂點(diǎn)的屬性值進(jìn)行更新。
第三部分為邊信息(edges)。邊的源點(diǎn)的本地ID存儲(chǔ)在localSrcIds中,邊的終點(diǎn)的本地ID存儲(chǔ)在與localSrcIds對(duì)應(yīng)的localDstIds中,以頂點(diǎn)231指向頂點(diǎn)2851的邊為例,頂點(diǎn)231(本地ID為0)為源點(diǎn),則localSrcIds(0)為0,頂點(diǎn)2851(本地ID為1)為終點(diǎn),則localDstIds(0)為1。edgeAttributes存儲(chǔ)邊的屬性值。
本發(fā)明實(shí)施例提供的基于圖計(jì)算引擎的存儲(chǔ)結(jié)構(gòu)中包括點(diǎn)的包含關(guān)系(主頂點(diǎn)索引和從頂點(diǎn)索引),在查找過(guò)程中,可以通過(guò)索引快速查找到目標(biāo)點(diǎn),不再需要計(jì)算,提高了查找效率;另外,將點(diǎn)和邊共同存儲(chǔ),一些共享的信息不需要重復(fù)存儲(chǔ),節(jié)省了存儲(chǔ)空間。
基于上述圖數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu),本發(fā)明實(shí)施例提供的一種基于圖計(jì)算引擎的消息同步方法,具體步驟如圖4所示,包括:
步驟S1,在各個(gè)子圖中,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
步驟S2,若下一頂點(diǎn)有主頂點(diǎn)索引,則根據(jù)下一頂點(diǎn)的主頂點(diǎn)索引,將下一頂點(diǎn)接收到的消息發(fā)送給下一頂點(diǎn)的主頂點(diǎn)。
其中,若下一頂點(diǎn)沒(méi)有主頂點(diǎn)索引,則表明該頂點(diǎn)就是主頂點(diǎn),該頂點(diǎn)只需接收其從頂點(diǎn)發(fā)送過(guò)來(lái)的消息即可。
步驟S3,融合下一頂點(diǎn)的主頂點(diǎn)接收到的所有消息。
步驟S4,根據(jù)下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將融合后的消息發(fā)送給下一頂點(diǎn)的所有從頂點(diǎn)。
步驟S5,若未滿足終止條件,則返回執(zhí)行步驟S1。
其中,返回執(zhí)行步驟S1即進(jìn)行新一輪的循環(huán),上一次循環(huán)中接收到消息的頂點(diǎn)即為下一次循環(huán)中的當(dāng)前頂點(diǎn)。當(dāng)前頂點(diǎn)為在某次循環(huán)過(guò)程中滿足條件,能夠進(jìn)行消息發(fā)送的頂點(diǎn),為區(qū)別于其它不滿足消息發(fā)送條件的頂點(diǎn),并不代表實(shí)際存在頂點(diǎn)叫當(dāng)前頂點(diǎn)。
本發(fā)明實(shí)施例提供的基于圖計(jì)算引擎的消息同步方法,不同子圖中的消息發(fā)送(對(duì)應(yīng)步驟S1)、消息合并(對(duì)應(yīng)步驟S2、S3)、消息同步(對(duì)應(yīng)步驟S4)等都是并發(fā)處理的,在消息同步過(guò)程中,通過(guò)主頂點(diǎn)索引和從頂點(diǎn)索引快速查找到頂點(diǎn)在不同子圖間的位置,不再需要計(jì)算,提高了不同子圖間同步數(shù)據(jù)的效率。
其中,步驟S1的實(shí)現(xiàn)方式有多種,本發(fā)明實(shí)施例提供了步驟S1的一種優(yōu)選方式,具體包括:若滿足觸發(fā)條件,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
進(jìn)一步地,步驟S1的優(yōu)選方式還可以是:若邊被激活,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
進(jìn)一步地,步驟S1的優(yōu)選方式還可以是:若當(dāng)前頂點(diǎn)接收到消息,則激活當(dāng)前頂點(diǎn);若當(dāng)前頂點(diǎn)被激活,則按照邊激活條件激活當(dāng)前頂點(diǎn)相應(yīng)的邊;若當(dāng)前頂點(diǎn)相應(yīng)的邊被激活,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);將當(dāng)前頂點(diǎn)的激活狀態(tài)清零。該優(yōu)選方法,以頂點(diǎn)接收到消息為發(fā)送消息的觸發(fā)條件,形成鏈?zhǔn)椒磻?yīng),更新消息會(huì)通過(guò)邊自動(dòng)傳遞到下一個(gè)頂點(diǎn),直到滿足終止條件,提高了信息發(fā)送效率。
其中,步驟S1中的預(yù)定規(guī)則包括以下規(guī)則中的任意一種:(1)消息只能從源點(diǎn)發(fā)給終點(diǎn),(2)消息只能從終點(diǎn)發(fā)往源點(diǎn),(3)消息既可以從源點(diǎn)發(fā)往終點(diǎn)也可以從終點(diǎn)發(fā)往源點(diǎn)。
其中,邊被激活的條件包括邊的源點(diǎn)被激活和/或邊的終點(diǎn)被激活。
其中,步驟S5中的終止條件包括:沒(méi)有產(chǎn)生新的消息和/或迭循環(huán)發(fā)送次數(shù)達(dá)到一定數(shù)量。沒(méi)有產(chǎn)生新消息是指消息沒(méi)有沿著邊發(fā)送,即沒(méi)有新的頂點(diǎn)接收到消息。
本發(fā)明實(shí)施例提供的基于圖計(jì)算引擎的消息同步方法,還包括屬性更新步驟,具體包括:根據(jù)融合后的消息更新下一頂點(diǎn)的主頂點(diǎn)的屬性;根據(jù)下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將更新后的下一頂點(diǎn)的主頂點(diǎn)的屬性發(fā)送給下一頂點(diǎn)的所有從頂點(diǎn);根據(jù)更新后的下一頂點(diǎn)的主頂點(diǎn)的屬性,更新下一頂點(diǎn)的從頂點(diǎn)的屬性。
以發(fā)送消息為例,本發(fā)明實(shí)施例提供的一種基于圖計(jì)算引擎的消息同步方法,包括:
步驟S10,在各個(gè)子圖中,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
其中,消息包括消息內(nèi)容和目標(biāo)頂點(diǎn)ID,目標(biāo)頂點(diǎn)ID為目標(biāo)頂點(diǎn)在大圖中的全局ID。
步驟S20,若下一頂點(diǎn)有主頂點(diǎn)索引,則根據(jù)下一頂點(diǎn)的主頂點(diǎn)索引,將下一頂點(diǎn)接收到的消息發(fā)送給下一頂點(diǎn)的主頂點(diǎn)。
其中,若下一頂點(diǎn)沒(méi)有主頂點(diǎn)索引,則表明該頂點(diǎn)就是主頂點(diǎn),該頂點(diǎn)只需接收其從頂點(diǎn)發(fā)送過(guò)來(lái)的消息即可。
步驟S30,融合下一頂點(diǎn)的主頂點(diǎn)接收到的所有消息。
步驟S40,根據(jù)下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將融合后的消息發(fā)送給下一頂點(diǎn)的所有從頂點(diǎn)。
步驟S50,若未滿足終止條件,則返回執(zhí)行步驟S10。
其中,終止條件為消息發(fā)送到目標(biāo)頂點(diǎn);判斷主頂點(diǎn)和目標(biāo)頂點(diǎn)的全局ID是否相同;若不相同,則未滿足終止條件,返回執(zhí)行步驟S10;若相同,則主頂點(diǎn)即為目標(biāo)頂點(diǎn),滿足終止條件,終止循環(huán)。
本發(fā)明實(shí)施例提供的基于圖計(jì)算引擎的消息同步方法,在消息發(fā)送過(guò)程中,通過(guò)主頂點(diǎn)索引和從頂點(diǎn)索引快速查找到頂點(diǎn)在子圖中的位置,不再需要計(jì)算,提高了不同子圖間同步數(shù)據(jù)的效率。
其中,步驟S10的實(shí)現(xiàn)方式有多種,本發(fā)明實(shí)施例提供了步驟S10的一種優(yōu)選方式,具體包括:若滿足觸發(fā)條件,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
進(jìn)一步地,步驟S10的優(yōu)選方式還可以是:若邊被激活,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
進(jìn)一步地,步驟S10的優(yōu)選方式還可以是:若當(dāng)前頂點(diǎn)接收到消息,則激活當(dāng)前頂點(diǎn);若當(dāng)前頂點(diǎn)被激活,則按照邊激活條件激活當(dāng)前頂點(diǎn)相應(yīng)的邊;若當(dāng)前頂點(diǎn)相應(yīng)的邊被激活,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);將當(dāng)前頂點(diǎn)的激活狀態(tài)清零。該優(yōu)選方法,以頂點(diǎn)接收到消息為發(fā)送消息的觸發(fā)條件,形成鏈?zhǔn)椒磻?yīng),更新消息會(huì)通過(guò)邊自動(dòng)傳遞到下一個(gè)頂點(diǎn),直到滿足終止條件,提高了信息發(fā)送效率。
其中,步驟S10中的預(yù)定規(guī)則包括以下規(guī)則中的任意一種:(1)消息只能從源點(diǎn)發(fā)給終點(diǎn),(2)消息只能從終點(diǎn)發(fā)往源點(diǎn),(3)消息既可以從源點(diǎn)發(fā)往終點(diǎn)也可以從終點(diǎn)發(fā)往源點(diǎn)。實(shí)際應(yīng)用中,消息發(fā)送的方向可以根據(jù)用戶的實(shí)際需求設(shè)定,如根據(jù)源點(diǎn)和終點(diǎn)的屬性值、消息的具體內(nèi)容判斷選用哪種消息發(fā)送的規(guī)則。
其中,邊被激活的條件包括邊的源點(diǎn)被激活和/或邊的終點(diǎn)被激活。
本發(fā)明實(shí)施例提供的基于圖計(jì)算引擎的消息同步方法,還包括屬性更新步驟,具體包括:根據(jù)融合后的消息更新下一頂點(diǎn)的主頂點(diǎn)的屬性;根據(jù)下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將更新后的下一頂點(diǎn)的主頂點(diǎn)的屬性發(fā)送給下一頂點(diǎn)的所有從頂點(diǎn);根據(jù)更新后的下一頂點(diǎn)的主頂點(diǎn)的屬性,更新下一頂點(diǎn)的從頂點(diǎn)的屬性。
以下面消息處理的過(guò)程為例說(shuō)明本發(fā)明實(shí)施例的應(yīng)用,假設(shè)我們想判斷大圖中某個(gè)特定的點(diǎn)到其它點(diǎn)的距離,距離可以考慮方向也可以不考慮。以圖1中的頂點(diǎn)891為例,考慮方向時(shí)可以分頂點(diǎn)891可以到達(dá)哪些點(diǎn)(出去)和哪些點(diǎn)可以到達(dá)891(進(jìn)來(lái)),考慮方向時(shí),兩種情況的處理方式類似。以不考慮方向和考慮方向中的第一種情況為例,假設(shè)頂點(diǎn)891為消息發(fā)送的起始點(diǎn):
情況1:不考慮消息傳遞的方向,其處理過(guò)程為:
(1)首先初始化所有頂點(diǎn)的屬性,如果頂點(diǎn)的ID為891,則屬性值設(shè)為0,否則設(shè)為-1。上述過(guò)程由各個(gè)子圖并行處理自己的頂點(diǎn)。
(2)消息發(fā)送過(guò)程:對(duì)于每條邊,判斷如果源點(diǎn)的屬性≥0且終點(diǎn)的屬性<0,則向終點(diǎn)發(fā)送一個(gè)消息,消息內(nèi)容為源點(diǎn)的屬性值+1;否則如果終點(diǎn)的屬性≥0且源點(diǎn)的屬性<0,則向終點(diǎn)發(fā)送一個(gè)消息,消息內(nèi)容為終點(diǎn)的屬性值+1。
該實(shí)施例中以源點(diǎn)和終點(diǎn)的屬性值的大小為依據(jù),判斷是否沿著某條邊進(jìn)行消息的傳遞,實(shí)際應(yīng)用中,可以根據(jù)用戶的實(shí)際需求設(shè)定。
(3)消息合并過(guò)程:消息發(fā)送過(guò)程在多個(gè)子圖中并行進(jìn)行,因此一次會(huì)產(chǎn)生很多消息,發(fā)往相同頂點(diǎn)的消息都往其主頂點(diǎn)匯聚。主頂點(diǎn)可能會(huì)收到多條消息,主頂點(diǎn)將收到的多條消息進(jìn)行合并,由于本實(shí)施例中,每輪迭代中消息的內(nèi)容都是相同的,所以主頂點(diǎn)收到多個(gè)消息時(shí)可以隨便選取一條。例如,如圖1中,第一輪迭代頂點(diǎn)891會(huì)向頂點(diǎn)231、2343、6427、442、9712共5個(gè)點(diǎn)發(fā)送內(nèi)容為1的消息;第二輪迭代,子圖0中頂點(diǎn)231和頂點(diǎn)9712都會(huì)向頂點(diǎn)412發(fā)送內(nèi)容為2的消息,同時(shí),子圖2中頂點(diǎn)9712也會(huì)向頂點(diǎn)412發(fā)送內(nèi)容為2的消息,子圖0中和子圖2中的頂點(diǎn)412將消息進(jìn)行合并。
(4)屬性更新過(guò)程:每個(gè)頂點(diǎn)收到消息后,將屬性值更新為消息內(nèi)容,并將更新的屬性同步到從頂點(diǎn)。
(5)回到第二步進(jìn)行循環(huán)迭代,直到第二步?jīng)]有新消息產(chǎn)生。
對(duì)于情況1,結(jié)合圖1,整個(gè)消息發(fā)送、合并、同步的過(guò)程如下:
第一輪:頂點(diǎn)891向頂點(diǎn)231、2343、6427、442、9712共5個(gè)頂點(diǎn)各發(fā)送內(nèi)容為1的消息,這5個(gè)頂點(diǎn)將自己的屬性更新為1;
第二輪:頂點(diǎn)231向頂點(diǎn)327、2851、412各發(fā)送內(nèi)容為2的消息,頂點(diǎn)2343向頂點(diǎn)327發(fā)送內(nèi)容為2的消息,頂點(diǎn)442向頂點(diǎn)63發(fā)送一條內(nèi)容為2的消息,頂點(diǎn)9712向頂點(diǎn)412、2081各發(fā)送一條內(nèi)容為2的消息,收到消息的各頂點(diǎn)消息合并后更新屬性為2;
第三輪:第二輪中接收到消息的頂點(diǎn)沒(méi)有下一頂點(diǎn)可以發(fā)送消息,即沒(méi)有新消息,所以迭代結(jié)束。
最終結(jié)果是:頂點(diǎn)891的屬性值為0,頂點(diǎn)231、2343、6427、442、9712為1(即頂點(diǎn)891經(jīng)過(guò)一步就可以到達(dá)這些點(diǎn)),其它各頂點(diǎn)的屬性值為2。
情況2:頂點(diǎn)891可以到達(dá)哪些點(diǎn)的情況,過(guò)程如下:
(1)首先初始化所有頂點(diǎn)的屬性,如果頂點(diǎn)的ID為891,則屬性值設(shè)為0,否則設(shè)為-1。上述過(guò)程由各個(gè)子圖并行處理自己的頂點(diǎn)。
(2)消息發(fā)送過(guò)程:對(duì)于每條邊,判斷如果源點(diǎn)的屬性≥0且終點(diǎn)的屬性<0,則向終點(diǎn)發(fā)送一個(gè)消息,消息內(nèi)容為源點(diǎn)的屬性值+1。
該實(shí)施例中以源點(diǎn)和終點(diǎn)的屬性值的大小為依據(jù),判斷是否沿著某條邊進(jìn)行消息的傳遞,實(shí)際應(yīng)用中,可以根據(jù)用戶的實(shí)際需求設(shè)定。
(3)消息合并過(guò)程:消息發(fā)送過(guò)程在多個(gè)子圖中并行進(jìn)行,因此一次會(huì)產(chǎn)生很多消息,發(fā)往相同頂點(diǎn)的消息都往其主頂點(diǎn)匯聚。主頂點(diǎn)可能會(huì)收到多條消息,主頂點(diǎn)將收到的多條消息進(jìn)行合并,由于本實(shí)施例中,每輪迭代中消息的內(nèi)容都是相同的,所以主頂點(diǎn)收到多個(gè)消息時(shí)可以隨便選取一條。
(4)屬性更新過(guò)程:每個(gè)頂點(diǎn)收到消息后,將屬性值更新為消息內(nèi)容。并將更新的屬性同步到從頂點(diǎn)。
(5)回到第二步進(jìn)行循環(huán)迭代,直到第二步?jīng)]有新消息產(chǎn)生。
對(duì)于情況2,結(jié)合圖1,整個(gè)消息發(fā)送、合并、同步的過(guò)程如下:
第一輪:頂點(diǎn)891向頂點(diǎn)2343、6427、442、9712各發(fā)送內(nèi)容為1的消息,這4個(gè)頂點(diǎn)將自己的屬性更新為1;
第二輪:頂點(diǎn)442向頂點(diǎn)63發(fā)送一條內(nèi)容為2的消息,頂點(diǎn)9712向頂點(diǎn)2081發(fā)送一條內(nèi)容為2的消息,頂點(diǎn)63和頂點(diǎn)2081收到消息的各頂點(diǎn)消息合并后更新屬性為2;
第三輪:第二輪中接收到消息的頂點(diǎn)沒(méi)有下一頂點(diǎn)可以發(fā)送消息,即沒(méi)有新消息,所以迭代結(jié)束。
最終結(jié)果是:頂點(diǎn)891屬性值為0,頂點(diǎn)2343、6427、442、9712的屬性值為1(即頂點(diǎn)891經(jīng)過(guò)一步就可以到達(dá)這些點(diǎn)),頂點(diǎn)63和頂點(diǎn)2081的屬性值為2,其它頂點(diǎn)的屬性值為-1(即頂點(diǎn)891不可到達(dá)這些點(diǎn))。
基于與上述基于圖計(jì)算引擎的消息同步方法相同的發(fā)明構(gòu)思,本發(fā)明實(shí)施例提供了一種基于圖計(jì)算引擎的消息同步系統(tǒng),如圖5所示,包括:消息發(fā)送模塊101,用于在各個(gè)子圖中,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);消息匯總模塊102,用于若下一頂點(diǎn)有主頂點(diǎn)索引,則根據(jù)下一頂點(diǎn)的主頂點(diǎn)索引,將下一頂點(diǎn)接收到的消息發(fā)送給下一頂點(diǎn)的主頂點(diǎn);消息融合模塊103,用于融合下一頂點(diǎn)的主頂點(diǎn)接收到的所有消息;消息同步模塊104,用于根據(jù)下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將融合后的消息發(fā)送給下一頂點(diǎn)的所有從頂點(diǎn);循環(huán)判斷模塊105,用于若未滿足終止條件,則返回執(zhí)行消息發(fā)送模塊的功能。
本發(fā)明實(shí)施例提供的基于圖計(jì)算引擎的消息同步系統(tǒng),在消息同步過(guò)程中,通過(guò)主頂點(diǎn)索引和從頂點(diǎn)索引快速查找到頂點(diǎn)在不同子圖間的位置,不再需要計(jì)算,提高了不同子圖間同步數(shù)據(jù)的效率。
其中,消息發(fā)送模塊101具體用于:若滿足觸發(fā)條件,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
進(jìn)一步地,消息發(fā)送模塊101具體用于:若邊被激活,將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn)。
進(jìn)一步地,消息發(fā)送模塊101具體用于:若當(dāng)前頂點(diǎn)接收到消息,則激活當(dāng)前頂點(diǎn);若當(dāng)前頂點(diǎn)被激活,則按照邊激活條件激活當(dāng)前頂點(diǎn)相應(yīng)的邊;若當(dāng)前頂點(diǎn)相應(yīng)的邊被激活,則將當(dāng)前頂點(diǎn)接收到的消息按預(yù)定規(guī)則沿當(dāng)前頂點(diǎn)的邊發(fā)送給下一頂點(diǎn);將當(dāng)前頂點(diǎn)的激活狀態(tài)清零。
其中,還包括屬性更新模塊,用于:根據(jù)融合后的消息更新下一頂點(diǎn)的主頂點(diǎn)的屬性;根據(jù)下一頂點(diǎn)的主頂點(diǎn)的從頂點(diǎn)索引,將更新后的下一頂點(diǎn)的主頂點(diǎn)的屬性發(fā)送給下一頂點(diǎn)的所有從頂點(diǎn);根據(jù)更新后的下一頂點(diǎn)的主頂點(diǎn)的屬性,更新下一頂點(diǎn)的從頂點(diǎn)的屬性。
最后應(yīng)說(shuō)明的是:以上各實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述各實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求和說(shuō)明書的范圍當(dāng)中。