(河海大學(xué),江蘇 南京 210098)
圖形數(shù)據(jù)庫采用圖形理論來存儲實體之間的從屬和拓撲關(guān)系信息,是一種非關(guān)系型SQL數(shù)據(jù)庫。知識圖譜是谷歌公司在2012年為提高用戶搜索質(zhì)量提出的圖形化數(shù)據(jù)庫,用以存儲低結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。知識圖譜可通過一系列不同的圖形,描述知識資源及其載體,挖掘、分析、構(gòu)建、繪制和顯示知識及它們之間的相互聯(lián)系,來表現(xiàn)現(xiàn)實世界中事物之間的聯(lián)系。相對于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,圖形數(shù)據(jù)庫具有強大的圖形遍歷能力和較高的數(shù)據(jù)可視化能力。知識圖譜的出現(xiàn), 為人們提供了一種更好地組織、管理和理解海量信息的方法, 同時, 也成為知識檢索、智能問答、個性化推薦等應(yīng)用的基礎(chǔ)。
有學(xué)者曾指出,Web 1.0時代以文檔互聯(lián)為主要特征,Web 2.0時代以數(shù)據(jù)互聯(lián)為主要特征,而Web 3.0時代則以知識互聯(lián)為主要特征[1]。不同類型的數(shù)據(jù)之間往往是相互孤立的,但數(shù)據(jù)之間存在內(nèi)在的從屬與拓撲關(guān)系,這就構(gòu)成了知識。圖形數(shù)據(jù)庫就是將各類零散數(shù)據(jù)通過不同的內(nèi)在關(guān)系聯(lián)系起來,形成“實體-關(guān)系-實體”三元組的特殊數(shù)據(jù)庫[2]。傳統(tǒng)數(shù)據(jù)庫僅單純地存儲數(shù)據(jù)信息,而圖形數(shù)據(jù)庫存儲的信息是節(jié)點及其之間的關(guān)聯(lián)信息。在信息檢索時,圖形數(shù)據(jù)庫通過遍歷所有節(jié)點迅速尋找符合條件的節(jié)點,展示該節(jié)點信息及與其相關(guān)的信息。
Neo4j是一款基于Java開發(fā)的高性能的SQL圖形數(shù)據(jù)庫[3]。在數(shù)據(jù)檢索時,Neo4j會以相同的速度遍歷節(jié)點與邊,其遍歷速度與構(gòu)成圖形的數(shù)據(jù)量沒有關(guān)系。Neo4j善于處理大量復(fù)雜、動態(tài)、互聯(lián)和低結(jié)構(gòu)化的數(shù)據(jù),具有強大的圖形遍歷功能,可方便地通過Java接口與開發(fā)軟件耦合。Cypher是應(yīng)用在Neo4j中的一種輕量化的數(shù)據(jù)庫查詢語言,不用編寫復(fù)雜的代碼即可實現(xiàn)對圖形數(shù)據(jù)庫的創(chuàng)建、查詢等操作,使操作與開發(fā)人員不必苦惱于復(fù)雜的代碼,將精力聚集于查詢本身。
水利行業(yè)的數(shù)據(jù)量大、動態(tài)性較強[4],導(dǎo)致傳統(tǒng)的關(guān)系型數(shù)據(jù)庫RDBMS越來越難以滿足人們對大規(guī)模數(shù)據(jù)存儲、讀寫及處理方面的要求,且可視化程度較差。信息化建設(shè)成為提高河長制工作效率的抓手[5],針對水利信息量大、多變且可視化難的問題,本文擬利用圖形數(shù)據(jù)庫信息遍歷性強、檢索迅速的優(yōu)勢,對水污染數(shù)據(jù)進行可視化表達,應(yīng)用于黃河寧夏段健康診斷與智能管理系統(tǒng)中。
本文采用Neo4j將國控斷面設(shè)置為節(jié)點,揭示黃河寧夏段水文、水質(zhì)數(shù)據(jù)和國控斷面的邏輯從屬和拓撲關(guān)系,構(gòu)建國控斷面與水利多要素的關(guān)系圖譜,提出一種適用于黃河寧夏段的“數(shù)據(jù)層建立、模型層建立、應(yīng)用可視化界面展示”3個階段的水利大數(shù)據(jù)知識圖譜構(gòu)建方案。建立簡單易用的查詢功能代碼庫,利用知識圖譜遍歷性強的特點實現(xiàn)重要水利信息的快速檢索與查詢,能夠準確而直觀地展示國控斷面的水文、水質(zhì)信息[6]。技術(shù)路線見圖1。
圖1 技術(shù)路線
2.1.1 節(jié)點
節(jié)點(Node)是圖形數(shù)據(jù)庫中的一個基本元素,用以表示一個實體記錄,就像傳統(tǒng)關(guān)系數(shù)據(jù)庫中的一條記錄。在Neo4j中節(jié)點可包含多個屬性(Property)和多個標簽(Label),見圖2。
圖2 帶有屬性和標簽的節(jié)點
2.1.2 關(guān)系
關(guān)系(Relationship)是圖形數(shù)據(jù)庫中的另一個基本元素。當(dāng)數(shù)據(jù)庫中已存在節(jié)點時,需將節(jié)點關(guān)聯(lián)起來,構(gòu)成關(guān)系圖。關(guān)系用來連接兩個節(jié)點,在圖論中稱為邊(Edge),起始末端點都是節(jié)點。關(guān)系和節(jié)點一樣可包含多個屬性,但是一個屬性只能有一個類型(Type),見圖3。一個節(jié)點可以被多個關(guān)系指向或作為多個關(guān)系的起始節(jié)點,見圖4。
圖3 帶有類型和屬性的關(guān)系
圖4 多個關(guān)系指向同一節(jié)點
關(guān)系必須有開始節(jié)點(Strat Node)和結(jié)束節(jié)點(End Node),兩頭都不能為空。節(jié)點可以通過關(guān)系串聯(lián)或并聯(lián)起來。由于關(guān)系是有指向的,故可在由節(jié)點和關(guān)系組成的圖中進行遍歷操作。
2.1.3 屬性
節(jié)點和關(guān)系都可具有多重屬性。屬性由鍵值對組成,屬性值可為一個單獨的數(shù)據(jù)或者眾多數(shù)據(jù)的數(shù)組,數(shù)據(jù)格式可為字符串、整數(shù)、浮點數(shù)等多種基礎(chǔ)數(shù)據(jù)類型[7],見表1。
表1 屬性值的數(shù)據(jù)類型
屬性值不會出現(xiàn)NULL,如果一個屬性不需要可直接將整個鍵值對移除。在使用Cypher或Java API時,可用IS NULL關(guān)鍵字判斷屬性是否存在。
2.1.4 路徑
節(jié)點和關(guān)系創(chuàng)建的圖中,任意兩個節(jié)點之間都可能存在路徑,見圖5。任意兩個節(jié)點都存在由節(jié)點和關(guān)系組成的路徑,路徑也具有長度。一個單獨的節(jié)點可組成長度為0的路徑。
圖5 路徑的示意
2.1.5 遍歷
遍歷(Traversal)就是按照一定的檢索規(guī)則,根據(jù)節(jié)點之間的關(guān)系,依次訪問所有相關(guān)節(jié)點的操作。Neo4j提供了一套高效的可指定遍歷規(guī)則API,可指定遍歷規(guī)則使Neo4j按照既定的遍歷規(guī)則執(zhí)行遍歷操作,返回遍歷的結(jié)果。遍歷的規(guī)則可以是廣度優(yōu)先,也可是深度優(yōu)先。
根據(jù)應(yīng)用需求定義以下 3 類節(jié)點:“重點國控斷面”節(jié)點、“污染物”節(jié)點和“排水溝”節(jié)點。
2.2.1 “重點國控斷面”節(jié)點
“重點國控斷面”節(jié)點包含7個屬性,屬性名稱及說明見表2。
表2 “重點國控斷面”節(jié)點的屬性名稱及說明
以創(chuàng)建下河沿斷面的“重點國控斷面”節(jié)點為例,忽略該節(jié)點關(guān)系創(chuàng)建該節(jié)點,命令如下:
CREATE (xiaheyan:Station{name:‘下河沿’,tributary:‘1條’,flowprocess:‘2種’,Sorts_of_pollution:‘2種’,substandard:‘25天’,scope:‘40km2’,measures :‘2個’})
其他國控斷面節(jié)點的創(chuàng)建過程如“下河沿”節(jié)點,此類節(jié)點的標簽均為“Station”,見圖6。
圖6 已創(chuàng)建的重點國控斷面節(jié)點
2.2.2 “污染物”節(jié)點
以創(chuàng)建平羅黃河大橋斷面的“污染物”節(jié)點“總磷”為例,忽略該節(jié)點關(guān)系創(chuàng)建該節(jié)點,命令如下(節(jié)點的屬性定義見表3):
CREATE (Total_Phosphorus6: Pollutant: exceed_standard {name:“總磷”, location: ‘平羅黃河大橋’,content:0.37})
其他“污染物”節(jié)點的創(chuàng)建過程同“總磷”節(jié)點,此類節(jié)點的第一類標簽皆為“Pollutant”。節(jié)點的總磷含量超標時,為了方便后續(xù)的檢索查詢工作,在超標的“污染物”節(jié)點添加第二類標簽“exceed_standard”。
表3 “污染物”節(jié)點的屬性名稱及說明
2.2.3 “排水溝”節(jié)點
以創(chuàng)建葉盛公路橋斷面的“排水溝”節(jié)點“吳忠市南干溝”為例,忽略該節(jié)點關(guān)系創(chuàng)建該節(jié)點,命令如下(節(jié)點的屬性定義見表4):
CREATE (a21: Gutterway {name:‘吳忠市南干溝’, location:‘葉盛公路橋’})
其他排水溝節(jié)點的創(chuàng)建過程同“吳忠市南干溝”節(jié)點,此類節(jié)點的標簽均為Gutterway”。
表4 “排水溝”節(jié)點的屬性名稱及說明
根據(jù)數(shù)據(jù)挖掘需求,創(chuàng)建了如下3種關(guān)系:“國控斷面”之間的關(guān)系、“國控斷面”與“排水溝”之間的關(guān)系以及“國控斷面”與“污染物”之間的關(guān)系。
2.3.1 “國控斷面”之間關(guān)系的定義
黃河寧夏段有6個國控斷面,從上游至下游依次為下河沿、清水河、金沙灣、葉盛公路橋、銀古公路橋和平羅黃河大橋。國控斷面之間包含上下游關(guān)系,采用如下命令創(chuàng)建:
CREATE
(xiaheyan)-[:downstream {name:[‘下游’]}]->(qingshuihe),
(qingshuihe)-[:downstream {name:[‘下游’]}]->(jinshawan),
(jinshawan)-[:downstream {name:[‘下游’]}]->(yeshenggongluqiao),
(yeshenggongluqiao)-[:downstream {name:[‘下游’]}]->(yinggugongluqiao),
(yinggugongluqiao)-[:downstream {name:[‘下游’]}]->(pingluohuanghedaqiao)
關(guān)系創(chuàng)建完成后的圖譜見圖7。
圖7 國控斷面之間的上下游關(guān)系
2.3.2 “國控斷面”與“排水溝”之間關(guān)系的定義
以銀古公路橋為例,建立“國控斷面”與“排水溝”間的聯(lián)系,采用如下命令創(chuàng)建關(guān)系:
CREATE (yeshenggongluqiao:Station{name:“葉盛公路橋”, tributary:‘2條’,flowprocess:‘1種’,Sorts_of_pollution:‘2種’,substandard:‘10天’,scope:‘35km2’,measures :‘3個’})
CREATE (d2: Sorts_of_Gutterway {name:‘排水溝’, type:‘2種’})
CREATE (d21: Gutterway {name:‘吳忠市清水溝’})
CREATE (d22: Gutterway {name:‘吳忠市南干溝’})
CREATE
(yeshenggongluqiao)-[:Type_of_Gutterway{name:[‘排水溝’]}]-> (d2),
(d2)-[: Gutterway_name{name:[‘排水溝名稱’]}]->(d21),
(d2)-[: Gutterway_name{name:[‘排水溝名稱’]}]->(d22)
關(guān)系創(chuàng)建完成后的圖譜見圖8。
圖8 國控斷面與排水溝間的從屬關(guān)系
2.3.3 “國控斷面”與“污染物”間關(guān)系的定義
以銀古公路橋為例,建立“國控斷面”與“污染物”間的聯(lián)系,采用如下命令創(chuàng)建關(guān)系:
CREATE (yeshenggongluqiao:Station{name:“葉盛公路橋”, tributary:‘2條’,flowprocess:‘1種’,Sorts_of_pollution:‘2種’,substandard:‘10天’,scope:‘35km2’,measures :‘3個’})
CREATE (d1:Sorts_of_Pollution {name:‘污染物種類’,type:‘3種’})
CREATE (ammonia_nitrogen4: Pollutant{name:“氨氮”,location:‘葉盛公路橋’,content:‘0.2’})
CREATE (Total_Phosphorus4: Pollutant: exceed_standard {name:“總磷”,location:‘葉盛公路橋’,content:‘0.32’})
CREATE (Total_Nitrogen4: Pollutant{name:“總氮”,location:‘葉盛公路橋’,content:‘0.16’})
CREATE
(yeshenggongluqiao)-[:Type_of_Pollutant{name:‘污染物種類’}]->(d1),
(d1)-[:Pollutant_name{name:[‘污染物名稱’]}]->( ammonia_nitrogen4),
(d1)-[:Pollutant_name{name:[‘污染物名稱’]}]->( Total_Phosphorus4),
(d1)-[:Pollutant_name{name:[‘污染物名稱’]}]->( Total_Nitrogen4)
關(guān)系創(chuàng)建完成后的圖譜見圖9。
圖9 重點國控斷面與污染物間的從屬關(guān)系
圖9的3種污染物中總磷的圓圈比總氮和氨氮大、顏色更深,以顯示其超標信息。這種處理可便捷地識別每個節(jié)點的超標污染物類型,其機理是在超標的“污染物”節(jié)點添加第二類標簽“exceed_standard”。
水利部正開展智慧水利調(diào)研和總體建設(shè)方案頂層設(shè)計[8],對于重點國控斷面的實時監(jiān)測就顯得尤為重要。定向查詢?nèi)~盛公路橋的相關(guān)信息命令如下(查詢結(jié)果見圖10):
MATCH (yeshenggongluqiao:Station)
RETURN yeshenggongluqiao
查詢超標污染物的種類及其所在的國控斷面的代碼如下:
match (station)-[:Type_of_pollutant]-> (Property)-[:Pollutant_name]->( Pollutant)
where Pollutant.content>0.3
return station,Pollutant
圖10 重點國控斷面查詢結(jié)果
系統(tǒng)自動生成的查詢結(jié)果見圖11。
圖11 超標污染物查詢結(jié)果
Neo4j 圖形數(shù)據(jù)庫是目前挖掘?qū)嶓w間關(guān)系最優(yōu)秀的圖形數(shù)據(jù)庫。本文根據(jù)國控斷面之間的內(nèi)在聯(lián)系,以及國控斷面與相應(yīng)排污口、COD、氨氮濃度等信息的從屬關(guān)系,采用Neo4j選取和設(shè)置了節(jié)點與關(guān)系,設(shè)計了黃河寧夏段水利大數(shù)據(jù)的知識圖譜,實現(xiàn)了河湖健康數(shù)據(jù)的圖形化展示,并通過 Neo4j 高效的查詢功能實現(xiàn)了重要水利信息的快速檢索。這為人們了解河道流域的健康狀況、污染物的分布規(guī)律等提供了有效的數(shù)據(jù)支持及方法指導(dǎo)。