一、Neo4j是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基於磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。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應用程序
三、.Neo4j的優缺點
(1)優點
①底層數據存儲專門針對圖形數據的特點進行了優化,在處理關係數據方面比其他數據庫有更高的性能。
②專門爲關係數據設計的查詢語言更便於關係數據的操作。
③沒有表結構的概念,它比SQL更靈活。
④自動爲數據建立合適的索引(根據數據的標籤),避免索引管理的麻煩。
⑤支持高可用主從集羣部署。
⑥藉助圖形平臺等輔助工具幫助開發人員快速構建完整的關係數據平臺。
(2)neo4j的缺點
①圖數據結構導致寫入性能差。
②只支持java和基於jvm的語言,社區版不能使用集羣。
③社區不夠活躍,資料不豐富。
(3)爲什麼選用Neo4j
Neo4j發佈時間早,產品較爲成熟穩定,目前是市場使用率最高的圖數據庫,文檔和各種技術博客較多
四、構成包含:節點、屬性、關係、標籤、數據瀏覽器
1)節點
節點(Node)是圖數據庫中的一個基本元素,用來表示一個實體記錄,就像關係數據庫中的一條記錄一 樣。在Neo4j中節點可以包含多個屬性(Property)和多個標籤(Label)。
- 節點是主要的數據元素
- 節點通過關係連接到其他節點
- 節點可以具有一個或多個屬性(即,存儲爲鍵/值對的屬性)
- 節點有一個或多個標籤,用於描述其在圖表中的作用
2)屬性
屬性(Property)是用於描述圖節點和關係的鍵值對。其中Key是一個字符串,值可以通過使用任何,Neo4j數據類型來表示。
- 屬性是命名值,其中名稱(或鍵)是字符串
- 屬性可以被索引和約束
- 可以從多個屬性創建複合索引
3)關係
關係(Relationship)同樣是圖數據庫的基本元素。當數據庫中已經存在節點後,需要將節點連接起來構成圖。關係就是用來連接兩個節點,關係也稱爲圖論的邊(Edge) ,其始端和末端都必須是節點,關係不能指向空也不能從空發起。關係和節點一樣可以包含多個屬性,但關係只能有一個類型(Type) 。
- 關係連接兩個節點
- 關係是方向性的
- 節點可以有多個甚至遞歸的關係
- 關係可以有一個或多個屬性(即存儲爲鍵/值對的屬性)
基於方向性,Neo4j關係被分爲兩種主要類型:
- 單向關係
- 雙向關係
4)標籤
標籤(Label)將一個公共名稱與一組節點或關係相關聯, 節點或關係可以包含一個或多個標籤。 我們 可以爲現有節點或關係創建新標籤, 我們可以從現有節點或關係中刪除標籤。
- 標籤用於將節點分組
- 一個節點可以具有多個標籤
- 對標籤進行索引以加速在圖中查找節點
- 本機標籤索引針對速度進行了優化
5)Neo4j Browser
一旦我們安裝Neo4j,我們就可以訪問Neo4j數據瀏覽器
五、安裝,注意社區版,不能使用集羣方式部署,並且有節點和關係數量限制。
version: '3' services: xbd-neo4j: image: neo4j:4.4.25 restart: always container_name: xbd-neo4j privileged: true ports: - 7474:7474 - 7687:7687 environment: - TZ=Asia/Shanghai volumes: - /var/lib/neo4j:/data
六、界面視圖
七、基本語法:
1)創建
CREATE (<變量>:<標籤> {<屬性:JSON格式>}) RETURN <變量> CREATE (n:NODE {name:'node'}) RETURN n
2)刪除
MATCH (<變量>:<標籤> {<屬性:JSON格式>}) DETACH DELETE n MATCH (n:NODE {name:'node'}) DETACH DELETE n
3)合併
MERGE(<變量>:<標籤> {<屬性:JSON格式>}) RETURN <變量> MERGE (n:NODE {name:"node"}) return n
4)查詢
MATCH (<變量>:<標籤> {<屬性:JSON格式>}) RETURN <變量> MATCH (n:NODE {name:'node'}) RETURN n
八、一些基本操作
1)創建節點
MERGE (node1:NODE {name:"node1", ip:"0.0.0.1"}) return node1 MERGE (node2:NODE {name:"node2", ip:"0.0.0.2"}) return node2 MERGE (node3:NODE {name:"node3", ip:"0.0.0.3"}) return node3
2)更新關係
MATCH (node1:NODE {ip:"0.0.0.1"}), (node2:NODE {ip:"0.0.0.2"}), (node3:NODE {ip:"0.0.0.3"}) MERGE (node1)-[r1:ref]->(node2)-[r2:ref]->(node3) return node1, node2, node3, r1, r2
3)一次性加入節點和關係
MERGE (node4:NODE {name:"node4"})-[r3:ref]->(node5:NODE {name:"node5"})-[r4:ref]->(node6:NODE {name:"node6"}) return node4, node5, node6, r3, r4
4)通用查詢
MATCH n=(x:NODE {ip:"0.0.0.1"})-[*]-(y:NODE {ip:"0.0.0.3"}) return n
說明:單節點查詢,返回x,y即可
九、測試展示