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

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

PS:2019年1~2月做者參加了CSDN2018年博客評選,但願您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/indexweb

五年來寫了314篇博客,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、數據挖掘、網絡爬蟲、圖像處理、C#、Android等。如今也當了兩年老師,更是以爲有義務教好每個學生,讓貴州學子好好寫點代碼,學點技術,"師者,傳到授業解惑也",提早祝你們新年快樂。2019咱們攜手共進,爲愛而生。

一.基礎知識

1.節點(Node)
節點是圖數據庫的基本元素,表示一個實體記錄,至關於關係數據庫中的一條記錄。在Neo4j中節點能夠包括多個屬性(Property)和多個標籤(Label)。下圖中節點包括兩個屬性,id和name。sql

match(n{name:"格爾木源鑫堂"}) return n

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

match(n) return n

3.屬性(Property)
節點和關係均可以有多個屬性。屬性是由鍵值對組成的 <屬性:屬性值>。屬性值能夠是基本的數據類型或基本數據類型組成的數組。好比:boolean、byte、short、int、char、double、float、long、string。數組

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

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

輸出「威門藥業」買入的藥品路徑,以下圖所示:數據結構

5.遍歷(Traversal)
節點能夠被關係串聯或並聯起來,因爲關係能夠有方向的,因此可在圖中進行遍歷操做。圖遍歷時能夠指定有方向或無方向,所以在建立關係時沒必要爲兩個節點建立互相指向的關係,而是在遍歷時不指定遍歷方向便可。svg

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


二.建立圖數據庫節點

(一) 基礎

點擊「Add Graph」建立項目 「Graph1219」,以下圖所示。spa

點擊「Start」按鈕開始繪製圖。

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

輸出結果以下所示:

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

輸出結果如所示:

(二) 實例

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

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」 顯示結果以下圖所示:

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」 顯示結果以下圖所示:

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」 顯示結果以下圖所示:

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'})

顯示結果以下圖所示:


三.建立圖數據庫關係

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

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

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)

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

而若是是使用下面這個語句,用match先找到兩個節點,而後在給兩個節點添加關係,但它並非在stu1和Course1之間建立了一條關係,而是全部學生和課程之間均建立了關係。

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

顯示以下所示:

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

好比執行下面這段書中電影代碼,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」 顯示結果以下圖所示:

完美解決方法
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)

接着是最終的完整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)學生-課程
選課:王建平選擇課程一、二、3,劉華選擇課程一、二、3,範林軍選擇課程一、二、三、四、5,李偉、黃豔、何純同屬於數學學院,選課爲一、三、5。
(2)教師-課程
授課:楊秀璋教數據庫、Python,小民教數據結構,小娜教英語,小王教數據庫和計算機網絡。
(3)教師-學院
隸屬:楊秀璋隸屬於計算機學院(屬性:普通教師),小民隸屬於計算機學院(屬性:副院長),小娜隸屬於英語學院(屬性:副院長),小王隸屬於自動化學院(屬性:系主任)。
(4)學生-學院
包括:自動化學院包括學生王建平、劉華,計算機學院包括學生範林軍,數學學院包括李偉、黃豔、何純。

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

寫到這裏這篇文章基本結束,我後續將繼續深刻學習找到更好地解決方法,MATCH中增長WHERE應該能夠定位指定節點,實現定向的關係補充或修改。同時,若是數據量多我也建議使用CSV文件導入。總之,但願基礎文章對您有所幫助,一塊兒加油。

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