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