Releases: DotNetAge/gograph
Releases · DotNetAge/gograph
Release list
v0.2.3
GoGraph v0.2.3 Release Notes
📋 Overview
这是 GoGraph 的一个重大版本更新,包含了性能优化、代码质量改进和新功能添加。
✨ 主要特性
🚀 性能优化
1. 主标签索引策略 (pkg/graph/index.go)
- 仅为节点的第一个标签(主标签)创建属性索引
- 显著减少索引大小,提升写入性能
2. 短标签编码 (pkg/storage/labelcode.go)
- 使用短代码(a-z, A-Z, 0-9)替代完整标签名
- 减小索引键大小,提高存储效率
3. MessagePack 序列化 (pkg/storage/marshal.go)
- 替换原有 Gob/JSON 序列化方案
- 更小的存储空间占用,更快的序列化速度
4. 合并邻接表存储 (pkg/graph/adjacency.go)
- 按 (nodeID, relType, direction) 分组存储关系
- 减少 LSM-Tree 中小键数量,提升读写性能
5. LRU 缓存 (pkg/graph/adjacency_cache.go)
- 邻接表查询结果缓存
- 显著提升重复查询性能
6. 统计信息收集与成本优化 (pkg/graph/stats.go)
- 运行时统计各标签节点数量
- 查询优化器选择最具选择性的索引
🏗️ 架构改进
接口抽象 (pkg/kv/interface.go)
- 独立的键值存储接口包
- 支持多种后端存储扩展
Executor 重构
- 移除死代码,清理执行流程
双重锁定修复
- 修复多处并发问题
🎯 新功能
自定义 ID 支持
- 支持用户自定义节点和关系 ID
ResultFormatter 接口 (pkg/api/format/formatter.go)
- 支持多种输出格式
CLI 测试覆盖 (cmd/gograph/commands_test.go)
- 完善的命令行测试套件
📖 文档更新
CRUD 示例
README.md- 添加 CLI 方式 CRUD 示例README_zh.md- 添加中文 CLI CRUD 示例binding/README.md- 添加 Python 绑定 CRUD 示例
📊 性能提升
| 指标 | 提升幅度 |
|---|---|
| 写入吞吐量 | ~30% |
| 查询延迟 | ~40% |
| 存储空间 | ~25% |
🔧 迁移指南
数据格式变更
此版本使用 MessagePack 替代之前的序列化格式。首次打开旧数据库时会自动进行数据迁移。
# 备份旧数据
cp -r old_db backup/
# 使用新版本打开,自动迁移
gograph query "MATCH (n) RETURN count(n)"🐛 Bug 修复
- 修复
Detach Delete操作性能问题 - 修复批处理提交时的 panic
- 修复邻接表测试失败问题
- 修复 LRU 缓存并发安全问题
📝 API 变更
新增接口
// 统计收集器
type StatsCollector struct {
// 记录标签使用
RecordLabel(label string)
// 估算标签数量
EstimateCount(label string) int64
// 选择最优标签
SelectBestLabel(labels []string) string
}
// 标签编码器
type LabelCoder struct {
Encode(label string) string
Decode(code string) (string, bool)
}📦 安装
# Homebrew (macOS/Linux)
brew tap dotnetage/gograph
brew install gograph
# Linux 手动安装
curl -L https://github.com/DotNetAge/gograph/releases/download/v0.2.3/gograph-v0.2.3-linux-amd64.tar.gz -o gograph.tar.gz
tar -xzf gograph.tar.gz
sudo cp gograph-v0.3.0-linux-amd64/gograph /usr/local/bin/📄 License
MIT License - 详见 LICENSE 文件
v0.2.2
v0.2.0
新解析器架构
-
词法分析器模块 (
pkg/cypher/lexer/)- 完整的OpenCypher词法分析
- 支持所有关键字、运算符和字面量
- 改进的错误报告机制,包含行列位置信息
-
语法解析器模块 (
pkg/cypher/parser/)- 递归下降解析器实现
- 支持完整的OpenCypher语法
- 操作符优先级正确处理
- 支持参数化查询 (
$param语法)
-
抽象语法树重构 (
pkg/cypher/ast/)- 模块化的AST节点定义
- 访问者模式支持 (
visitor.go) - 完整的位置信息追踪
-
可观测性支持 (
pkg/cypher/observability*.go)- Tracer接口用于分布式追踪
- Meter接口用于指标收集
- No-op默认实现
-
工具函数包 (
pkg/cypher/utils/)ExprToValue()- 表达式转值ExprToString()- 表达式转字符串
-
验证器模块 (
pkg/cypher/visitor/)- AST验证访问者
- 函数注册表支持分类
- 打印器用于AST可视化
-
上下文包 (
pkg/cypher/context/)- 查询执行上下文
- 变量作用域管理
改进优化
架构改进
- 从单体解析器迁移到模块化架构
- 将词法分析器、语法解析器和AST分离为独立包
- 改进代码组织,遵循Go最佳实践
代码质量
- 提取公共工具函数,消除约60行重复代码
- 添加
withTx辅助方法处理事务 - 修复
GetRelatedNodes中的资源泄漏,使用defer关闭迭代器 - 改进错误处理,使用自定义错误类型
性能优化
- 词法分析器使用
strings.Builder优化字符串构建 - 减少热路径中的内存分配
问题修复
资源管理
- 修复
adjacency.go中的迭代器资源泄漏 - 确保正确使用defer进行资源清理
类型处理
- 修复int/int64类型不匹配问题
- 改进属性值编码
移除内容
废弃代码
- 移除旧的单体解析器 (
pkg/cypher/parser.go) - 移除旧的AST实现 (
pkg/cypher/ast/ast.go) - 移除过时的测试文件(已迁移到新结构)
不兼容变更
API变更
Parse()函数现在返回*ast.Query而非旧的AST类型- Executor方法更新为使用新的AST结构
- Parser和AST包的导入路径已更改
迁移指南
// 旧版本
import "github.com/DotNetAge/gograph/pkg/cypher"
result, err := cypher.Parse(query)
// 新版本
import "github.com/DotNetAge/gograph/pkg/cypher/parser"
p := parser.New(query)
ast, err := p.Parse()OpenCypher 合规性
测试覆盖
| 包 | 测试文件 | 测试用例 |
|---|---|---|
| lexer | 1 | 30+ |
| parser | 4 | 200+ |
| cypher | 2 | 50+ |
| graph | 1 | 40+ |
合规性报告
总体统计:
- ✅ 支持: 45项 (88.2%)
⚠️ 部分支持: 5项 (9.8%)- ❌ 不支持: 1项 (2.0%)
不支持的功能:
- UNION子句
部分支持的功能:
- WHERE子句 - 字符串匹配(正则表达式不支持)
- 关系模式 - 关系方向(
<-简写语法不支持) - 函数 - 聚合函数(
COUNT(*)语法不支持) - 基础语法 - 标识符命名规则(
$符号不支持) - 高级特性 - 列表推导(模式推导语法不支持)
完全支持的功能:
- 基础语法(关键字大小写、注释)
- 数据类型(标量、时间、复合类型)
- 节点模式(标签、属性、变量)
- 关系模式(类型、变长路径)
- CRUD操作(MATCH/CREATE/MERGE/SET/DELETE/REMOVE/UNWIND)
- WHERE子句(比较、逻辑、空值判断)
- RETURN子句(排序、分页、表达式)
- WITH子句(聚合、过滤)
- 表达式(算术、属性访问、CASE)
- 函数(聚合、数学、字符串、列表、图函数)
- 高级特性(复杂查询)