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
}
}
}