[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

Eastmount發表於2018-12-19

該系列文章主要講解知識圖譜及Neo4j圖資料庫的用法,本篇文章是作者學習《Neo4j基礎入門》書籍的線上筆記,主要講解Neo4j的基礎知識及基本語法,希望大家喜歡。
前文:
[知識圖譜構建] 一.Neo4j圖資料庫安裝初識及藥材供應圖譜例項
neo4j 實戰、例項、示例 建立電影關係圖 -1
https://www.w3cschool.cn/neo4j/

PS:2019年1~2月作者參加了CSDN2018年部落格評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係
五年來寫了314篇部落格,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、資料探勘、網路爬蟲、影象處理、C#、Android等。現在也當了兩年老師,更是覺得有義務教好每一個學生,讓貴州學子好好寫點程式碼,學點技術,"師者,傳到授業解惑也",提前祝大家新年快樂。2019我們攜手共進,為愛而生。

一.基礎知識

1.節點(Node)
節點是圖資料庫的基本元素,表示一個實體記錄,相當於關聯式資料庫中的一條記錄。在Neo4j中節點可以包括多個屬性(Property)和多個標籤(Label)。下圖中節點包括兩個屬性,id和name。

match(n{name:"格爾木源鑫堂"}) return n
[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

2.關係(Relationship)
關係是圖資料庫中的基本元素,當資料庫中存在節點後,需要將節點連線起來構成圖。關係用來連線兩個節點,也稱為圖論的邊(Edge),起始端和結束端都必須是節點,關係不能從空發起,關係可以包含多個屬性。

match(n) return n
[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

3.屬性(Property)
節點和關係都可以有多個屬性。屬性是由鍵值對組成的 <屬性:屬性值>。屬性值可以是基本的資料型別或基本資料型別組成的陣列。比如:boolean、byte、short、int、char、double、float、long、string。

4.路徑(Path)
當建立圖後,圖中任意兩個節點之間都是可能存在路徑的,它是由節點和關係組成的,路徑是有長度的。單獨一個節點可以組成路徑長度為0,兩個節點之間的路徑長度為1,依次類推。

match(n:Enterprise{name:"威門藥業"})-[:買入]->(herb) return n,herb

輸出“威門藥業”買入的藥品路徑,如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

5.遍歷(Traversal)
節點可以被關係串聯或並聯起來,由於關係可以有方向的,所以可在圖中進行遍歷操作。圖遍歷時可以指定有方向或無方向,因此在建立關係時不必為兩個節點建立互相指向的關係,而是在遍歷時不指定遍歷方向即可。

遍歷一張圖就是按照一定的規則,根據它們之間的關係,依次訪問所有相關聯的節點的操作。Neo4j提供了遍歷操作,包括廣度優先和深度優先搜尋,採用Cypher實現。


二.建立圖資料庫節點

(一) 基礎

點選“Add Graph”建立專案 “Graph1219”,如下圖所示。

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

點選“Start”按鈕開始繪製圖。

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

1.單標籤節點建立語法
使用create關鍵字建立單個節點使用下面語句,其中表示節點名稱,表示標籤名稱。

CREATE (<node-name>:<label-name>)

下面程式碼是建立一個節點為Book。

create(m:Book)
Added 1 label, created 1 node, completed after 140 ms.
match(n) return n

輸出結果如下所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

2.多標籤節點建立語法
下面是使用create關鍵字建立一個節點多個標籤的情況。

CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)

例項如下:

create(m:Cinema:Film:Movie:Picture)
Added 4 labels, created 1 node, completed after 34 ms.
match(n) return n

輸出結果如所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

(二) 例項

接下來講解具體的例項,老師、學生、課程之間的關係。

1.使用Cypher語句建立學生節點
使用Cypher中create指令建立六個Student節點,這些節點包括姓名、性別、學院和出生日期四個屬性。

create(stu1:Student{ name:'王建平', Sex:'男', Sdept:'自動化', Sbirth:'1996-01-12' })
create(stu2:Student{ name:'劉華', Sex:'女', Sdept:'自動化', Sbirth:'1995-07-01' })
create(stu3:Student{ name:'範林軍', Sex:'女', Sdept:'計算機', Sbirth:'1994-06-30' })
create(stu4:Student{ name:'李偉', Sex:'男', Sdept:'數學', Sbirth:'1995-05-01' })
create(stu5:Student{ name:'黃豔', Sex:'女', Sdept:'數學', Sbirth:'1996-04-01' })
create(stu6:Student{ name:'何純', Sex:'男', Sdept:'數學', Sbirth:'1995-06-30' })

執行 “match(n) return n” 顯示結果如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

2.使用Cypher語句建立課程節點
使用Cypher中create指令建立五個Course節點,表示課程,這些節點包括姓名、課時和編號三個屬性。

create(Course1:Course{ name:'英語', Ctime:'64', Cno:'C01'})
create(Course2:Course{ name:'資料結構', Ctime:'48', Cno:'C02'})
create(Course3:Course{ name:'Python', Ctime:'64', Cno:'C03'})
create(Course4:Course{ name:'計算機網路', Ctime:'32', Cno:'C04'})
create(Course5:Course{ name:'資料庫', Ctime:'48', Cno:'C05'})

設定不同型別節點的顏色,然後執行 “match(n) return n” 顯示結果如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

3.使用Cypher語句建立教師節點
使用Cypher中create指令建立四個Teacher節點,表示教師,這些節點包括姓名、性別和學院三個屬性。

create(Tea1:Teacher{ name:'楊秀璋', Sex:'男', Dept:'計算機'})
create(Tea2:Teacher{ name:'小民', Sex:'男', Dept:'計算機'})
create(Tea3:Teacher{ name:'小娜', Sex:'女', Dept:'英語'})
create(Tea4:Teacher{ name:'小王', Sex:'男', Dept:'計算機'})

設定不同型別節點的顏色,然後執行 “match(n) return n” 顯示結果如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

4.使用Cypher語句建立學院節點
使用Cypher中create指令建立四個Department節點,表示學院節點,這些節點包括姓名和編號兩個屬性。

create(Dept1:Department{ name:'自動化學院', No:'001'})
create(Dept2:Department{ name:'計算機學院', No:'002'})
create(Dept3:Department{ name:'英語學院', No:'003'})
create(Dept4:Department{ name:'數學學院', No:'004'})

顯示結果如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

三.建立圖資料庫關係

接著建立學生、課程、教師和學院之間的關係,但遇到了一個問題。

問題:
在建立學生-課程之間選課關係過程中,遇到了一個問題。

create 
(stu1)-[:選課]->(Course1), (stu1)-[:選課]->(Course2), (stu1)-[:選課]->(Course3),
(stu2)-[:選課]->(Course1), (stu2)-[:選課]->(Course2), (stu2)-[:選課]->(Course3),
(stu3)-[:選課]->(Course1), (stu3)-[:選課]->(Course2), (stu3)-[:選課]->(Course3), 
(stu3)-[:選課]->(Course4), (stu3)-[:選課]->(Course5),
(stu4)-[:選課]->(Course1), (stu4)-[:選課]->(Course3), (stu4)-[:選課]->(Course5),
(stu5)-[:選課]->(Course1), (stu5)-[:選課]->(Course3), (stu5)-[:選課]->(Course5),
(stu6)-[:選課]->(Course1), (stu6)-[:選課]->(Course3), (stu6)-[:選課]->(Course5)

執行結果如下圖所示,它沒有把節點關聯起來,而是重新建立了一組節點及關係。而書中直接能建立對應的關係,非常疑惑。

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

而如果是使用下面這個語句,用match先找到兩個節點,然後在給兩個節點新增關係,但它並不是在stu1和Course1之間建立了一條關係,而是所有學生和課程之間均建立了關係。

MATCH (stu1:Student),(Course1:Course)
create (stu1)-[:選課]->(Course1)

顯示如下所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

那怎麼解決呢?
原來,在實際操作,在建立節點的同時建立關係,即建立節點和關係語句必須一次執行完,否則如上面所述,建立關係時括號()中的節點被認為是新的節點。

比如執行下面這段書中電影程式碼,Keanu等作為節點的識別符號可以被下面識別,分開執行後面語句是認為新的節點。

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961})
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960})
CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967})
CREATE (LanaW:Person {name:'Lana Wachowski', born:1965})
CREATE (JoelS:Person {name:'Joel Silver', born:1952})
CREATE
  (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
  (Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
  (Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
  (Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
  (LillyW)-[:DIRECTED]->(TheMatrix),
  (LanaW)-[:DIRECTED]->(TheMatrix),
  (JoelS)-[:PRODUCED]->(TheMatrix)

CREATE (Emil:Person {name:"Emil Eifrem", born:1978})
CREATE (Emil)-[:ACTED_IN {roles:["Emil"]}]->(TheMatrix)

然後執行 “match(n) return n” 顯示結果如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

完美解決方法
1.首先需要把資料清空,重來插入節點資料。

刪除關係
MATCH (n)-[r]-()
DELETE r

單純刪除所以節點:
match (n)
delete n

2.然後執行所有程式碼,包括插入節點及插入關係。關係包括:
(1) 建立學生-課程之間關係 選課
(2) 建立教師-課程之間關係 授課
(3) 建立學生-學院之間關係 屬於
(4) 建立教師-學院之間關係 隸屬

下面這段程式碼是建立學生和課程之間的關係,程式碼如下:

create(stu1:Student{ name:'王建平', Sex:'男', Sdept:'自動化', Sbirth:'1996-01-12' })
create(stu2:Student{ name:'劉華', Sex:'女', Sdept:'自動化', Sbirth:'1995-07-01' })
create(stu3:Student{ name:'範林軍', Sex:'女', Sdept:'計算機', Sbirth:'1994-06-30' })
create(stu4:Student{ name:'李偉', Sex:'男', Sdept:'數學', Sbirth:'1995-05-01' })
create(stu5:Student{ name:'黃豔', Sex:'女', Sdept:'數學', Sbirth:'1996-04-01' })
create(stu6:Student{ name:'何純', Sex:'男', Sdept:'數學', Sbirth:'1995-06-30' })
create(Course1:Course{ name:'英語', Ctime:'64', Cno:'C01'})
create(Course2:Course{ name:'資料結構', Ctime:'48', Cno:'C02'})
create(Course3:Course{ name:'Python', Ctime:'64', Cno:'C03'})
create(Course4:Course{ name:'計算機網路', Ctime:'32', Cno:'C04'})
create(Course5:Course{ name:'資料庫', Ctime:'48', Cno:'C05'})
create(Tea1:Teacher{ name:'楊秀璋', Sex:'男', Dept:'計算機'})
create(Tea2:Teacher{ name:'小民', Sex:'男', Dept:'計算機'})
create(Tea3:Teacher{ name:'小娜', Sex:'女', Dept:'英語'})
create(Tea4:Teacher{ name:'小王', Sex:'男', Dept:'計算機'})
create(Dept1:Department{ name:'自動化學院', No:'001'})
create(Dept2:Department{ name:'計算機學院', No:'002'})
create(Dept3:Department{ name:'英語學院', No:'003'})
create(Dept4:Department{ name:'數學學院', No:'004'})
create 
(stu1)-[:選課]->(Course1), (stu1)-[:選課]->(Course2), (stu1)-[:選課]->(Course3),
(stu2)-[:選課]->(Course1), (stu2)-[:選課]->(Course2), (stu2)-[:選課]->(Course3),
(stu3)-[:選課]->(Course1), (stu3)-[:選課]->(Course2), (stu3)-[:選課]->(Course3), 
(stu3)-[:選課]->(Course4), (stu3)-[:選課]->(Course5),
(stu4)-[:選課]->(Course1), (stu4)-[:選課]->(Course3), (stu4)-[:選課]->(Course5),
(stu5)-[:選課]->(Course1), (stu5)-[:選課]->(Course3), (stu5)-[:選課]->(Course5),
(stu6)-[:選課]->(Course1), (stu6)-[:選課]->(Course3), (stu6)-[:選課]->(Course5)

輸出結果如下圖所示,可以看到選修資料庫(Course5)的學生包括何純、李偉、黃豔和範林軍。也可以看到學生何純(stu6)選修了課程資料庫(Course5)、Python(Course3)、英語(Course1)。

(stu6)-[:選課]->(Course1), (stu6)-[:選課]->(Course3), (stu6)-[:選課]->(Course5)

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

接著是最終的完整CQL語句,程式碼如下:

create(stu1:Student{ name:'王建平', Sex:'男', Sdept:'自動化', Sbirth:'1996-01-12' })
create(stu2:Student{ name:'劉華', Sex:'女', Sdept:'自動化', Sbirth:'1995-07-01' })
create(stu3:Student{ name:'範林軍', Sex:'女', Sdept:'計算機', Sbirth:'1994-06-30' })
create(stu4:Student{ name:'李偉', Sex:'男', Sdept:'數學', Sbirth:'1995-05-01' })
create(stu5:Student{ name:'黃豔', Sex:'女', Sdept:'數學', Sbirth:'1996-04-01' })
create(stu6:Student{ name:'何純', Sex:'男', Sdept:'數學', Sbirth:'1995-06-30' })
create(Course1:Course{ name:'英語', Ctime:'64', Cno:'C01'})
create(Course2:Course{ name:'資料結構', Ctime:'48', Cno:'C02'})
create(Course3:Course{ name:'Python', Ctime:'64', Cno:'C03'})
create(Course4:Course{ name:'計算機網路', Ctime:'32', Cno:'C04'})
create(Course5:Course{ name:'資料庫', Ctime:'48', Cno:'C05'})
create(Tea1:Teacher{ name:'楊秀璋', Sex:'男', Dept:'計算機'})
create(Tea2:Teacher{ name:'小民', Sex:'男', Dept:'計算機'})
create(Tea3:Teacher{ name:'小娜', Sex:'女', Dept:'英語'})
create(Tea4:Teacher{ name:'小王', Sex:'男', Dept:'計算機'})
create(Dept1:Department{ name:'自動化學院', No:'001'})
create(Dept2:Department{ name:'計算機學院', No:'002'})
create(Dept3:Department{ name:'英語學院', No:'003'})
create(Dept4:Department{ name:'數學學院', No:'004'})
create 
(stu1)-[:選課]->(Course1), (stu1)-[:選課]->(Course2), (stu1)-[:選課]->(Course3),
(stu2)-[:選課]->(Course1), (stu2)-[:選課]->(Course2), (stu2)-[:選課]->(Course3),
(stu3)-[:選課]->(Course1), (stu3)-[:選課]->(Course2), (stu3)-[:選課]->(Course3), 
(stu3)-[:選課]->(Course4), (stu3)-[:選課]->(Course5),
(stu4)-[:選課]->(Course1), (stu4)-[:選課]->(Course3), (stu4)-[:選課]->(Course5),
(stu5)-[:選課]->(Course1), (stu5)-[:選課]->(Course3), (stu5)-[:選課]->(Course5),
(stu6)-[:選課]->(Course1), (stu6)-[:選課]->(Course3), (stu6)-[:選課]->(Course5)
create
(Tea1)-[:教課]->(Course3),(Tea1)-[:教課]->(Course5),
(Tea2)-[:教課]->(Course2),
(Tea3)-[:教課]->(Course1),
(Tea4)-[:教課]->(Course4),(Tea4)-[:教課]->(Course5)
create
(Tea1)-[:隸屬{rela:'普通教師'}]->(Dept2),
(Tea2)-[:隸屬{rela:'副院長'}]->(Dept2),
(Tea3)-[:隸屬{rela:'副院長'}]->(Dept3),
(Tea4)-[:隸屬{rela:'系主任'}]->(Dept1)
create
(stu1)-[:包括]->(Dept1),
(stu2)-[:包括]->(Dept1),
(stu3)-[:包括]->(Dept2),
(stu4)-[:包括]->(Dept4),
(stu5)-[:包括]->(Dept4),
(stu6)-[:包括]->(Dept4);

關係:
(1)學生-課程
選課:王建平選擇課程1、2、3,劉華選擇課程1、2、3,範林軍選擇課程1、2、3、4、5,李偉、黃豔、何純同屬於數學學院,選課為1、3、5。
(2)教師-課程
授課:楊秀璋教資料庫、Python,小民教資料結構,小娜教英語,小王教資料庫和計算機網路。
(3)教師-學院
隸屬:楊秀璋隸屬於計算機學院(屬性:普通教師),小民隸屬於計算機學院(屬性:副院長),小娜隸屬於英語學院(屬性:副院長),小王隸屬於自動化學院(屬性:系主任)。
(4)學生-學院
包括:自動化學院包括學生王建平、劉華,計算機學院包括學生範林軍,數學學院包括李偉、黃豔、何純。

最終輸出的關係如下圖所示:

[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係
[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係

寫到這裡這篇文章基本結束,我後續將繼續深入學習找到更好地解決方法,MATCH中增加WHERE應該可以定位指定節點,實現定向的關係補充或修改。同時,如果資料量多我也建議使用CSV檔案匯入。總之,希望基礎文章對您有所幫助,一起加油。

(By: Eastmount 2018-12-19 晚7點 https://blog.csdn.net/Eastmount/ )

相關文章