这是一个go语言编写的操作nebula图数据库的orm框架

简介

这是一个操作nebula图数据库的orm框架。
GitHub

示例

请优先参考examples示例: 配置nabula图数据库连接后可立即运行测试, 帮助你更快了解orm的使用

# 部分日志仅供参考

2024/06/14 10:38:29 [INFO] insert vertex test_vertex(chain_key,parent_key) values '根节点':('根节点','无')
2024/06/14 10:38:29 [INFO] insert edge test_edge(test) values '根节点' -> '根节点的第一个子节点':('根节点的第一个子节点')
2024/06/14 10:38:29 [INFO] delete vertex '测试删除根节点的第四个节点' with edge
2024/06/14 10:38:29 [INFO] delete edge test_edge '测试删除根节点' -> '测试删除根节点的第一个节点'
2024/06/14 10:38:29 [INFO] update edge on test_edge '测试删除根节点' -> '测试删除根节点的第一个节点' set test = 'O(∩_∩)O' when test == '测试删除根节点的第一个节点' yield test as test
将边[测试删除根节点] -> [测试删除根节点的第一个节点]的test字段更新为[O(∩_∩)O]:
[
  {
    "test": "O(∩_∩)O"
  }
]
2024/06/14 10:38:29 [INFO] match(v:test_vertex) where id(v)=='根节点' return v.test_vertex.chain_key as chain_key,v.test_vertex.parent_key as parent_key
查询点[根节点]:
[
  {
    "chain_key": "根节点",
    "parent_key": "无"    
  }                       
]

连接

package main
import (
	nebula_orm_go "nebula-orm-go"
	"nebula-orm-go/config"
	"nebula-orm-go/examples/inserts"
	"nebula-orm-go/examples/models"
	"nebula-orm-go/examples/sql"
	"nebula-orm-go/model"
	"nebula-orm-go/orm"
	"nebula-orm-go/dialectors"
)

// 测试方法入口
//
// @Author: 罗德
// @Date: 2024/6/11
func main() {
	address := fmt.Sprintf("%s:%d", "192.168.1.13", 9669)
	dialer := dialectors.MustNewNebulaDialer(config.DialerConfig{
		Addresses:       []string{address},   // Nebula服务地址列表
		Space:           sql.NebulaSpaceName, // 目标空间
		Username:        "root",              // 用户名
		Password:        "123456",            // 密码
		MaxConnPoolSize: 10,                  // 连接池大小
		InitSql:         sql.NebulaInitSql,   // 初始化sql(立刻尝试使用刚创建的空间、点、边可能会失败,因为创建是异步实现的)
	})

	db := nebula_orm_go.MustOpen(dialer, config.Config{})
	defer db.Close()

	// 立刻尝试使用刚创建的空间、点、边可能会失败,因为创建是异步实现的, 你可能需要重新启动此main程序
	//time.Sleep(10 * time.Second)
}

创建空间、点、边结构

create space if not exists space_luode(vid_type=fixed_string(64));

use space_luode;

create tag if not exists test_vertex(
    chain_key string,
    parent_key string
);

create edge if not exists test_edge(test string);

创建实体

:

package models

import (
	"nebula-orm-go/examples/sql"
	"nebula-orm-go/model"
)

// 确保满足IVertex定义的所有要求
//
// @Author: 罗德
// @Date: 2024/5/27
var _ model.IVertex = new(SdkVertex)

// SdkVertex 点结构体
//
// @Author: 罗德
// @Date: 2024/5/27
type SdkVertex struct {
	model.VModel
	ChainKey  string `json:"chain_key" nebula:"chain_key"`
	ParentKey string `json:"parent_key" nebula:"parent_key"`
}

// TagName 点名称, 必须实现
//
// @Author: 罗德
// @Date: 2024/5/27
func (v SdkVertex) TagName() string {
	return sql.NebulaVertexName
}

:

package models

import (
	"nebula-orm-go/examples/sql"
	"nebula-orm-go/model"
)

