neo4j圖資料庫

2023-11-09 18:00:21

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