neo4j图数据库
目錄
- neo4j說明
- docker-compose安裝
-
命令
- 創建節點
- 創建節點關系
- 創建節點并建立關系
- 更新節點和關系
- 查詢節點和關系
- 刪除節點及關系
- golang執行cypher命令--創建節點
- golang執行cypher命令2--創建節點+建立關系
neo4j說明
Neo4j是一個高性能的NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結構化數據存儲在網絡(從數學角度叫做圖)上而不是表中。在Neo4j中,數據以圖(網絡)的形式而非傳統的表的形式進行存儲。這種圖模型中,數據以節點(頂點)和邊的方式表示,節點可以表示實體,而邊則表示這些實體之間的各種關系。
這種數據模型的主要優點在于其快速解決復雜關系問題的能力。在Neo4j中,底層數據存儲專門針對圖形數據的特點進行了優化,因此在處理關系數據方面比其他數據庫有更高的性能。另外,由于Neo4j沒有表結構的概念,程序員可以在一個面向對象的、靈活的網絡結構下工作,而非嚴格、靜態的表結構,因此它比SQL更靈活。
Neo4j因其嵌入式、高性能、輕量級等優勢,越來越受到關注。
docker-compose安裝
version: '3'
services:
neo4j:
image: neo4j:4.4.27
ports:
- 7474:7474
- 7687:7687
volumes:
- ./data:/data
- ./logs:/logs
environment:
- NEO4J_AUTH=neo4j/123456
本地訪問:http://127.0.0.1:7474/
命令
創建節點
//創建節點
CREATE (node:Label {property: value})
eg:
CREATE (us:country {name: "美國"});
CREATE (ch:country {name: "中國"});
CREATE (sichuan:area {name: "四川省"});
CREATE (jiangsu:area {name: "江蘇省"});
CREATE (henan:area {name: "河南省"});
CREATE (hubei:area {name: "湖北省"});
CREATE (shanghai:city {name: "上海市"});
CREATE (beijing:city {name: "北京市"});
a:Person :標簽-->a屬于Person標簽
b:Person :標簽-->b屬于Person標簽
//創建帶有多個標簽和屬性的節點
CREATE (node:Label1:Label2 {property1: value1, property2: value2})
eg:
CREATE (a:Person:Person2 {name: "jeffTest",age:18});
CREATE (a:Person:Person2 {name: "jeffTest",age:18})
創建節點關系
//創建節點關系
MATCH (node1:Label1),(node2:Label2)
CREATE (node1)-[:RELATIONSHIP_TYPE]->(node2)
eg:
//北京市屬于中國關系
MATCH (n:city {name: "北京市"})
MATCH (ch:country {name: "中國"})
CREATE (n)-[:屬于]->(ch);
//上海市屬于中國關系
MATCH (n:city {name: "上海市"})
MATCH (ch:country {name: "中國"})
CREATE (n)-[:屬于]->(ch);
//帶有area標簽的全部屬于ch:country標簽
MATCH (n:area)
MATCH (ch:country {name: "中國"})
CREATE (n)-[:屬于]->(ch)
創建節點并建立關系
//創建節點并建立關系
CREATE (bazhong:city {name: "巴中市"})
MATCH (n:city {name: "巴中市"}),(ch:country {name: "中國"})
CREATE (n)-[:屬于]->(ch)
//創建節點并建立關系
CREATE (kunshan:city {name: "昆山市"});
MATCH (n:city {name: "昆山市"}),(k:area {name: "江蘇省"})
CREATE (n)-[:屬于]->(k)
更新節點和關系
//更新節點屬性
MATCH (n:city {name: "巴中市"})
SET n.peopNum = "200萬"
//更新關系屬性
MATCH (n:city {name: "巴中市"})-[r:屬于]->(k:city {name: "上海市"})
MATCH (y:area {name: "四川省"})
DELETE r
CREATE (n)-[:屬于]->(y)
查詢節點和關系
//查詢所有節點和關系
MATCH (node)
RETURN node
//查詢滿足條件的節點
MATCH (node:city)
WHERE node.name = "北京市"
RETURN node
//查詢節點關系
MATCH (node1)-[relationship:屬于]->(node2)
RETURN node1, relationship, node2
//查詢滿足條件的節點關系
MATCH (n:city)-[:屬于]->(k:area)-[:屬于]->(j:country)
WHERE n.name = "安陽市"
RETURN n, k,j
//查詢滿足條件的節點關系2
MATCH (n:city {name:"安陽市"})-[:屬于]->(k:area)-[:屬于]->(j:country)
RETURN n, k,j
刪除節點及關系
//刪除節點及關機
MATCH (n:city {name: "巴中市"})
OPTIONAL MATCH (ch:country {name: "中國"})-[relationship]-()
DELETE n, relationship
//刪除節點關系
MATCH (n:city {name: "巴中市"})-[relationship]-()
DELETE relationship
//刪除節點
MATCH (n:city {name: "新鄉市"})
DELETE n
//刪除所有節點關系
MATCH ()-[r]-() DELETE r // 匹配所有節點之間的關系
//刪除所有節點
MATCH (n) DELETE n
golang執行cypher命令--創建節點
package main
import (
"fmt"
"github.com/neo4j/neo4j-go-driver/v4/neo4j"
)
func main() {
config := func(conf *neo4j.Config) {
//conf.Encrypted = false // 啟用 TLS
//conf.TLSCertFile = "/path/to/certificate.crt" // 設置 TLS 證書文件路徑
//conf.TLSKeyFile = "/path/to/private.key" // 設置 TLS 私鑰文件路徑
//conf.TLSCAFile = "/path/to/ca.crt" // 設置 TLS CA 證書文件路徑
}
// 創建驅動程序
driver, err := neo4j.NewDriver("bolt://localhost:7687", neo4j.BasicAuth("neo4j", "123456", ""), config)
if err != nil {
// 處理錯誤
}
defer driver.Close()
session := driver.NewSession(neo4j.SessionConfig{})
defer session.Close()
//命令
cyhperStr := `
MATCH (n:city {name: "巴中市"})-[r:屬于]->(sichuan:area {name: "四川省"})
MATCH (shanghai:city {name: "上海市"})
DELETE r
CREATE (n)-[:屬于]->(shanghai)
`
result, err := session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) {
result, err := tx.Run(cyhperStr, nil)
if err != nil {
return nil, err
}
return result, nil
})
if err != nil {
// 處理錯誤
fmt.Println("err:", err)
return
}
fmt.Println(result)
}
golang執行cypher命令2--創建節點+建立關系
package main
import (
"fmt"
"github.com/neo4j/neo4j-go-driver/v4/neo4j"
)
func main() {
config := func(conf *neo4j.Config) {
//conf.Encrypted = false // 啟用 TLS
//conf.TLSCertFile = "/path/to/certificate.crt" // 設置 TLS 證書文件路徑
//conf.TLSKeyFile = "/path/to/private.key" // 設置 TLS 私鑰文件路徑
//conf.TLSCAFile = "/path/to/ca.crt" // 設置 TLS CA 證書文件路徑
}
// 創建驅動程序
driver, err := neo4j.NewDriver("bolt://localhost:7687", neo4j.BasicAuth("neo4j", "123456", ""), config)
if err != nil {
// 處理錯誤
}
defer driver.Close()
session := driver.NewSession(neo4j.SessionConfig{})
defer session.Close()
cyhperStr := `CREATE (n:city {name: $name})` //創建節點
//建立關系
cyhperStr2 := `MATCH (n:city {name: $name}),(k:area {name: "河南省"})
CREATE (n)-[:屬于]->(k)`
nameList := []string{"鄭州市", "洛陽市", "開封市", "新鄉市", "平頂山市", "焦作市", "安陽市", "鶴壁市", "漯河市", "南陽市", "信陽市", "周口市", "商丘市", "許昌市", "三門峽市", "駐馬店市", "濮陽市"}
for _, name := range nameList {
//創建節點
_, err := session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) {
result, err := tx.Run(cyhperStr, map[string]interface{}{
"name": name,
})
if err != nil {
return nil, err
}
return result, nil
})
if err != nil {
// 處理錯誤
fmt.Println("err:", err)
return
}
//建立關系
_, err = session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) {
result, err := tx.Run(cyhperStr2, map[string]interface{}{
"name": name,
})
if err != nil {
return nil, err
}
return result, nil
})
if err != nil {
// 處理錯誤
fmt.Println("err:", err)
return
}
}
}
總結
- 上一篇: 阿里面试:看过框架源码吗?举例说明一下
- 下一篇: 文心一言 VS 讯飞星火 VS chat