// 确保满足IEdge定义的所有要求
//
// @Author: 罗德
// @Date: 2024/5/27
var _ model.IEdge = new(SdkEdge)

// SdkEdge 边结构体
//
// @Author: 罗德
// @Date: 2024/5/27
type SdkEdge struct {
	model.EModel
	Test string `json:"test" nebula:"test"`
}

// EdgeName 边名称, 必须实现
//
// @Author: 罗德
// @Date: 2024/5/27
func (v SdkEdge) EdgeName() string {
	return sql.NebulaEdgeName
}

新增点

	sdkVertex := models.SdkVertex{
		VModel: model.VModel{
			Vid: "根节点",
		},
		ChainKey:  "根节点",
		ParentKey: "无",
	}

	// 执行插入
	err := db.Debug().InsertVertex(sdkVertex)
	if err != nil {
		return err
	}

新增边

	sdkEdge := models.SdkEdge{
		EModel: model.EModel{
			Src: "根节点",
			Dst: "根节点的第一个子节点",
		},
		Test: "根节点的第一个子节点",
	}

	// 执行插入
	err := db.Debug().InsertEdge(sdkEdge)
	if err != nil {
		return err
	}

删除点

	// 删除一个点
	err = db.Debug().DeleteVertex(models.SdkVertex{
		VModel: model.VModel{
			Vid: "测试删除根节点的第四个节点",
		},
	})
	if err != nil {
		log.Panicf("异常 -> [%s]", err.Error())
	}

删除边

	// 删除一条边
	err = db.Debug().DeleteEdge(models.SdkEdge{
		EModel: model.EModel{
			Src: "测试删除根节点",
			Dst: "测试删除根节点的第一个节点",
		},
	})
	if err != nil {
		log.Panicf("异常 -> [%s]", err.Error())
	}

更新点

	result, err := db.Debug().UpdateVertex(models.SdkVertex{
		VModel: model.VModel{
			Vid: "根节点",
		},
	}, "parent_key = 'O(∩_∩)O'", "parent_key == '无'")
	if err != nil {
		log.Panicf("异常 -> [%s]", err.Error())
	}
	result.PrintResult("将点[根节点]的parent_key字段更新为[O(∩_∩)O]")

更新边

	result, err = db.Debug().UpdateEdge(models.SdkEdge{
		EModel: model.EModel{
			Src: "测试删除根节点",
			Dst: "测试删除根节点的第一个节点",
		},
	}, "test = 'O(∩_∩)O'", "test == '测试删除根节点的第一个节点'")
	if err != nil {
		log.Panicf("异常 -> [%s]", err.Error())
	}
	result.PrintResult("将边[测试删除根节点] -> [测试删除根节点的第一个节点]的test字段更新为[O(∩_∩)O]")

查询点

	// 查询点
	result, err := db.Debug().GetVertexByVid(models.SdkVertex{
		VModel: model.VModel{
			Vid: "根节点",
		},
	})
	if err != nil {
		log.Panicf("异常 -> [%s]", err.Error())
	}
	result.PrintResult("查询点[根节点]")

查询点上/下级

	// 查询点上+下级点
	// (包含原点 + 原点的下级, 原点的下级的下级 + 原点的上级, 原点的上级的上级)
	vertexs, err := db.Debug().GetBothVertexByVid(models.SdkVertex{
		VModel: model.VModel{
			Vid: "根节点的第一个子节点",
		},
	}, models.SdkEdge{}, 2)
	if err != nil {
		log.Panicf("异常 -> [%s]", err.Error())
	}
	fmt.Println("查询点[根节点的第一个子节点]的上+下级点:")
	for _, vertex := range vertexs {
		// 将 map 转换为 JSON 格式的字节切片
		jsonData, err := json.MarshalIndent(vertex, "", "  ")
		if err != nil {
			fmt.Println("转换为 JSON 格式时出错:", err)
			log.Panicf("异常 -> [%s]", err.Error())
		}
		// 将 JSON 格式的字节切片转换为字符串并打印
		fmt.Println(string(jsonData))
	}
	fmt.Println()

更多参考

-orm

3 个赞