一、圖數據庫介紹
圖數據庫(Graph Database)是基於圖論實現的一種新型NoSQL數據庫。它的數據存儲結構和數據的查詢方式都是以圖論爲基礎的。圖論中圖的基本元素爲節點和邊,在圖數據庫中對應的就是節點和關係。
在圖數據庫中,數據與數據之間的關係通過節點和關係構成一個圖結構並在此結構上實現數據庫的所有特性,如對圖數據對象進行創建、讀取、更新、刪除(Create、Read、Update、Delete,簡稱:CRUD)等操作的能力,還有處理事務的能力和高可用性等。
目前市面上較爲流行的圖數據庫產品有以下幾種:
較爲流行的圖數據庫
1.2、圖數據庫與關係數據庫的對比
RDBMS中關係查詢示意圖
圖數據庫中關係查詢示意圖
複雜數據關係
二、Neo4j
Neo4j是由Java和Scala實現的開源NoSQL圖數據庫。自2003年開始研發,直到2007年正式發佈第一版。Neo4j的源代碼託管在GitHub上,技術支持託管在Stack Overflow和Neo4j Google討論組上。Neo4j現如今已經被各種行業的數十萬家公司和組織採用。Neo4j的使用案例涵蓋了包括網絡管理、軟件分析、科學研究、路由分析、組織和項目管理、決策制定、社交網絡等。
官方網站:https://neo4j.com
Github: https://github.com/neo4j/neo4j
Example: https://github.com/neo4j-examples
Neo4j具備的特性:
2.1 介紹
2.1.1、Neo4j是什麼
Neo4j是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基於磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數據庫的所有特性。程序員工作在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的數據庫的所有好處。
2.1.2、Neo4j的特點
- SQL就像簡單的查詢語言Neo4j CQL
- 它遵循屬性圖數據模型
- 它通過使用Apache Lucence支持索引
- 它支持UNIQUE約束
- 它它包含一個用於執行CQL命令的UI:Neo4j數據瀏覽器
- 它支持完整的ACID(原子性,一致性,隔離性和持久性)規則
- 它採用原生圖形庫與本地GPE(圖形處理引擎)
- 它支持查詢的數據導出到JSON和XLS格式
- 它提供了REST API,可以被任何編程語言(如Java,Spring,Scala等)訪問
- 它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java腳本
- 它支持兩種Java API:Cypher API和Native Java API來開發Java應用程序
2.1.3 Neo4j的優點
- 它很容易表示連接的數據
- 檢索/遍歷/導航更多的連接數據是非常容易和快速的
- 它非常容易地表示半結構化數據
- Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習
- 它使用簡單而強大的數據模型
- 它不需要複雜的連接來檢索連接的/相關的數據,因爲它很容易檢索它的相鄰節點或關係細節沒有連接或索引
2.2 neo4j安裝
2.2.1.環境
Centos 7.4
neo4j-community-3.5.17
使用社區版本,企業版需要收費。
2.2.2.下載
下載地址 https://neo4j.com/download/other-releases/
下載
wget https://neo4j.com/artifact.php?name=
neo4j-community-3.5.17-unix.tar.gz
解壓
tar -zxvf neo4j-community-3.4.1.tar.gz
2.2.3 開啓遠程訪問
一、對於3.0以前的版本
在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 文件內,找到下面一行,將註釋#號去掉就可以了 #dbms.connector.https.address=localhost:7473
改爲 dbms.connector.https.address=0.0.0.0:7473
這樣,遠程其他電腦可以用本機的IP或者域名後面跟上7474 端口就能打開web界面了 如: https://:7473
當然,你的操作系統的防火牆也要確保開放了7474端口才行,防火牆怎樣開放請自行鍼對自己的操作系統查找文檔
二、對於3.1及以後的版本
在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 文件內,找到下面一行,將註釋#號去掉就可以了 dbms.connectors.default_listen_address=0.0.0.0
2.2.4 啓動
在bin目錄下,執行命令:./neo4j start啓動,其他命令 { console | start | stop | restart | status }
訪問http://IP地址:7474/
, 出現下圖即代表安裝成功,頂部的$輸入框用來執行下面的CQL語句。
第一次訪問需要修改密碼,默認的賬號密碼都爲neo4j
三、Neo4j - 構建模塊
Neo4j圖數據庫主要有以下構建塊 -
- 節點
- 屬性
- 關係
- 標籤
- 數據瀏覽器
3.1 節點
節點是圖表的基本單位。 它包含具有鍵值對的屬性,如下所示:
這裏Node Name =“Employee”,它包含一組屬性作爲鍵值對
3.2 屬性
屬性是用於描述圖節點和關係的鍵值對
Key =值
其中Key是一個字符串
值可以通過使用任何Neo4j數據類型來表示
3.3 關係
關係是圖形數據庫的另一個主要構建塊。 它連接兩個節點,如下所示。
這裏Emp和Dept是兩個不同的節點。 “WORKS_FOR”是Emp和Dept節點之間的關係。
因爲它表示從Emp到Dept的箭頭標記,那麼這種關係描述的一樣
Emp WORKS_FOR Dept
每個關係包含一個起始節點和一個結束節點。
這裏“Emp”是一個起始節點。“Dept”是端節點。由於該關係箭頭標記表示從“Emp”節點到“Dept”節點的關係,該關係被稱爲“進入關係”到“Dept”節點。並且“外向關係”到“Emp”節點。
像節點一樣,關係也可以包含屬性作爲鍵值對。
這裏的“WORKS_FOR”關係有一個屬性作爲鍵值對 ID = 123 它代表了這種關係的一個ID。
3.4、標籤:
Label將一個公共名稱與一組節點或關係相關聯。 節點或關係可以包含一個或多個標籤。 我們可以爲現有節點或關係創建新標籤。 我們可以從現有節點或關係中刪除現有標籤。
從前面的圖中,我們可以觀察到有兩個節點。
左側節點都有一個標籤:“EMP”,而右側節點都有一個標籤:“Dept”。
這兩個節點之間的關係,也有一個標籤:“WORKS_FOR”
注: -Neo4j將數據存儲在節點或關係的屬性中。
四、官方入門實例介紹
爲了方便讀者入門,Neo4j Web管理界面提供了一個官方入門實例“電影關係圖”幫助初學者在自己電腦上一步步創建一個入門級別的圖數據結構。本節將圍繞這個“電影關係圖”實例一步步講解、分析其創建和查詢等操作。
這個實例將指引讀者學習以下入門操作:
- 創建圖數據:將電影、演員、導演等圖數據導入到Neo4j數據庫中。
- 檢索節點:檢索特定電影和演員。
- 查詢關係:發現相關的演員和導演。
- 查詢關係路徑:查詢他們之間的關係路徑。
檢索節點
圖數據結構創建完畢後,在本節中我們將要了解檢索節點的相關操作。
1、查找人員
查找名爲“Tom Hanks”的人物
MATCH (tom {name: "Tom Hanks"}) RETURN tom
上面指令使用MATCH指令查找匹配條件:{name: "Tom Hanks"}的節點,執行的結果爲:
我們可以在結果顯示區看到查詢到的節點,注意在結果展示區點擊節點圖標,會查看到節點的屬性。
2、查找電影節點
查找名爲“Cloud Atlas”的電影
MATCH (cloudAtlas {title: "Cloud Atlas"}) RETURN cloudAtlas
上面指令查找匹配條件{title: "Cloud Atlas"}的節點,返回結果爲:
查找多個電影
查找1990年到2000年發行的電影的名稱
match (m:Movie) WHERE m.released>1990 and m.released<2000 RETURN m.title
返回結果爲:
查詢關係
1、查找演員參演的電影
查找"Tom Hanks"參演過的電影的名稱
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
返回結果爲:
2、查找與“Tom Hanks”同出演過電影的人
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(n:Person) return n.name
3、查找與電影“Cloud Atlas”相關的所有人
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo
查詢關係路徑
1、查找與演員“Kevin Bacon”存在4條及以內關係的任何演員和電影
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood)
RETURN DISTINCT hollywood
返回結果爲:
2、查找與演員“Kevin Bacon”與“Meg Ryan”之間的最短關係路徑
match p = shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})) return p
返回結果爲:
3、找人將Tom Hanks介紹給Tom Cruise
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors),
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"})
RETURN tom, m, coActors, m2, cruise
結果爲: