Neo4j 對于大多數(shù)人來說,可能是比較陌生的获印。其實述雾,Neo4j 是一個圖形數(shù)據(jù)庫,就像傳統(tǒng)的關系數(shù)據(jù)庫中的 Oracel 和 MySQL一樣兼丰,用來持久化數(shù)據(jù)玻孟。Neo4j 是最近幾年發(fā)展起來的新技術,屬于 NoSQL 數(shù)據(jù)庫中的一種鳍征。
本文主要從 Neo4j 為什么被用來做知識圖譜取募,Neo4j 的簡單安裝,在 Neo4j 瀏覽器中創(chuàng)建節(jié)點和關系蟆技,Neo4j 的 Python 接口操作以及用 Neo4j 構建一個簡單的農(nóng)業(yè)知識圖譜五個方面來講玩敏。
Neo4j 為什么被用來做知識圖譜
從第19課《知識挖掘與知識圖譜概述》中,我們已經(jīng)明白质礼,知識圖譜是一種基于圖的數(shù)據(jù)結構旺聚,由節(jié)點和邊組成。其中節(jié)點即實體眶蕉,由一個全局唯一的 ID 標示砰粹,關系(也稱屬性)用于連接兩個節(jié)點。通俗地講造挽,知識圖譜就是把所有不同種類的信息連接在一起而得到一個關系網(wǎng)絡碱璃,提供了從“關系”的角度去分析問題的能力。
而 Neo4j 作為一種經(jīng)過特別優(yōu)化的圖形數(shù)據(jù)庫饭入,有以下優(yōu)勢:
數(shù)據(jù)存儲:不像傳統(tǒng)數(shù)據(jù)庫整條記錄來存儲數(shù)據(jù)嵌器,Neo4j 以圖的結構存儲,可以存儲圖的節(jié)點谐丢、屬性和邊爽航。屬性蚓让、節(jié)點都是分開存儲的,屬性與節(jié)點的關系構成邊讥珍,這將大大有助于提高數(shù)據(jù)庫的性能历极。
數(shù)據(jù)讀寫:在 Neo4j 中,存儲節(jié)點時使用了
Index-free Adjacency
技術衷佃,即每個節(jié)點都有指向其鄰居節(jié)點的指針趟卸,可以讓我們在時間復雜度為 O(1) 的情況下找到鄰居節(jié)點。另外氏义,按照官方的說法锄列,在 Neo4j 中邊是最重要的,是First-class Entities
觅赊,所以單獨存儲,更有利于在圖遍歷時提高速度琼稻,也可以很方便地以任何方向進行遍歷吮螺。資源豐富:Neo4j 作為較早的一批圖形數(shù)據(jù)庫之一,其文檔和各種技術博客較多帕翻。
同類對比:Flockdb 安裝過程中依賴太多鸠补,安裝復雜;Orientdb嘀掸,Arangodb 與 Neo4j 做對比紫岩,從易用性來說都差不多,但是從穩(wěn)定性來說睬塌,neo4j 是最好的泉蝌。
綜合上述以及因素,我認為 Neo4j 是做知識圖譜比較簡單揩晴、靈活勋陪、易用的圖形數(shù)據(jù)庫。
Neo4j 的簡單安裝
Neo4j 是基于 Java 的圖形數(shù)據(jù)庫硫兰,運行 Neo4j 需要啟動 JVM 進程诅愚,因此必須安裝 Java SE 的 JDK。從 Oracle 官方網(wǎng)站下載 Java SE JDK劫映,選擇版本 JDK8 以上版本即可违孝。
下面簡單介紹下 Neo4j 在 Linux 和 Windows 的安裝過程。首先去官網(wǎng)下載對應版本泳赋。解壓之后雌桑,Neo4j 應用程序有如下主要的目錄結構:
- bin 目錄:用于存儲 Neo4j 的可執(zhí)行程序;
- conf 目錄:用于控制 Neo4j 啟動的配置文件祖今;
- data 目錄:用于存儲核心數(shù)據(jù)庫文件筹燕;
- plugins 目錄:用于存儲 Neo4j 的插件。
Linux 系統(tǒng)下的安裝
通過 tar 解壓命令解壓到一個目錄下:
tar -xzvf neo4j-community-3.3.1-unix.tar.gz
然后進入 Neo4j 解壓目錄:
cd /usr/local/neo4j/neo4j-community-3.1.0
通過啟動命令,可以實現(xiàn)啟動撒踪、控制臺过咬、停止服務:
bin/neo4j start/console/stop(啟動/控制臺/停止)
通過 cypher-shell
命令,可以進入命令行:
bin/cypher-shell
Windows 系統(tǒng)下的安裝
啟動 DOS 命令行窗口制妄,切換到解壓目錄 bin 下掸绞,以管理員身份運行命令,分別為啟動服務耕捞、停止服務衔掸、重啟服務和查詢服務的狀態(tài):
bin\neo4j start
bin\neo4j stop
bin\neo4j restart
bin\neo4j status
把 Neo4j 安裝為服務(Windows Services),可通過以下命令:
bin\neo4j install-service
bin\neo4j uninstall-service
Neo4j 的配置文檔存儲在 conf 目錄下俺抽,Neo4j 通過配置文件 neo4j.conf 控制服務器的工作敞映。默認情況下,不需要進行任意配置磷斧,就可以啟動服務器振愿。
下面我們在 Windows 環(huán)境下啟動 Neo4j:
Neo4j 服務器具有一個集成的瀏覽器,在一個運行的服務器實例上訪問: http://localhost:7474/弛饭,打開瀏覽器冕末,顯示啟動頁面:
默認的 Host 是 bolt://localhost:7687
,默認的用戶是 neo4j侣颂,其默認的密碼是 neo4j档桃,第一次成功登錄到 Neo4j 服務器之后,需要重置密碼憔晒。訪問 Graph Database 需要輸入身份驗證藻肄,Host 是 Bolt 協(xié)議標識的主機。登錄成功后界面:
到此為止拒担,我們就完成了 Neo4j 的基本安裝過程仅炊,更詳細的參數(shù)配置,可以參考官方文檔澎蛛。
在 Neo4j 瀏覽器中創(chuàng)建節(jié)點和關系
下面抚垄,我們簡單編寫 Cypher 命令,Cypher 命令可以通過 Neo4j 教程學習谋逻,在瀏覽器中通過 Neo4j 創(chuàng)建兩個節(jié)點和兩個關系呆馁。
在 $
命令行中,編寫 Cypher 腳本代碼毁兆,點擊 Play 按鈕完成創(chuàng)建浙滤,依次執(zhí)行下面的語句:
CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;
作用是創(chuàng)建一個 Person,并包含屬性名字和職稱气堕。
下面這條語句也創(chuàng)建了一個 Person 對象纺腊,屬性中只是名字和職稱不一樣畔咧。
CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;
緊接著,通過下面兩行命令進行兩個 Person 的關系匹配:
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)-[r:Friend]->(m) return r;
match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)<-[r:Friend]-(m) return r;
最后揖膜,在創(chuàng)建完兩個節(jié)點和關系之后誓沸,查看數(shù)據(jù)庫中的圖形:
match(n) return n;
如下圖,返回兩個 Person 節(jié)點壹粟,以及其關系網(wǎng)拜隧,兩個 Person 之間組成 Friend 關系:
Neo4j 的 Python 操作
既然 Neo4j 作為一個圖庫數(shù)據(jù)庫,那我們在項目中使用的時候趁仙,必然不能通過上面那種方式完成任務洪添,一般都要通過代碼來完成數(shù)據(jù)的持久化操作。其中雀费,對于 Java 編程者來說干奢,可通過 Spring Data Neo4j 達到這一目的。
而對于 Python 開發(fā)者來說盏袄,Py2neo 庫也可以完成對 Neo4j 的操作忿峻,操作過程如下。
首先 安裝 Py2neo貌矿。Py2neo 的安裝過程非常簡單炭菌,在命令行通過下面命令即可安裝成功罪佳。
pip install py2neo
安裝好之后逛漫,我們來看一下簡單的圖關系構建,看下面代碼:
from py2neo.data import Node, Relationship
a = Node("Person", name="Alice")
b = Node("Person", name="Bob")
ab = Relationship(a, "KNOWS", b)
第一行代碼赘艳,首先引入 Node 和 Relationship 對象酌毡,緊接著,創(chuàng)建 a 和 b 節(jié)點對象蕾管,最后一行匹配 a 和 b 之間的工作雇傭關系枷踏。接著來看看 ab 對象的內(nèi)容是什么:
print(ab)
通過 print 打印出 ab 的內(nèi)容:
(Alice)-[:KNOWS {}]->(Bob)
通過這樣,就完成了 Alice 和 Bob 之間的工作關系掰曾,如果有多組關系將構建成 Person 之間的一個關系網(wǎng)旭蠕。
了解更多 Py2neo 的使用方法,建議查看官方文檔旷坦。
用 Neo4j 構建一個簡單的農(nóng)業(yè)知識圖譜
我們來看一個基于開源語料的簡單農(nóng)業(yè)知識圖譜掏熬,由于過程比較繁雜,數(shù)據(jù)和知識圖譜數(shù)據(jù)預處理過程這里不再贅述秒梅,下面旗芬,我們重點看基于 Neo4j 來創(chuàng)建知識圖譜的過程。
整個過程主要包含以下步驟:
- 環(huán)境準備
- 語料準備
- 語料加載
- 知識圖譜查詢展示
Neo4j 環(huán)境準備捆蜀。
根據(jù)上面對 Neo4j 環(huán)境的介紹疮丛,這里默認你已經(jīng)搭建好 Neo4j 的環(huán)境幔嫂,并能正常訪問,如果沒有環(huán)境誊薄,請自行搭建好 Neo4j 的可用環(huán)境履恩。
數(shù)據(jù)語料介紹。
本次提供的語料是已經(jīng)處理好的數(shù)據(jù)暇屋,包含6個 csv 文件似袁,文件內(nèi)容和描述如下。
- attributes.csv:文件大小 2M咐刨,內(nèi)容是通過互動百科頁面得到的部分實體的屬性昙衅,包含字段:Entity、AttributeName定鸟、Attribute而涉,分別表示實體、屬性名稱联予、屬性值啼县。文件前5行結構如下:
Entity,AttributeName,Attribute
密度板,別名,纖維板
葡萄蔓枯病,主要為害部位,枝蔓
坎德拉,性別,男
坎德拉,國籍,法國
坎德拉,場上位置,后衛(wèi)
-
hudong_pedia.csv
:文件大小 94.6M,內(nèi)容是已經(jīng)爬好的農(nóng)業(yè)實體的百科頁面的結構化數(shù)據(jù)沸久,包含字段:title季眷、url攒砖、image工猜、openTypeList、detail悯蝉、baseInfoKeyList窑睁、baseInfoValueList挺峡,分別表示名稱、百科 URL 地址担钮、圖片橱赠、分類類型、詳情箫津、關鍵字狭姨、依據(jù)來源。文件前2行結構如下:
"title","url","image","openTypeList","detail","baseInfoKeyList","baseInfoValueList"
"菊糖","http://www.baike.com/wiki/菊糖","http://a0.att.hudong.com/72/85/20200000013920144736851207227_s.jpg","健康科學##分子生物學##化學品##有機物##科學##自然科學##藥品##藥學名詞##藥物中文名稱列表","[藥理作用] 診斷試劑 人體內(nèi)不含菊糖苏遥,靜注后饼拍,不被機體分解、結合暖眼、利用和破壞惕耕,經(jīng)腎小球濾過,通過測定血中和尿中的菊糖含量诫肠,可以準確計算腎小球的濾過率司澎。菊糖廣泛存在于植物組織中,約有3.6萬種植物中含有菊糖,尤其是菊芋欺缘、菊苣塊根中含有豐富的菊糖[6,8]。菊芋(Jerusalem artichoke)又名洋姜,多年生草本植物,在我國栽種廣泛,其適應性廣挤安、耐貧瘠谚殊、產(chǎn)量高、易種植,一般畝產(chǎn)菊芋塊莖為2 000~4 000 kg,菊芋塊莖除水分外,還含有15%~20%的菊糖,是加工生產(chǎn)菊糖及其制品的良好原料蛤铜。","中文名:","菊糖"
"密度板","http://www.baike.com/wiki/密度板","http://a0.att.hudong.com/64/31/20200000013920144728317993941_s.jpg","居家##巧克力包裝##應用科學##建筑材料##珠寶盒##禮品盒##科學##糖果盒##紅酒盒##裝修##裝飾材料##隔斷##首飾盒","密度板(英文:Medium Density Fiberboard (MDF))也稱纖維板嫩絮,是以木質(zhì)纖維或其他植物纖維為原料,施加脲醛樹脂或其他適用的膠粘劑制成的人造板材围肥。按其密度的不同剿干,分為高密度板、中密度板穆刻、低密度板置尔。密度板由于質(zhì)軟耐沖擊,也容易再加工氢伟,在國外是制作家私的一種良好材料榜轿,但由于國家關于高密度板的標準比國際標準低數(shù)倍,所以朵锣,密度板在中國的使用質(zhì)量還有待提高谬盐。","中文名:##全稱:##別名:##主要材料:##分類:##優(yōu)點:","密度板##中密度板纖維板##纖維板##以木質(zhì)纖維或其他植物纖維##高密度板、中密度板诚些、低密度板##表面光滑平整飞傀、材質(zhì)細密性能穩(wěn)定"
hudong_pedia2.csv
:文件大小 41M,內(nèi)容結構和hudong_pedia.csv
文件保持一致泣刹,只是增加數(shù)據(jù)量助析,作為hudong_pedia.csv
數(shù)據(jù)的補充犀被。new_node.csv
:文件大小 2.28M椅您,內(nèi)容是節(jié)點名稱和標簽,包含字段:title寡键、lable掀泳,分別表示節(jié)點名稱、標簽西轩,文件前5行結構如下:
title,lable
藥物治療,newNode
膳食纖維,newNode
Boven Merwede,newNode
亞美尼亞蘇維埃百科全書,newNode
-
wikidata_relation.csv
:文件大小 1.83M员舵,內(nèi)容是實體和關系,包含字段 HudongItem1藕畔、relation马僻、HudongItem2,分別表示實體1注服、關系韭邓、實體2措近,文件前5行結構如下:
HudongItem1,relation,HudongItem2
菊糖,instance of,化合物
菊糖,instance of,多糖
瓦爾,instance of,河流
菊糖,subclass of,食物
瓦爾,origin of the watercourse,萊茵河
-
wikidata_relation2.csv
:大小 7.18M,內(nèi)容結構和wikidata_relation.csv
一致女淑,作為wikidata_relation.csv
數(shù)據(jù)的補充瞭郑。
語料加載。
語料加載鸭你,利用 Neo4j 的 LOAD CSV WITH HEADERS FROM...
功能進行加載屈张,具體操作過程如下。
首先袱巨,依次執(zhí)行以下命令:
// 將hudong_pedia.csv 導入
LOAD CSV WITH HEADERS FROM "file:///hudong_pedia.csv" AS line
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})
執(zhí)行成功之后阁谆,控制臺顯示成功:
上面這張圖,表示數(shù)據(jù)加載成功愉老,并顯示加載的數(shù)據(jù)條數(shù)和耗費的時間笛厦。
// 新增了hudong_pedia2.csv
LOAD CSV WITH HEADERS FROM "file:///hudong_pedia2.csv" AS line
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})
// 創(chuàng)建索引
CREATE CONSTRAINT ON (c:HudongItem)
ASSERT c.title IS UNIQUE
以上命令的意思是,將 hudong_pedia.csv
和 hudong_pedia2.csv
導入 Neo4j 作為結點俺夕,然后對 titile 屬性添加 UNIQUE(唯一約束/索引)裳凸。
注意: 如果導入的時候出現(xiàn) Neo4j JVM 內(nèi)存溢出錯誤,可以在導入前劝贸,先把 Neo4j 下的 conf/neo4j.conf
中的 dbms.memory.heap.initial_size
和 dbms.memory.heap.max_size
調(diào)大點姨谷。導入完成后再把值改回去即可。
下面繼續(xù)執(zhí)行數(shù)據(jù)導入命令:
// 導入新的節(jié)點
LOAD CSV WITH HEADERS FROM "file:///new_node.csv" AS line
CREATE (:NewNode { title: line.title })
//添加索引
CREATE CONSTRAINT ON (c:NewNode)
ASSERT c.title IS UNIQUE
//導入hudongItem和新加入節(jié)點之間的關系
LOAD CSV WITH HEADERS FROM "file:///wikidata_relation2.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem}) , (entity2:NewNode{title:line.NewNode})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)
LOAD CSV WITH HEADERS FROM "file:///wikidata_relation.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem1}) , (entity2:HudongItem{title:line.HudongItem2})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)
執(zhí)行完這些命令后映九,我們導入 new_node.csv
新節(jié)點梦湘,并對 titile 屬性添加 UNIQUE(唯一約束/索引),導入 wikidata_relation.csv
和 wikidata_relation2.csv
件甥,并給節(jié)點之間創(chuàng)建關系捌议。
緊接著,繼續(xù)導入實體屬性引有,并創(chuàng)建實體之間的關系:
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2)
這里注意瓣颅,建索引的時候帶了 label,因此只有使用 label 時才會使用索引譬正,這里我們的實體有兩個 label宫补,所以一共做 2*2=4
次。當然也可以建立全局索引曾我,即對于不同的 label 使用同一個索引粉怕。
以上過程,我們就完成了語料加載抒巢,并創(chuàng)建了實體之間的關系和屬性匹配贫贝,下面我們來看看 Neo4j 圖譜關系展示。
知識圖譜查詢展示
最后通過 cypher 語句查詢來看看農(nóng)業(yè)圖譜展示蛉谜。
首先稚晚,展示 HudongItem 實體凤优,執(zhí)行如下命令:
MATCH (n:HudongItem) RETURN n LIMIT 25
對 HudongItem 實體進行查詢,返回結果的25條數(shù)據(jù)蜈彼,結果如下圖:
接著筑辨,展示 NewNode 實體,執(zhí)行如下命令:
MATCH (n:NewNode) RETURN n LIMIT 25
對 NewNode 實體進行查詢幸逆,返回結果的25條數(shù)據(jù)棍辕,結果如下圖:
之后,展示 RELATION 直接的關系还绘,執(zhí)行如下命令:
MATCH p=()-[r:RELATION]->() RETURN p LIMIT 25
展示實體屬性關系楚昭,結果如下圖:
總結
本節(jié)內(nèi)容到此結束,回顧下整篇文章拍顷,主要講了以下內(nèi)容:
- 解釋了 Neo4j 被用來做知識圖譜的原因抚太;
- Neo4j 的簡單安裝以及在 Neo4j 瀏覽器中創(chuàng)建節(jié)點和關系;
- Neo4j 的 Python 接口操作及使用昔案;
- 從五個方面講解了如何使用 Neo4j 構建一個簡單的農(nóng)業(yè)知識圖譜尿贫。
最后,強調(diào)一句踏揣,知識圖譜未來會通過自然語言處理技術和搜索技術結合應用會越來越廣庆亡,工業(yè)界所出的地位也會越來越重要。
參考文獻及推薦閱讀
如有侵權請聯(lián)系QQ:758230255刪除