李彥志,朱紅梅
(1. 西南大學電子信息與工程學院,重慶 400715;2. 山東農業大學信息科學與工程學院,山東 泰安 271000)
正文內容。Google于 2012年提出知識圖譜概念[1],其本質是一種表示知識的語義網絡,用圖的形式描述客觀事物,即由節點和邊組成。其中,節點用來表示概念和實體,概念是抽象出來的事物,實體是具體的事物;邊表示實體與概念之間的關系,事物的內部特征用屬性來表示,外部聯系用關系來表示。知識圖譜描述實體之間的關系,其通用表達方式是三元組[2],可以表達豐富的語義關系[3]。
農藥領域的知識牽扯到農業相關的多個方面,例如:農作物的分類,作物的不同品種和名稱,因此,知識的專業性強,數據的結構復雜,相關實體之間關系復雜,織起了一張巨大復雜的關系網,可以用圖數據庫(Graph database)來組織這些知識,構建農藥知識圖譜,用知識圖譜展示農業知識是一種很好的工具[4],通過知識的鏈接發掘更多知識[5]。原生圖數據庫 Neo4j使用的存儲后端專門為圖結構數據的存儲和管理進行了定制和優化,在圖上互相關聯的節點在數據庫中的物理地址也指向彼此,因此更能發揮出圖結構形式數據的優勢。因此,采用圖結構組織知識的農藥知識圖譜非常適合用 Neo4j進行存儲。知識可視化在傳遞知識方面有很大優勢[6],用可視化的方式在Web端展示知識圖譜的網絡關系圖是知識圖譜查詢結果的一種形象化的展示形式,可以使人一目了然看到結果,有助于直觀揭示對象之間的關系,展示多方面的屬性,理解節點之間的連接和關系,確保對關系的理解更直觀和形象。Cytoscape.js[7]是一個用JS編寫的開源圖庫,它允許用戶與圖形交互以及顯示操作豐富的交互式圖形。通過把Cytoscape.js集成到應用程序中,就可以實現顯示neo4j圖形數據庫的數據到Web端。
知識圖譜由大量結構化元組數據組成。農藥品種很多,標準不同,分類也不同,可以按用途分類,按原料來源分類,按化學結構分類,按加工劑型分類等,一種實體可能屬于多個不同分類。所以,在農藥知識圖譜中,一個概念節點C或實例節點E可能與多個概念節點,如C1,C2,…,Cn分別存在關系R1,R2,…,Rn。如果2個概念節點C1,C2之間存在關系 RC,且 E1、E2分別與概念節點 C1、C2存在概念-實例關系,則E1和E2之間也存在關系RC。農藥知識圖譜包括概念層和實例層,其基本結構模型如圖1所示。其中,虛線框部分是概念層,其余部分是實例層。一種農藥與某病/蟲/草害或調節生長之間具有actOn關系,該關系具有屬性:‘制劑用藥量’和‘使用方法’;農藥節點本身也具有屬性:‘農藥登記證號’、‘有效成分’和‘有效成分含量’。這些節點、關系和屬性都要求在需要的時候能夠實現
Web可視化。

圖1 農藥知識圖譜的結構模型Fig.1 The Structure Model of Pesticide Knowledge Graph
把存儲在 neo4j圖數據庫的農藥知識圖譜數據顯示到前端的可視化系統的架構體系如圖2所示。該架構的后端包括:圖形數據庫 neo4j用來存儲網絡節點及節點間的關系;一個基于 Python的 Web微框架Flask;neo4j的Python API包py2neo[8]。前端包括:用于顯示節點及關系的cytoscape.js,AJAX用的庫 jQuery.js。Cytoscape.js 是開源 JavaScript圖形庫,可以用它分析和制作可視化圖形。

圖2 農藥知識圖譜Web可視化的架構體系Fig.2 Framework of Web visualization of pesticide knowledge graph
添加需要的html/Javascript/css文件以滿足功能要求,項目的目錄結構如下:
| app.py
+---static
| +---css
| | style.css
| +---js
| code.js
| cytoscape.min.js
| jquery-1.11.2.min.js
| cytoscape-qtip.js
| jquery.qtip.css
| jquery.qtip.js
+---templates
| index.html
templates 目錄用于存放html網頁,index.html是網站的主頁。flask應用程序 app.py對應到templates目錄下找響應頁面。 static 目錄用于存放網站的靜態文件,包括javascript文件和css文件。cytoscape.min.js是cytoscape必須的Javascript庫;AJAX實現客戶端與服務器端的異步通信,創建快速動態網頁,jquery-1.11.2.min.js為網站提供AJAX交互;前臺程序code.js調用cytoscape.min.js在前臺生成網絡關系圖;style.css是自定義的樣式表,cytoscape.min.js讀取樣式表初始化網絡關系圖的樣式,如:畫布的寬度,高度,背景;jquery.qtip.css、query.qtip.js和 cytoscape-qtip.js是 jquery的提示插件,用于鼠標點擊時的消息提醒。
Cypher[9]是noe4j數據庫的查詢語言。本項目的主程序主要完成連接 neo4j圖數據庫,從主頁獲取查詢條件,生成用Cypher語言描述的查詢matchstr,通過調用py2neo的session.run(matchstr)語句查詢農藥知識圖譜,得到圖的節點和邊,再構建web顯示節點和邊的信息,取得節點的id,屬性(properties),標簽(Label),返回圖的節點和邊的列表,構造網站動態圖數據。
2.3.1 查詢結果的可視化
用cytoscape.js畫圖的典型方法如下:
var cy = cytoscape({
container: document.getElementById('cy'), // 定義需要渲染的容器
elements:{
nodes:[/*...*/],
edges:[/*...*/]
},
style:[/*...*/],
layout<{ name:'cose'}
});

圖3 顯示用于‘水稻’病害的藥劑(部分)Fig.3 Show pesticide for 'rice' disease (part)
該方法用cytoscape()函數生成cy,并為其設置各種屬性,如:container,elements,style,layout等。其中,container定義需要渲染的容器,elements中的nodes是要顯示的節點,edges是要顯示的邊,style,layout等規定了顯示時的樣式、布局,包括大小、前景、背景顏色等。還可以定義一些交互選項,如:圖是否可縮放、縮放級別的界限、是否使用事件、是否啟用平移、節點是否可拖動等。
查找用于‘水稻’病害的藥劑(部分)如圖 3所示。從圖示可以看出,用于‘水稻’病害的藥劑有:‘咪錳·多菌靈’和‘咪鮮胺’用于治療‘惡苗病’,‘稻瘟靈’用于治療‘稻瘟病’,‘丙環唑’、‘苯甲丙環唑’、‘噻呋酰胺’、‘己唑醇’用于治療‘紋枯病’。
2.3.2 節點屬性的可視化
在展示圖中,當用戶點擊農藥節點時要顯示這種農藥的屬性,如:農藥登記號 Registration-CertificateNo,有效成分 ActiveIngredient及其含量ActiveIngredientContent,其設置如下:
cy.nodes('[label ="AgriChem"]').qtip({
content:
{
text:function(){
return '有 效 成 分 :'+ this.data( 'ActiveIngredient')+'<br/> 有 效 成 分 含 量 :'+this.data('ActiveIngredientContent')
},
title:function(){ return ''+this.data('RegistrationCertificateNo')}
},
position:{[/*...*/]},
style:{[/*...*/]}
});

圖4 顯示農藥節點的屬性Fig.4 Show attribute of pesticide node
點擊農藥‘苯甲·丙環唑'節點顯示其屬性如圖 4所示。從圖示可以看出,農藥‘苯甲·丙環唑’的‘農藥登記證號’是LS20082140,有效成分是‘苯醚甲環唑,丙環唑’,有效成分含量是 300克/升,用于治療水稻‘紋枯病’。
2.3.3 關系屬性的可視化
在展示圖中,當用戶點擊農藥與某種病/蟲/草害的actsOn關系時要顯示這種關系的屬性,如:制劑用藥量Dosage和使用方法Usage,其設置如下:
cy.edges('[relationship ="actsOn"]').qtip({
content:
{
text:function(){ return ' 制 劑 用 藥量 :'+this.data('Dosage')+'<br/> 使 用 方法:'+this.data('Usage')},
title:function(){ return ''+this.data('relationship')}
},
position:{[/*...*/]},
style:{[/*...*/]}
});

圖5 顯示農藥與病害的actsOn關系的屬性Fig.5 Show attribute of relation ‘actsOn'between pesticides and diseases
點擊農藥‘苯甲·丙環唑'與‘紋枯病’的 actsOn關系顯示其屬性如圖5所示。從圖示可以看出,農藥‘苯甲·丙環唑'用于治療水稻‘紋枯病’時,制劑用藥量是 15-20毫升/畝,使用方法是噴霧。
本文介紹Neo4j農藥知識圖譜Web可視化的方法。該方法在分析農藥知識圖譜結構的基礎上,搭建了基于 Flask的農藥知識圖譜可視化網站,從網頁獲取查詢條件,生成用Cypher語言描述的查詢語句,通過py2neo查詢neo4j農藥知識圖譜,取得圖的節點和邊的信息,構造網站動態圖數據,利用cytoscape.js實現查詢結果的Web可視化。完善和擴展農藥知識圖譜,增加其它多種節點和關系的屬性展示是進一步要完成的工作。