一、圖數(shù)據(jù)庫的基本介紹
- 什么是圖形數(shù)據(jù)庫
圖形數(shù)據(jù)庫(Graph Database)是NoSQL數(shù)據(jù)庫家族中特殊的存在皇帮,用于存儲豐富的關(guān)系數(shù)據(jù)卷哩,Neo4j 是目前最流行的圖形數(shù)據(jù)庫,支持完整的事務(wù)属拾。
在屬性圖中将谊,圖是由節(jié)點(Node),邊(Edge)渐白,標簽(Lable)和屬性(Property)組成的尊浓,節(jié)點和邊都可以設(shè)置屬性,節(jié)點也稱作實體(Entity)纯衍,邊也稱作關(guān)系(Relationship)栋齿,每個節(jié)點和關(guān)系都可以由一個或多個屬性。在圖形中襟诸,節(jié)點和關(guān)系是最重要的實體瓦堵,所有的節(jié)點是獨立存在的,為節(jié)點設(shè)置標簽歌亲,那么擁有相同標簽的節(jié)點屬于一個分組菇用,一個集合;關(guān)系通過關(guān)系類型來分組陷揪,類型相同的關(guān)系屬于同一個集合惋鸥。關(guān)系是有向的,關(guān)系的兩端是起始節(jié)點和結(jié)束節(jié)點悍缠,通過有向的箭頭來標識方向卦绣,節(jié)點之間的雙向關(guān)系通過兩個方向相反的關(guān)系來標識。
Neo4j圖形數(shù)據(jù)庫的查詢語言是Cypher飞蚓,用于操作屬性圖滤港,是圖形語言中事實上的標準。
二玷坠、Neo4j的基本概念
- Nodes(節(jié)點)
圖譜的基本單位主要是節(jié)點和關(guān)系蜗搔,他們都可以包含屬性,一個節(jié)點就是一行數(shù)據(jù)八堡,一個關(guān)系也是一行數(shù)據(jù)樟凄,里面的屬性就是數(shù)據(jù)庫里面的row里面的字段。
除了屬性之外兄渺,關(guān)系和節(jié)點還可以有零到多個標簽缝龄,標簽也可以認為是一個特殊分組方式。 - Relationships(關(guān)系)
關(guān)系的功能是組織和連接節(jié)點,一個關(guān)系連接2個節(jié)點叔壤,一個開始節(jié)點和一個結(jié)束節(jié)點瞎饲。當所有的點被連接起來,就形成了一張圖譜炼绘,通過關(guān)系可以組織節(jié)點形成任意的結(jié)構(gòu)嗅战,比如list,tree俺亮,map驮捍,tuple,或者更復(fù)雜的結(jié)構(gòu)脚曾。關(guān)系擁有方向進和出东且,代表一種指向。 - Properties(屬性)
屬性非常類似數(shù)據(jù)庫里面的字段本讥,只有節(jié)點和關(guān)系可以擁有0到多個屬性珊泳,屬性類型基本和java的數(shù)據(jù)類型一致,分為 數(shù)值拷沸,字符串色查,布爾,以及其他的一些類型堵漱,字段名必須是字符串综慎。 - Labels(標簽)
標簽通過形容一種角色或者給節(jié)點加上一種類型,一個節(jié)點可以有多個類型勤庐,通過類型區(qū)分一類節(jié)點,這樣在查詢時候可以更加方便和高效好港,除此之外標簽在給屬性建立索引或者約束時候也會用到愉镰。label名稱必須是非空的unicode字符串,另外lables最大標記容量是int的最大值钧汹,近似21億丈探。 - Paths(路徑)
路徑是一個或多個節(jié)點通過關(guān)系連接起來的產(chǎn)物,例如得到圖譜查詢或者遍歷的結(jié)果拔莱。
二碗降、Neo4j的基本操作
- 創(chuàng)建單個節(jié)點/實體
直接創(chuàng)建:CREATE (n:金庸武俠人物{name:"楊過"}) RETURN n
沒有就創(chuàng)建 :MERGE (n:金庸武俠人物{name:"小龍女"}) RETURN n
- 創(chuàng)建實體與實體的關(guān)系
MATCH (n:金庸武俠人物{name:"楊過"}),(n1:金庸武俠人物{name:"小龍女"}) CREATE (n)-[r:夫妻]->(n1) RETURN n,n1,r
- 給實體添加屬性
MATCH (n:金庸武俠人物{name:"楊過"}) set n.skill="黯然銷魂掌"
- 給關(guān)系添加屬性
MATCH (n)-[r:`夫妻`]->(n1) set r.des="師徒" RETURN n,n1,r
- 修改節(jié)點/關(guān)系屬性
MATCH (n:金庸武俠人物{name:"楊過"}) set n.skill="玄鐵劍法"
- 移除節(jié)點/關(guān)系屬性
match (n:`金庸武俠人物`{name:"楊過"}) remove n.skill
MATCH (n)-[r:`夫妻`]->(n1) remove r.des
- 單個節(jié)點查找
"MATCH (n:`金庸武俠人物`{name:"楊過"}) RETURN n
MATCH (n:`金庸武俠人物`) where n.name="楊過" RETURN n
- 整個label查找
查找label是“金庸武俠人物”的所有實體和關(guān)系:match (n:`金庸武俠人物`) return n
- 關(guān)系查詢
1.查詢關(guān)系是“后人”的所有實體:match (n:`金庸武俠人物`)-[r:后人]->(n1:`金庸武俠人物`) return n,r,n1
2.查詢張無忌的所有對外關(guān)系:match (n:`金庸武俠人物`{name:"張無忌"})-[r]->(n1) return n,r,n1
3.查詢張無忌的所有關(guān)系:match (n:`金庸武俠人物`{name:"張無忌"})-[r]-(n1) return n,r,n1
4.查詢張無忌的所有2度關(guān)系:match (n:`金庸武俠人物`{name:"張無忌"})-[*..2]-(n1) return n,n1
5.查找楊過和周芷若兩個實體3度的最短路徑:match (n:`金庸武俠人物`{name:"楊過"}),(n1:`金庸武俠人物`{name:"周芷若"}),p=shortestpath((n)-[*..3]-(n1)) return p
6.查找楊過和周芷若兩個實體3度的所有最短路徑:match (n:`金庸武俠人物`{name:"楊過"}),(n1:`金庸武俠人物`{name:"周芷若"}),p=allshortestpaths((n)-[*..3]-(n1)) return p
- 刪除關(guān)系
1.刪除張無忌和周芷若的所有關(guān)系:match (n:`金庸武俠人物`{name:"張無忌"})-[r]-(n1:`金庸武俠人物`{name:"周芷若"}) delete r
2.刪除節(jié)點前要刪除節(jié)點的關(guān)系,否則報錯:match (n:`金庸武俠人物`{name:"張無忌"}) delete n
- 強制刪除對應(yīng)標簽下的所有節(jié)點和關(guān)系
match (n:`金庸武俠人物`) detach delete n
- 強制刪除圖庫中的所有節(jié)點和關(guān)系
match (n) detach delete n
任務(wù)關(guān)系文件:鏈接:https://pan.baidu.com/s/1DQ6BewVQN0zpOnFwtW--dg 密碼:7tdn