[知識圖譜構建] 二.《Neo4j基礎入門》基礎學習之建立圖資料庫節點及關係
該系列文章主要講解知識圖譜及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
一.基礎知識
1.節點(Node)
節點是圖資料庫的基本元素,表示一個實體記錄,相當於關聯式資料庫中的一條記錄。在Neo4j中節點可以包括多個屬性(Property)和多個標籤(Label)。下圖中節點包括兩個屬性,id和name。
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)
節點可以被關係串聯或並聯起來,由於關係可以有方向的,所以可在圖中進行遍歷操作。圖遍歷時可以指定有方向或無方向,因此在建立關係時不必為兩個節點建立互相指向的關係,而是在遍歷時不指定遍歷方向即可。
遍歷一張圖就是按照一定的規則,根據它們之間的關係,依次訪問所有相關聯的節點的操作。Neo4j提供了遍歷操作,包括廣度優先和深度優先搜尋,採用Cypher實現。
二.建立圖資料庫節點
(一) 基礎
點選“Add Graph”建立專案 “Graph1219”,如下圖所示。
點選“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)學生-課程
選課:王建平選擇課程1、2、3,劉華選擇課程1、2、3,範林軍選擇課程1、2、3、4、5,李偉、黃豔、何純同屬於數學學院,選課為1、3、5。
(2)教師-課程
授課:楊秀璋教資料庫、Python,小民教資料結構,小娜教英語,小王教資料庫和計算機網路。
(3)教師-學院
隸屬:楊秀璋隸屬於計算機學院(屬性:普通教師),小民隸屬於計算機學院(屬性:副院長),小娜隸屬於英語學院(屬性:副院長),小王隸屬於自動化學院(屬性:系主任)。
(4)學生-學院
包括:自動化學院包括學生王建平、劉華,計算機學院包括學生範林軍,數學學院包括李偉、黃豔、何純。
最終輸出的關係如下圖所示:
寫到這裡這篇文章基本結束,我後續將繼續深入學習找到更好地解決方法,MATCH中增加WHERE應該可以定位指定節點,實現定向的關係補充或修改。同時,如果資料量多我也建議使用CSV檔案匯入。總之,希望基礎文章對您有所幫助,一起加油。
(By: Eastmount 2018-12-19 晚7點 https://blog.csdn.net/Eastmount/ )
相關文章
- NumPy基礎知識圖譜
- neo4j匯入關係csv檔案建立知識圖譜
- 知識圖譜構建之實體關係挖掘
- Neo4j - 圖資料庫基礎資料庫
- 基於 Nebula Graph 構建百億關係知識圖譜實踐
- 知識圖譜 KnowledgeGraph基礎解析
- [知識圖譜構建] 一.Neo4j圖資料庫安裝初識及藥材供應圖譜例項資料庫
- 【Redis學習⑴】Redis入門安裝及基礎資料的知識Redis
- MySQL 資料庫基礎知識點複習MySql資料庫
- Python基礎知識入門(二)Python
- Python入門基礎知識(二)Python
- 圖形學基礎知識
- [關係圖譜] 二.Gephi匯入共線矩陣構建作者關係圖譜矩陣
- Java入門基礎知識點Java
- Dubbo基礎入門知識點
- mysql資料庫學習基礎知識整理MySql資料庫
- 資料庫學習筆記 - MySQL基礎知識資料庫筆記MySql
- 資料庫基礎知識資料庫
- 【知識圖譜】知識圖譜資料構建的“硬骨頭”,阿里工程師如何拿下?深度學習在知識圖譜構建中的應用。阿里工程師深度學習
- Python入門之基礎知識(一)Python
- 構建知識圖譜-初學
- 大資料分析入門基礎知識學什麼?大資料
- 趁熱打鐵,再構建百萬節點關係中醫藥方劑知識圖譜
- 達夢資料庫基礎知識(二)資料庫邏輯結構資料庫
- SQL與NoSQL資料庫入門基礎知識詳解SQL資料庫
- MySQL資料庫基礎知識及優化MySql資料庫優化
- 基於neo4j構建火影忍者知識圖譜視覺化及問答系統視覺化
- 學習資料庫的基礎知識的書籍資料庫
- Python入門必知的知識點!Python基礎入門Python
- GEO資料庫基礎知識資料庫
- 資料庫基礎重要知識資料庫
- 基礎知識梳理~資料庫資料庫
- JavaScript 基礎知識入門JavaScript
- Redis基礎知識(學習筆記1--五種基礎資料結構)Redis筆記資料結構
- Python快速入門之基礎知識(一)Python
- WebSocket系列之基礎知識入門篇Web
- JavaScript入門①-基礎知識築基JavaScript
- 圖解 IP 基礎知識!圖解