該系列文章主要講解知識圖譜及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
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/ )