陳肖勇 蔡永健 顧丹鵬 何栓康 主令恒
摘? 要: 為了提升工程建設(shè)及運(yùn)維過程的工作效率和質(zhì)量,建設(shè)覆蓋工程全過程的全生命周期工程數(shù)據(jù)中心具有重大意義。工程數(shù)據(jù)中心數(shù)據(jù)建設(shè)的特點(diǎn)在于數(shù)據(jù)之間關(guān)聯(lián)的多樣化和復(fù)雜化,為適應(yīng)這樣的數(shù)據(jù)存儲需求,采用區(qū)別于關(guān)系型數(shù)據(jù)庫的圖數(shù)據(jù)庫構(gòu)建工程主數(shù)據(jù)的存儲方案,以維護(hù)其復(fù)雜多變的關(guān)聯(lián)關(guān)系,并為基于圖結(jié)構(gòu)數(shù)據(jù)進(jìn)行數(shù)據(jù)分析應(yīng)用提供了可能。
關(guān)鍵詞: 圖數(shù)據(jù)庫; 數(shù)據(jù)存儲; 數(shù)據(jù)中心; 圖結(jié)構(gòu)數(shù)據(jù)
中圖分類號:TP392? ? ? ? ? 文獻(xiàn)標(biāo)識碼:A? ? ?文章編號:1006-8228(2021)09-42-04
Abstract: In order to improve the work efficiency and quality of project construction and maintenance process, it is of great significance to establish a full life cycle engineering data center covering the whole process of the project. The characteristics of data construction of engineering data center are the diversification and complexity of data association. In order to adapt to such data storage needs, the graph database, which is different from the relational database, is used to construct the storage of main engineering data in order to maintain the complex and changeable association relationship, and provide the possibility for graph structured data based data analysis and application.
Key words: graph database; data storage; data center; graph structured data
0 引言
工程數(shù)據(jù)中心的數(shù)據(jù)建設(shè)特點(diǎn)在于數(shù)據(jù)之間關(guān)聯(lián)多樣化和復(fù)雜化,系統(tǒng)設(shè)計之初需要考慮到為建立主數(shù)據(jù)管理體系和數(shù)據(jù)標(biāo)準(zhǔn)體系提供靈活可配置的數(shù)據(jù)模型,對于其采用的主數(shù)據(jù)庫選型,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫受到了一定的限制和約束。
近年來,有別于傳統(tǒng)關(guān)系型數(shù)據(jù)庫,出現(xiàn)了一系列新型的No-SQL數(shù)據(jù)庫類型(Not Only SQL,非關(guān)系型數(shù)據(jù)庫),其中圖數(shù)據(jù)庫(Graph Database)是一種以圖結(jié)構(gòu)進(jìn)行語義查詢,并使用頂點(diǎn)、邊與屬性來表示和存儲數(shù)據(jù)的數(shù)據(jù)庫[1]。圖數(shù)據(jù)庫的關(guān)鍵概念是邊,通過邊將頂點(diǎn)連接在一起,從而進(jìn)行快速的圖檢索操作。圖數(shù)據(jù)庫的關(guān)注點(diǎn)是“關(guān)聯(lián)關(guān)系”形成的圖,其目標(biāo)是對現(xiàn)實(shí)世界中的實(shí)體與實(shí)體之間的關(guān)聯(lián)關(guān)系進(jìn)行存儲與分析:將實(shí)體抽象為頂點(diǎn)、將實(shí)體之間的關(guān)聯(lián)關(guān)系抽象為邊。通過頂點(diǎn)和邊形成的圖譜結(jié)構(gòu),直觀自然的表達(dá)萬物關(guān)聯(lián)的世界,同時解決了復(fù)雜關(guān)聯(lián)關(guān)系深層檢索的性能問題。
考慮到工程數(shù)據(jù)中心的主數(shù)據(jù)特點(diǎn),本文探討在工程數(shù)據(jù)中心的設(shè)計中應(yīng)用圖數(shù)據(jù)庫存儲和管理工程主數(shù)據(jù),以維護(hù)其復(fù)雜多變的關(guān)聯(lián)關(guān)系,實(shí)踐中本文案例選取了具備多種NoSQL特點(diǎn)的原生多模型圖數(shù)據(jù)庫ArangoDB,構(gòu)建了工程數(shù)據(jù)中心的主數(shù)據(jù)服務(wù)。
1 圖數(shù)據(jù)庫簡介
現(xiàn)實(shí)世界中的一切事物都處在聯(lián)系之中,如人際關(guān)系、電腦網(wǎng)絡(luò)、地理數(shù)據(jù)、分子結(jié)構(gòu)模型等,無一不處在紛繁復(fù)雜的聯(lián)系之中。這種聯(lián)系,形成了一種互相關(guān)聯(lián)的數(shù)據(jù),聯(lián)系才是數(shù)據(jù)的本質(zhì)所在。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫并不能很好地表現(xiàn)數(shù)據(jù)的聯(lián)系,而一些NoSQL數(shù)據(jù)庫又不能表現(xiàn)數(shù)據(jù)之間的聯(lián)系。同樣是NoSQL的圖數(shù)據(jù)庫,是以圖的結(jié)構(gòu)形式來存儲數(shù)據(jù)的,它所存儲的就是聯(lián)系的數(shù)據(jù),是關(guān)聯(lián)數(shù)據(jù)本身[2]。
關(guān)聯(lián)數(shù)據(jù)中的聯(lián)系本來就很復(fù)雜,若要在關(guān)系型數(shù)據(jù)庫中使用結(jié)構(gòu)化形式來表現(xiàn)這種聯(lián)系,則一般不能直接表示,處理起來既煩瑣又費(fèi)事,并且隨著數(shù)據(jù)的不斷增長,其訪問性能將日趨下降。無數(shù)的開發(fā)人員和數(shù)據(jù)庫管理人員都或多或少地使用過關(guān)系型數(shù)據(jù)庫,在其應(yīng)用的規(guī)?;M(jìn)展過程中,對于數(shù)據(jù)庫的性能優(yōu)化往往捉襟見肘、陷入窘境。圖數(shù)據(jù)庫沒有模式結(jié)構(gòu)的定義,也不需要這些定義,它使用非結(jié)構(gòu)化的方式來存儲關(guān)聯(lián)數(shù)據(jù),所以能夠直接表現(xiàn)數(shù)據(jù)的關(guān)聯(lián)特性。
2 圖數(shù)據(jù)庫優(yōu)勢
2.1 數(shù)據(jù)處理速度
圖數(shù)據(jù)庫可以很高效地插入大量數(shù)據(jù)。圖數(shù)據(jù)庫面向的應(yīng)用領(lǐng)域數(shù)據(jù)量可能都比較大,比如知識圖譜、社交關(guān)系、風(fēng)控關(guān)系等,總數(shù)據(jù)量級別一般在億或十億以上,有的甚至達(dá)到百億級。關(guān)系型數(shù)據(jù)庫如mysql不做分庫分表的情況下插入百萬數(shù)據(jù)基本就很慢,圖數(shù)據(jù)則能夠勝任億級以上的數(shù)據(jù),比如Neo4j、ArangoDB等圖數(shù)據(jù)庫,在持續(xù)插入億級的數(shù)據(jù)基本還能保持在一個較高的速度[3]。
圖數(shù)據(jù)庫可以很高效地查詢關(guān)聯(lián)數(shù)據(jù)。傳統(tǒng)關(guān)系型數(shù)據(jù)庫不擅長做關(guān)聯(lián)查詢,特別是多層關(guān)聯(lián)。因為關(guān)系型數(shù)據(jù)庫一般需要做表連接,表連接是一個很昂貴的操作,涉及到大量的IO操作和內(nèi)存消耗。圖數(shù)據(jù)庫對關(guān)聯(lián)查詢一般都進(jìn)行針對性的優(yōu)化,比如存儲模型上、數(shù)據(jù)結(jié)構(gòu)、查詢算法等,防止局部數(shù)據(jù)的查詢引發(fā)全部數(shù)據(jù)的讀取[4]。
2.2 擴(kuò)展性
圖數(shù)據(jù)庫使用圖的方式來表達(dá)現(xiàn)實(shí)世界的關(guān)系很直接、自然,易于建模。比如工程中某位工程師繪制了一張圖紙,就可以建立一條邊連接這個工程師和這張圖紙,這條邊就叫做“繪制”邊,同時這位工程師還是可以有很多其他的邊,比如所屬部門、檢查設(shè)備邊等,同樣這張圖紙也有其他邊,這樣很自然地就構(gòu)建了關(guān)系網(wǎng)。
此外,圖數(shù)據(jù)庫提供了針對圖檢索的查詢語言和專業(yè)的分析算法工具。圖數(shù)據(jù)庫語言比如GRE面臨、Cypher等,算法比如ShortestPath、PageRank,PersonalRank、Louvain等,這些語言、算法工具為圖數(shù)據(jù)庫的擴(kuò)展提供了很大的便利。
3 數(shù)據(jù)處理技術(shù)方案
3.1 數(shù)據(jù)庫選擇與設(shè)計
ArangoDB是一個原生多模型數(shù)據(jù)庫,兼有key/value鍵/值對、graph圖和document文檔數(shù)據(jù)模型,提供了涵概三種數(shù)據(jù)模型的統(tǒng)一的數(shù)據(jù)庫查詢語言,并允許在單個查詢中混合使用三種模型?;谄浔镜丶啥嗄P吞匦裕С执罱ǜ咝阅艹绦?,并且這三種數(shù)據(jù)模型均支持水平擴(kuò)展。
本文的實(shí)踐中,選擇了ArangoDB數(shù)據(jù)庫作為工程數(shù)據(jù)中心主數(shù)據(jù)服務(wù)的存儲解決方案,主要理由是其多模型特征在利用其圖存儲特性之外,還能利用鍵/值對模型與工程數(shù)據(jù)中心包括元數(shù)據(jù)服務(wù)在內(nèi)的其他服務(wù)模塊進(jìn)行跨數(shù)據(jù)庫數(shù)據(jù)映射匹配。
3.1.1 容器設(shè)計
不同于關(guān)系型數(shù)據(jù)庫,圖數(shù)據(jù)庫沒有表結(jié)構(gòu),取而代之的是容器的概念。容器與表相似,可以定義屬性字段和標(biāo)簽。容器分普通容器和邊容器,普通容器用于存儲圖的節(jié)點(diǎn),邊容器則存儲圖的邊。
工程數(shù)據(jù)中心的應(yīng)用場景將工程數(shù)據(jù)對象用普通容器存儲為節(jié)點(diǎn),并定義為主數(shù)據(jù)容器。
主數(shù)據(jù)容器包含固定字段和動態(tài)字段,固定字段用于標(biāo)識數(shù)據(jù)對象的類型和基本信息,動態(tài)字段是一個JSON形式保存鍵值對的字段,用于保存基于實(shí)際應(yīng)用場景定義的數(shù)據(jù)對象屬性。
3.1.2 動態(tài)字段設(shè)計
為適應(yīng)可動態(tài)配置的屬性字段結(jié)構(gòu),把屬性字段定義在單獨(dú)的表進(jìn)行維護(hù),并約束屬性字段的名稱、類型、規(guī)則和取值范圍,通過唯一的屬性字段ID進(jìn)行匹配。具體匹配方式為,在用于存儲動態(tài)字段的JSON子串中,用屬性字段ID作為鍵值對的鍵,對應(yīng)的屬性值作為鍵值對的值。當(dāng)數(shù)據(jù)對象被讀取時,對JSON字串中每個鍵值對,利用屬性字段ID匹配查詢出每個屬性字段的名稱、類型等信息,配上鍵值對的值,即為完整的每個屬性。
該設(shè)計還可以將數(shù)據(jù)對象的關(guān)聯(lián)關(guān)系抽象為一種屬性字段,并通過屬性字段ID和圖數(shù)據(jù)存儲結(jié)構(gòu)的邊進(jìn)行標(biāo)簽關(guān)聯(lián),數(shù)據(jù)對象與另一個數(shù)據(jù)對象的關(guān)聯(lián)描述作為一個引用屬性在數(shù)據(jù)對象的內(nèi)容中體現(xiàn)。
3.2 事務(wù)處理
在數(shù)據(jù)處理的過程中,不可避免的需要面對事務(wù)機(jī)制,在存在多種關(guān)聯(lián)關(guān)系的圖結(jié)構(gòu)數(shù)據(jù)中,數(shù)據(jù)聯(lián)動修改時的事務(wù)機(jī)制實(shí)現(xiàn)也是圖數(shù)據(jù)庫應(yīng)用實(shí)踐中需要面對的問題。
Spring Data ArangoDB對數(shù)據(jù)庫事務(wù)機(jī)制的支持并不完善,實(shí)踐中開發(fā)團(tuán)隊對此進(jìn)行了額外的處理,利用ArangoDB Java Driver驅(qū)動模塊提供的事務(wù)相關(guān)接口完成了事務(wù)封裝的實(shí)現(xiàn)。事務(wù)實(shí)現(xiàn)流程見圖1:通過構(gòu)建自定義的事務(wù)處理模版,將數(shù)據(jù)處理相關(guān)的核心流程進(jìn)行封裝,并將事務(wù)實(shí)現(xiàn)的相關(guān)流程(獲取事務(wù)ID、構(gòu)建選項參數(shù)、調(diào)用)操作嵌入模版,利用驅(qū)動提供的ArangoAspect完成事務(wù)機(jī)制的實(shí)現(xiàn)。
4 圖數(shù)據(jù)庫應(yīng)用實(shí)踐
4.1 工程數(shù)據(jù)中心說明
工程數(shù)據(jù)中心項目目標(biāo)是為建立各工程行業(yè)BIM模型及工程數(shù)據(jù)標(biāo)準(zhǔn),梳理設(shè)計、建管、運(yùn)維三大平臺的主數(shù)據(jù)及關(guān)系,實(shí)現(xiàn)工程全過程數(shù)據(jù)貫通,并在此基礎(chǔ)上不斷圍繞工程進(jìn)行數(shù)據(jù)的集成、復(fù)用、沉淀,從而創(chuàng)造數(shù)據(jù)價值和業(yè)務(wù)價值[5]。
工程主數(shù)據(jù)指具有高業(yè)務(wù)價值的、可以在工程內(nèi)跨越各個階段、各個業(yè)務(wù)部門被重復(fù)使用的數(shù)據(jù),是具有單一、準(zhǔn)確、權(quán)威性質(zhì)的數(shù)據(jù)。工程主數(shù)據(jù)包含工程元數(shù)據(jù)、工程引用數(shù)據(jù)、工程結(jié)構(gòu)數(shù)據(jù)、業(yè)務(wù)結(jié)構(gòu)數(shù)據(jù)。工程元數(shù)據(jù),指工程數(shù)據(jù)中心最基礎(chǔ)的數(shù)據(jù),是關(guān)于工程數(shù)據(jù)的數(shù)據(jù),或者是用于描述其他工程數(shù)據(jù)的結(jié)構(gòu)數(shù)據(jù)。工程引用數(shù)據(jù),定義了工程元數(shù)據(jù)的可能取值范圍,也可稱為屬性值域。工程結(jié)構(gòu)數(shù)據(jù),描述了工程數(shù)據(jù)之間的關(guān)系,反映了現(xiàn)實(shí)世界的實(shí)體間的關(guān)系或流程。業(yè)務(wù)結(jié)構(gòu)數(shù)據(jù),數(shù)據(jù)描述了各工程業(yè)務(wù)的直接參與者,業(yè)務(wù)結(jié)構(gòu)數(shù)據(jù)描述的數(shù)據(jù)實(shí)體通常由一個唯一的數(shù)據(jù)編碼以及大量的屬性信息構(gòu)成。根據(jù)工程數(shù)據(jù)中心業(yè)務(wù)應(yīng)用需求,數(shù)據(jù)層負(fù)責(zé)數(shù)據(jù)存儲,包括工程元數(shù)據(jù)、工程引用數(shù)據(jù)、工程結(jié)構(gòu)數(shù)據(jù)、業(yè)務(wù)結(jié)構(gòu)數(shù)據(jù)、模型文件、模型屬性、空間位置及文檔文件等,這些數(shù)據(jù)包含結(jié)構(gòu)化與非結(jié)構(gòu)化數(shù)據(jù),為了存儲這些數(shù)據(jù),需要采用多種存儲技術(shù),構(gòu)建異構(gòu)數(shù)據(jù)系統(tǒng),具體包括:分布式緩存(Redis)這類內(nèi)存數(shù)據(jù)庫,用于提升服務(wù)響應(yīng)性能;對象存儲(Minio,ObjectStorage Service)用于存儲非結(jié)構(gòu)化數(shù)據(jù),如模型、文檔;關(guān)系型數(shù)據(jù)庫(MySQL)用于存儲主數(shù)據(jù)及系統(tǒng)相關(guān)數(shù)據(jù);圖數(shù)據(jù)庫(ArangoDB)用于存儲工程對象數(shù)據(jù),組成工程對象關(guān)系網(wǎng)絡(luò);空間數(shù)據(jù)庫(PostgreSQL+PostGIS)用于存儲BIM的空間幾何數(shù)據(jù)。
4.2 圖數(shù)據(jù)庫的應(yīng)用
圖數(shù)據(jù)庫在工程數(shù)據(jù)中心用于存儲工程對象數(shù)據(jù),包括數(shù)據(jù)對象和對象關(guān)聯(lián)關(guān)系。具體數(shù)據(jù)對象的創(chuàng)建思路分兩步。
第一步,建立數(shù)據(jù)標(biāo)準(zhǔn),數(shù)據(jù)標(biāo)準(zhǔn)描述了工程對象數(shù)據(jù)的關(guān)系結(jié)構(gòu)和屬性字段定義。將數(shù)據(jù)標(biāo)準(zhǔn)結(jié)構(gòu)化存儲,其結(jié)果稱為工程元數(shù)據(jù),這些工程元數(shù)據(jù)并不以圖結(jié)構(gòu)存儲而是更適合以SQL數(shù)據(jù)庫存儲,僅用于驅(qū)動工程對象數(shù)據(jù)的存取操作過程。
第二步,完成工程元數(shù)據(jù)創(chuàng)建后,可以在圖數(shù)據(jù)庫具體創(chuàng)建工程數(shù)據(jù)對象,按上文3.1.2節(jié)所述的動態(tài)字段設(shè)計邏輯,工程數(shù)據(jù)對象基于第一步的工程元數(shù)據(jù)創(chuàng)建數(shù)據(jù)對象實(shí)體,包括其動態(tài)屬性字段,即為圖結(jié)構(gòu)的節(jié)點(diǎn),和創(chuàng)建數(shù)據(jù)對象之間的關(guān)聯(lián)關(guān)系,即為圖結(jié)構(gòu)的邊。
在實(shí)踐過程中,第一步過程擴(kuò)展為工程數(shù)據(jù)中心的工程元數(shù)據(jù)管理模塊,用于維護(hù)數(shù)據(jù)標(biāo)準(zhǔn)的創(chuàng)建、迭代和應(yīng)用管理;第二步過程則被項目數(shù)據(jù)管理模塊涵蓋,在底層實(shí)現(xiàn)時,通過將工程元數(shù)據(jù)的內(nèi)容抽象為“數(shù)據(jù)模版”,并指導(dǎo)在圖數(shù)據(jù)庫上創(chuàng)建和更新工程數(shù)據(jù)對象,包括控制工程數(shù)據(jù)對象的數(shù)據(jù)域,操作其屬性字段的類型、值域和校驗規(guī)則,也包括以將數(shù)據(jù)對象關(guān)聯(lián)關(guān)系抽象為主對象的一個引用屬性的方式,操作數(shù)據(jù)對象關(guān)聯(lián)所對應(yīng)的邊。
在數(shù)據(jù)對象以圖結(jié)構(gòu)完成存儲之后,工程數(shù)據(jù)中心可以基于圖數(shù)據(jù)庫提供的一系列圖算法函數(shù),對工程數(shù)據(jù)對象的關(guān)系網(wǎng)進(jìn)行一系列的分析、遍歷和統(tǒng)計。
5 結(jié)束語
本文介紹了圖數(shù)據(jù)庫作為No-SQL數(shù)據(jù)庫的一種,其與關(guān)系型數(shù)據(jù)庫對比的優(yōu)點(diǎn)。為滿足工程數(shù)據(jù)中心的主數(shù)據(jù)存儲應(yīng)用場景的需求,本文重點(diǎn)闡述了采用圖數(shù)據(jù)庫ArangoDB構(gòu)建工程數(shù)據(jù)中心主數(shù)據(jù)服務(wù)存儲方案的設(shè)計思路和應(yīng)用實(shí)踐過程?;谝陨险撌隹梢?,采用圖數(shù)據(jù)庫作為工程數(shù)據(jù)中心的主數(shù)據(jù)服務(wù)存儲方案規(guī)避了采用關(guān)系型數(shù)據(jù)庫會遭遇的一系列難題,有效降低了開發(fā)和系統(tǒng)后續(xù)升級維護(hù)的復(fù)雜度,并且基于圖結(jié)構(gòu)數(shù)據(jù)為未來基于圖的數(shù)據(jù)分析應(yīng)用提供了可能。
參考文獻(xiàn)(References):
[1] 王慧孜,范煒.圖數(shù)據(jù)庫在標(biāo)簽系統(tǒng)中的應(yīng)用研究[J].數(shù)字圖書館論壇,2015.4.
[2] 楊振萬,為清.圖數(shù)據(jù)庫的研究和應(yīng)用電腦編程技巧與維護(hù),2020.12.
[3] 劉玉程,李港.NoSQL數(shù)據(jù)庫與關(guān)系型數(shù)據(jù)庫對比[J].中國新通信,2018.7.
[4] 杜麗娟.關(guān)系型數(shù)據(jù)庫與NoSQL數(shù)據(jù)庫的性能對比[J].智能計算機(jī)與應(yīng)用,2017.3.
[5] 王金鋒,張業(yè)星,陳健等.水電全生命周期工程數(shù)據(jù)中心及其關(guān)鍵技術(shù)[J].水力發(fā)電,2014.40(8):21-24