桑麗麗 朱晗



摘要:文章研究如何使用Neo4J圖數(shù)據(jù)庫技術(shù)對人物事件關(guān)系進行有效數(shù)字化存儲和查詢。首先,通過與傳統(tǒng)關(guān)系型數(shù)據(jù)庫對比,分析了Neo4J數(shù)據(jù)庫在復(fù)雜關(guān)系存儲和查詢方面的優(yōu)勢,然后以“常州三杰”為例,分析了人物事件關(guān)系知識圖譜中的五大實體類型及其相互關(guān)系類型。在此基礎(chǔ)上分析了如何借助Py2neo和Pandas庫對“常州三杰”知識圖譜進行自動化的構(gòu)建并存儲到Neo4J數(shù)據(jù)庫中,最后分析了如何對存儲在Neo4J的知識圖譜進行有效的數(shù)據(jù)查詢。
關(guān)鍵詞:知識圖譜;人物事件關(guān)系;Neo4J
中圖分類號:TP311.52? ? ? 文獻標(biāo)識碼:A
文章編號:1009-3044(2022)22-0018-03
1 引言
瞿秋白、張?zhí)住链⑹浅錾?9世紀(jì)末的三位杰出革命青年,也是中國共產(chǎn)黨早期的主要領(lǐng)導(dǎo)人,他們均是江蘇常州籍貫,故稱為“常州三杰”[1]。“常州三杰”犧牲時非常年輕,他們短暫一生中所體現(xiàn)的滿腔愛國精神、革命奮斗精神和堅定不移的共產(chǎn)主義信念是當(dāng)代青年的學(xué)習(xí)榜樣[2]。
目前,有關(guān)“常州三杰”的革命事跡大多以圖文和影視資料的形式展示,側(cè)重于以主人翁為中心、以時間順序為主線進行闡述。然而,“常州三杰”出生成長于相同的時代背景,彼此之間在時間和空間上存在一定程度的關(guān)聯(lián)性,研究他們之間的人物事件關(guān)系可以更深入立體地感受常州三杰的革命事跡。
人物事件關(guān)系是具體人物圍繞具體事件而產(chǎn)生的相互關(guān)系,這種人物和事物之間的相互關(guān)系可以通過知識圖譜進行描述、存儲并查詢展示。Neo4J是當(dāng)前流行的圖數(shù)據(jù)庫軟件,它不僅僅能夠支持圖型數(shù)據(jù)的存儲和查詢,也支持使用Python等高級程序語言調(diào)用應(yīng)用程序接口管理和查詢圖型數(shù)據(jù),從而能夠發(fā)現(xiàn)數(shù)據(jù)之間復(fù)雜和潛在的關(guān)系[3]。
2 基于Neo4J的圖數(shù)據(jù)庫簡介
Neo4J圖型數(shù)據(jù)庫不同于傳統(tǒng)的數(shù)據(jù)庫,它沒有表和字段的概念,取而代之的是實體、關(guān)系和屬性。它使用明確的關(guān)系(Relationship) 來代替?zhèn)鹘y(tǒng)關(guān)系型數(shù)據(jù)庫中表與表之間隱藏的關(guān)系,從而更容易表述現(xiàn)實世界中事物之間的關(guān)系[4]。在Neo4J中實體與實體之間通過明確的關(guān)系產(chǎn)生鏈接,而關(guān)系的屬性和名稱可以由設(shè)計者根據(jù)實際情況自由定義,沒有傳統(tǒng)關(guān)系型數(shù)據(jù)庫的范式要求,因此,Neo4J數(shù)據(jù)庫的模型設(shè)計也更加自由。盡管如此,在構(gòu)建基于Neo4J的知識圖譜之前依然有必要對圖型數(shù)據(jù)庫的模型進行分析,從而確保后期數(shù)據(jù)管理的規(guī)范性和一致性。
3 知識圖譜中人物事件的關(guān)系分析
在領(lǐng)域知識獲取方面,首先通過百度百科了解有關(guān)瞿秋白、張?zhí)住链h的人物履歷和大事年表,然后再參考中信出版社出版的《瞿秋白年譜詳編》、上海辭書出版社的《張?zhí)啄曜V新編》以及華中師范大學(xué)出版社的《惲代英年譜》,對常州三杰的革命成長歷程深入對比分析。
通過對文獻資料的梳理可以發(fā)現(xiàn):有關(guān)歷史人物事件的描述過程中主要存在五個實體,即:歷史人物、歷史事件、組織機構(gòu)、歷史文物、角色職位。其中,組織機構(gòu)實體又可以細(xì)分為:學(xué)校、黨派、組織、出版社等具體的形態(tài),歷史事件可以具體細(xì)分運動、事件與會議等形態(tài)。每種實體都具有不同的屬性,比如歷史人物具有姓名、出生日期、籍貫、人物詳情等屬性,而歷史事件具有發(fā)生時間和發(fā)生地點等屬性,組織機構(gòu)也具有名稱、成立時間、成立地點等屬性。具體見表1。這些實體之間也存在著不同的關(guān)聯(lián)關(guān)系,需要在知識圖譜中描述并展示。
在“常州三杰”知識圖譜的研究中,歷史人物實體是指在歷史事件、組織機構(gòu)中與“常州三杰”關(guān)聯(lián)的主要歷史人物的集合。通過對文獻資料的梳理,可以發(fā)現(xiàn)歷史人物之間存在各種關(guān)聯(lián)關(guān)系,這些關(guān)聯(lián)關(guān)系具體可以劃分為:支持、批評、反對、敵對、朋友、戰(zhàn)友、校友、翻譯、夫妻、父子、父女、母子、母女等關(guān)系。其中,有些歷史人物的關(guān)系是長期固定不變的,比如:瞿秋白與張?zhí)字g的校友關(guān)系和朋友關(guān)系是不變化的,另外一些歷史人物的關(guān)系是僅出現(xiàn)于某個歷史時刻的[5]。因此,上述歷史人物關(guān)系都需要設(shè)置關(guān)系產(chǎn)生的時間屬性。
歷史人物與歷史事件之間的關(guān)系也需要在知識圖譜模型中體現(xiàn)。這種關(guān)系是根據(jù)歷史人物在歷史事件中扮演的角色進行劃分的。在上述實體分析中歷史事件具有運動、事件、起義和會議等多種具體形態(tài)。1) 歷史人物與歷史運動、起義事件的關(guān)系可以劃分為參加和領(lǐng)導(dǎo)兩類關(guān)系。比如:與“常州三杰”相關(guān)的主要歷史運動包括:五四運動、五卅運動和廣州起義等,張?zhí)?、瞿秋白與五四運動的關(guān)系是參加,張?zhí)着c廣州起義的關(guān)系是領(lǐng)導(dǎo),瞿秋白與五卅運動之間關(guān)系也是領(lǐng)導(dǎo)。2) 歷史人物與會議之間關(guān)系可以劃分為參加與主持兩類關(guān)系。比如瞿秋白主持了中國共產(chǎn)黨第六次全國代表大會。
歷史人物與組織機構(gòu)之間的關(guān)聯(lián)關(guān)系較為復(fù)雜。“常州三杰”在革命成長的過程中不斷追求真理、尋求進步,積極投身到各種進步學(xué)術(shù)團體和研究會,組建了各種民主革命運動,他們在不同組織結(jié)構(gòu)中擔(dān)任的職務(wù)角色也會不斷發(fā)生變化。因此,本文首先將涉及的學(xué)校、學(xué)會、出版機構(gòu)和進步團體等在圖數(shù)據(jù)模型中抽象表示為組織機構(gòu)實體;對組織結(jié)構(gòu)實體設(shè)置名稱屬性進行具體區(qū)分,還設(shè)置了成立時間、成立地點和機構(gòu)介紹等屬性,使得每個組織結(jié)構(gòu)的實例具體明確,便于區(qū)分。另外,在歷史人物和組織機構(gòu)之間增加中間實體角色職位,因為歷史人物主要是通過角色職位來與組織機構(gòu)發(fā)生聯(lián)系的。從而使歷史人物與組織機構(gòu)之間的復(fù)雜關(guān)系轉(zhuǎn)變?yōu)闅v史人物與職位及組織機構(gòu)與職位的兩層關(guān)系。歷史人物與職位之間的關(guān)系主要是任職和離職關(guān)系,而職位與組織機構(gòu)之間主要是設(shè)立和撤銷關(guān)系。
如果歷史人物與組織機構(gòu)之間是簡單地創(chuàng)建或加入關(guān)系,那么只需要直接將兩個實體進行關(guān)聯(lián),關(guān)系的名稱就設(shè)置為創(chuàng)建或加入。比如:李大釗創(chuàng)建了北京大學(xué)馬克思學(xué)說研究會;張?zhí)准尤肓吮本┐髮W(xué)馬克思學(xué)說研究會。
如果歷史人物與組織機構(gòu)之間存在擔(dān)任職位的關(guān)系,那么需要額外地加入職位實體。比如:有關(guān)瞿秋白在上海大學(xué)的擔(dān)任過教務(wù)長的描述,在圖數(shù)據(jù)模型中可以設(shè)置歷史人物實體與職位實體之間是任職關(guān)系,而組織機構(gòu)實體與職位實體之間就是設(shè)立關(guān)系。另一方面,歷史人物在組織機構(gòu)的任職是動態(tài)變化的。因此,有必要在歷史人物與職位的任職、離職關(guān)系中以及組織機構(gòu)與職位的設(shè)立、撤銷關(guān)系中均增加時間屬性,以便于描述在不同歷史時期下,歷史人物與組織機構(gòu)的關(guān)聯(lián)關(guān)系以及歷史人物職位上的變化。
歷史人物與歷史文物之間的關(guān)系需要根據(jù)歷史文物的具體形態(tài)進行劃分,如果歷史文物是具有內(nèi)容或觀點的文章或書籍,那么歷史人物與此類文物之間的關(guān)系包括:創(chuàng)作、發(fā)表、支持、反對等。如果歷史文物是一件物品,那么歷史人物與此類文物之間的關(guān)系包括:創(chuàng)造、擁有和失去的關(guān)系,其他類型的文物與歷史人物之間的關(guān)系可以簡單概括為相關(guān)關(guān)系。歷史人物與文物之間的關(guān)系也會因時間的推移發(fā)生改變,因此需要為歷史人物與文物之間的具體關(guān)系,增加發(fā)生時間、發(fā)生地點等屬性。
組織機構(gòu)與歷史事件之間的關(guān)系需要根據(jù)歷史事件類型進行劃分:如果歷史事件是會議,那么組織機構(gòu)與會議之間既可以是以組織機構(gòu)為主導(dǎo)的召開關(guān)系,如中國社會主義青年團召開了共青團第三次全國代表大會;也可以是會議成立了某個組織機構(gòu)。
歷史事件與職位也會產(chǎn)生關(guān)聯(lián),而職位進一步通過與歷史人物的任職關(guān)系以及職務(wù)與組織機構(gòu)的設(shè)立和撤銷關(guān)系,比如中共五屆一中全會上選舉了瞿秋白為中央政治局委員,那么這里歷史事件形態(tài)是會議,它與職位之間是設(shè)置關(guān)系,歷史人物與職位之間是任職關(guān)系,而組織機構(gòu)與職位之間是設(shè)置關(guān)系。這樣的歷史事件將所有的實體關(guān)聯(lián)到一起形成了關(guān)系網(wǎng)絡(luò)圖結(jié)構(gòu)。
綜合以上分析可以得到五大實體之間的主要關(guān)系如表2所示??梢?,歷史人物、歷史事件、組織機構(gòu)及歷史文物之間是具有復(fù)雜關(guān)系的網(wǎng)絡(luò)模型,使用傳統(tǒng)二維表的關(guān)系型數(shù)據(jù)模型難以描述和維護,而使用基于Neo4J的圖數(shù)據(jù)模型能夠更直觀地描述和維護。
4 基于Neo4J的“常州三杰”知識圖譜構(gòu)建
使用Neo4J創(chuàng)建的知識圖譜由節(jié)點和節(jié)點之間關(guān)系構(gòu)成。每個節(jié)點都具有標(biāo)簽(Label) 和屬性(Properties) [4]。通過上述數(shù)據(jù)模型的分析,在Neo4J數(shù)據(jù)庫中添加五種類型的節(jié)點:歷史人物、歷史事件、組織機構(gòu)、歷史文物和職位。節(jié)點的Label值分別是Person、Event、Agency、Things和Role,并按照表1中的實體屬性設(shè)置每個節(jié)點的屬性。
Neo4J支持使用自帶的Cypher查詢命令語言手工添加節(jié)點,但是由于常州三杰文獻資料中涉及的人物較多,完全手工添加數(shù)據(jù)不僅效率低,而且容易出錯。本文借助Python程序設(shè)計的Pandas庫和Py2neo庫來實現(xiàn)對知識圖譜中節(jié)點數(shù)據(jù)的自動化創(chuàng)建。
Pandas庫是開源的結(jié)構(gòu)化數(shù)據(jù)分析工具,它可以讀取諸如Excel、txt、csv等多種格式的數(shù)據(jù)源,并具高性能的數(shù)據(jù)運算功能[5]。利用Pandas庫的read_excel方法,傳入文件名就可以很方便地讀取Excel表中的數(shù)據(jù),進入進行數(shù)據(jù)清洗和分析。
Py2neo庫是Python程序訪問Neo4J數(shù)據(jù)庫的開源工具包,Python程序可以利用Py2neo連接到Neo4J數(shù)據(jù)庫中并使用其提供的Graph對象來創(chuàng)建節(jié)點和關(guān)系。在Py2neo中使用Node對象構(gòu)建節(jié)點,使用Relationship構(gòu)建關(guān)系,使用Create方法或Merge方法來創(chuàng)建節(jié)點和關(guān)系。在Py2neo庫中也可以使用run方法直接運行Cypher查詢命令來返回查詢結(jié)果,借助圖數(shù)據(jù)庫的索引功能,還可以提升數(shù)據(jù)的查詢效率。
因此,可以借助Pandas和Py2neo庫將知識圖譜的創(chuàng)建程序化。先將文獻中涉及的具體實體分類保存在Excel表格中,然后基于Python程序語言的Pandas庫將Excel表格中的數(shù)據(jù)導(dǎo)入到DataFrame數(shù)據(jù)結(jié)構(gòu)中,DataFrame數(shù)據(jù)結(jié)構(gòu)是由行和列組成的二維表。再通過Py2neo庫的Node對象構(gòu)建節(jié)點。程序通過循環(huán)遍歷DataFrame數(shù)據(jù)結(jié)構(gòu)中的每一行數(shù)據(jù),并將遍歷到的數(shù)據(jù)填充到Node對象,最后通過Py2neo庫的Graph對象連接到Neo4J,最后使用Create方法將Node節(jié)點添加到數(shù)據(jù)庫中。
有關(guān)歷史人物關(guān)系的創(chuàng)建:先對照將文獻資料將主要的人物關(guān)系保存到Excel表格中, 然后通過Pandas庫將Excel數(shù)據(jù)表讀入到DataFrame結(jié)構(gòu)中,通過Py2neo庫的Relationship對象構(gòu)建節(jié)點之間的關(guān)系。在構(gòu)建節(jié)點關(guān)系之前需要先驗證相關(guān)節(jié)點是否存在于數(shù)據(jù)庫中,可以使用NodeMatcher對象的Match方法判斷DataFrame中的起始和結(jié)束節(jié)點是否存在,只有當(dāng)關(guān)系的起始和結(jié)束節(jié)點都已經(jīng)存在的條件下才可以創(chuàng)建關(guān)系。節(jié)點間關(guān)系的創(chuàng)建使用Graph對象的merge方法。
上述有關(guān)歷史人物節(jié)點之間的關(guān)系創(chuàng)建程序流程如圖1所示。創(chuàng)建后的歷史人物關(guān)系知識圖譜展示效果如圖2所示。其他節(jié)點,如:歷史事件、組織機構(gòu)、歷史文物及職位在知識圖譜中的創(chuàng)建及節(jié)點之間關(guān)系的構(gòu)建,在實現(xiàn)算法上與歷史人物及其關(guān)系的構(gòu)建相似,都采用Pandas庫從Excel表格中批量讀取,然后使用Py2neo庫批量添加到圖數(shù)據(jù)庫中構(gòu)成知識圖譜關(guān)系網(wǎng)絡(luò)。
5 基于Neo4J的“常州三杰”知識圖譜的查詢
Neo4J不僅支持對知識圖譜數(shù)據(jù)的構(gòu)建,還能夠?qū)χR圖譜中的數(shù)據(jù)節(jié)點和節(jié)點之間的關(guān)系進行高效率查詢。不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫低效率的表連接查詢,在Neo4J內(nèi)部使用Cypher命令既可以查詢節(jié)點之間的直接關(guān)系,也可以查詢節(jié)點之間的間接關(guān)系。并且可以設(shè)置查詢關(guān)系的方向[4]。這種關(guān)系的查詢可以跨越多個節(jié)點,從而能夠有效發(fā)現(xiàn)節(jié)點之間的潛在關(guān)系。
通過命令:match (p1:person)-[r1:'創(chuàng)建']->(a1:agency)<-[r2: '加入']-(p2:person) return p1,p2,a1 可以查找到歷史人物p2加入由歷史人物p1創(chuàng)建的組織機構(gòu)a1中的關(guān)聯(lián)關(guān)系,從而發(fā)現(xiàn)歷史人物p1與p2之間的潛在關(guān)系。在“常州三杰”知識圖譜中,上述命令就可以查詢到瞿秋白曾經(jīng)加入鄧中夏和于佑任等人創(chuàng)建的上海大學(xué),以及瞿秋白和鄧中夏都加入由李大釗創(chuàng)建的北京大學(xué)馬克思主義學(xué)說研究會。
借助Py2neo庫可以將基于Cypher命令的手工查詢步驟程序化,從而使前端用戶發(fā)送查詢需求后,經(jīng)過Python語言的分析和處理,返回查詢結(jié)果的效果。Py2neo庫中提供了兩種查詢方案:
第一種方案是使用matching包中的NodeMatcher類和RelationshipMatcher類,前者用于節(jié)點查詢后者用于關(guān)系查詢,這兩個類都是用match方法來查找符合調(diào)節(jié)的節(jié)點或關(guān)系。
第二方案是直接使用Graph類的run方法,該方法接收Cypher查詢命令,將查詢命令傳遞給Neo4J數(shù)據(jù)庫,并將查詢結(jié)果進行封裝后返回給程序。Python程序得通過data()方法將查詢結(jié)果轉(zhuǎn)換為元素為字典類型的列表,也可以通過to_data_frame()將查詢結(jié)果轉(zhuǎn)為Pandas庫的DataFrame結(jié)構(gòu)進行數(shù)據(jù)處理。例如程序:graph.run("match(a:person{name:'張?zhí)?})-[r]->(b:person) return a,r,b").data() 返回的結(jié)果是與張?zhí)紫嚓P(guān)的人物及其關(guān)系的列表集合。
6 結(jié)束語
綜上所述,歷史人物事件的相互關(guān)系錯綜復(fù)雜,使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫無法完整描述,也無法實現(xiàn)對數(shù)據(jù)的有效管理和查詢。Neo4J圖型數(shù)據(jù)庫非常適合此類復(fù)雜關(guān)系的存儲和查詢。并且借助Python程序設(shè)計語言的Py2neo庫以及Pandas庫可以實現(xiàn)存儲和查詢的程序自動化。在對歷史人物事件的領(lǐng)域建模過程中,本文主要依據(jù)常州三杰的有關(guān)文獻,為知識圖譜設(shè)置了五個實體:歷史人物、歷史事件、組織機構(gòu)、歷史文物和職位,并分析了五個實體之間的相互關(guān)系,為圖數(shù)據(jù)模型中節(jié)點的類型及關(guān)系的類型奠定了基礎(chǔ),保證了節(jié)點和關(guān)系數(shù)據(jù)類型的一致性。
參考文獻:
[1] 沈建鋼.“常州三杰”精神研究[J].常州工學(xué)院學(xué)報(社科版),2011,29(3):1-6.
[2] 曹祖平.弘揚“常州三杰”精神的歷史使命和意義[J].企業(yè)導(dǎo)報,2011(16):244-245.
[3] 張幟.Neo4j權(quán)威指南[M].北京:清華大學(xué)出版社,2017.
[4] 陳韶健.Neo4j全棧開發(fā)[M].北京:電子工業(yè)出版社,2017.
[5] 丁洪麗.基于Neo4j圖數(shù)據(jù)庫的人員關(guān)系挖掘[J].電訊技術(shù),2020,60(7):771-777.
【通聯(lián)編輯:謝媛媛】