Go 使用Neo4j v4.x

这篇博客介绍了如何在Go中连接和操作Neo4j数据库,包括创建Driver、关闭连接、执行Cypher语句进行节点和关系的读写。通过示例展示了查询和写入数据的过程,对于理解Go语言与图形数据库的交互具有指导意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里针对neo4j 4.x的版本

import (
	"log"
	"strconv"
	"testing"

	"github.com/neo4j/neo4j-go-driver/v4/neo4j"
)

var (
	neo4jURL = "bolt://${ip}:7687"
)

func CreateDriver(uri, username, password string) (neo4j.Driver, error) {
	return neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ""))
}

func CloseDriver(driver neo4j.Driver) error {
	return driver.Close()
}

func CypherWrite(driver neo4j.Driver, Cypher string, DB string) error {

	session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite})
	defer session.Close()

	_, err := session.WriteTransaction(func(tx neo4j.Transaction) (interface{}, error) {
		result, err := tx.Run(Cypher, nil)
		if err != nil {
			log.Println("wirte to DB with error:", err)
			return nil, err
		}
		return result.Consume()
	})

	return err
}

func NodeQuery(driver neo4j.Driver, Cypher string, DB string) ([]neo4j.Node, error) {

	var list []neo4j.Node
	session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeRead})
	defer session.Close()
	_, err := session.ReadTransaction(func(tx neo4j.Transaction) (interface{}, error) {
		result, err := tx.Run(Cypher, nil)
		if err != nil {
			return nil, err
		}

		for result.Next() {
			record := result.Record()
			if value, ok := record.Get("p"); ok {
				node := value.(neo4j.Node)
				list = append(list, node)
			}
		}
		if err = result.Err(); err != nil {
			return nil, err
		}

		return list, result.Err()
	})

	if err != nil {
		log.Println("Read error:", err)
	}
	return list, err
}

func RelationshipQuery(driver neo4j.Driver, Cypher string, DB string) ([]neo4j.Relationship, error) {

	var list []neo4j.Relationship
	session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeRead})
	defer session.Close()
	_, err := session.ReadTransaction(func(tx neo4j.Transaction) (interface{}, error) {
		result, err := tx.Run(Cypher, nil)
		if err != nil {
			log.Println("RelationshipQuery failed: ", err)
			return nil, err
		}
		for result.Next() {
			record := result.Record()
			if value, ok := record.Get("r"); ok {
				relationship := value.(neo4j.Relationship)
				list = append(list, relationship)
			}
		}
		if err = result.Err(); err != nil {
			return nil, err
		}
		return list, result.Err()
	})

	if err != nil {
		log.Println("Read error:", err)
	}
	return list, err
}

type Node struct {
	NodeId   string `json:"id"`
	ObjId    string `json:"objId" `
	NodeName string `json:"node_name" `
	Desc     string `json:"desc"`
}

type Relation struct {
	RelationId   string `json:"id" `
	RelationName string `json:"relation_name" `
	StartId      string `json:"source" `
	EndId        string `json:"target" `
}

type NodeData struct {
	Data Node `json:"data" form:"data"`
}
type RelationData struct {
	Data Relation `json:"data" form:"data"`
}

// Neo4j-测试获取结果集
func TestGetNode(t *testing.T) {
	nodes := make([]NodeData, 0)
	driver, err := CreateDriver(neo4jURL, "neo4j", "123456")
	defer func(driver neo4j.Driver) {
		err = CloseDriver(driver)
		if err != nil {
			log.Println("neo4j close error:", err)
		}
	}(driver)
	if err != nil {
		log.Println("error connecting to neo4j:", err)
	}

	data, err := NodeQuery(driver, "match (p:Person)-[:LOVES]->(d:Dog) return p,d", "")

	for i := 0; i < len(data); i++ {
		var node NodeData
		node.Data.NodeId = strconv.FormatInt(data[i].Id, 10)
		node.Data.NodeName = data[i].Props["name"].(string)
		node.Data.Desc = data[i].Props["desc"].(string)
		nodes = append(nodes, node)
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值