该笔记为对 NebulaGraph 技术社区的《基于 Gemini 和 NebulaGraph 构建知识图谱问答系统》以及同门笔记的学习与复现
LLM 在属性图中的应用
属性图与 LLM 的协作具体方式:
- 数据增强
- LLM 可用于生成属性图中点和边的文本描述,不仅可以丰富数据内容,还能帮助其他工具或用户更加容易地理解各项关系
- LLM 可以基于图中已有的数据生成新的点和边,这对于进行异常检测或预测欺诈行为等任务非常有用
- 查询与探索
- LLM 可以用来创建查询属性图的自然语言接口,允许用户以比传统的图查询语言更为直观的方式(例如自然语言)对数据进行提问
- LLM 也能够汇总图查询结果,并为这些发现生成解释
- 推理和推断
- LLM 可以用于执行属性图上的推理任务,这可能包括基于现有数据推断节点间新的关系,或识别图中存在的不一致
NebulaGraph
一个可靠的分布式、线性扩容、性能高效的图数据库,擅长处理千亿节点万亿条边的超大数据集
服务架构
NebulaGraph 由三种服务构成,是一种存储与计算分离的架构
- Meta Service : 由 nebula-metad 进程提供,负责数据管理,包括:
- 管理用户账号
- 管理分片
- 管理图空间
- 管理 Schema 信息
- 管理 TTL 信息
- 管理作业
- Graph Service : 由 nebula-graphd 进程提供,负责处理查询请求,包括:
- 解析查询语句
- 校验语句
- 生成执行计划
- 按照执行计划执行
- Storage Service : 由 nebula-storaged 进程提供,负责存储数据
使用 Docker 构建 NebulaGraph 时,可以通过 nebula-console 连接到 NebulaGraph 服务
1 | docker exec -it nebula-docker-compose-console-1 /bin/sh |
数据模型
NebulaGraph 数据模型使用 6 种基本的数据模型:
- 图空间(Space) : 隔离不同项目数据
- 点(Vertex) : 保存实体对象
- 点标识符(VID) : VID在同一图空间中唯一
- 标签(TAG) : 由一组预定义的属性构成
- 点必须有0到多个 Tag
- 边(Edge) : 表示两点之间的关系或行为。两点之间可以有多条边,且边有方向。四元组
<起点 VID、Edge type、边排序值 (rank)、终点 VID>
用于唯一标识一条边- 边类型(Edge type) : 由一组预定义的属性构成
- 一条边有且仅有一个 Edge type
- 边排序值(Rank) : 可以用来区分 Edge type、起始点、目的点都相同的边,该值完全由用户自己指定
- 一条边有且仅有一个 Rank,类型为 int64,默认值为 0
- 边类型(Edge type) : 由一组预定义的属性构成
- 属性(Property) : 属性是指以键值对(Key-value pair)形式表示的信息
nGQL 查询语言
创建和选择图空间
- 创建图空间
1
2
3
4
5CREATE SPACE <space_name> (
[partition_num = <partition_number>,] # 选择分区数量
[replica_factor = <replica_number>,]
vid_type = {FIXED_STRING(<N>) | INT64}
); - 列出创建的图空间
1
SHOW SPACES
- 选择图空间
1
USE <space_name>
创建 Tag 和 Edge type
1 | CREATE TAG player(name string, age int); |
插入数据
- 插入点
1
INSERT VERTEX player(name, age) VALUES "player100":("Tim Duncan", 42);
- 插入边
1
INSERT EDGE follow(degree) VALUES "player102" -> "player100":(75);
查询数据
- GO 语句
- FETCH 语句
- LOOKUP 语句
- MATCH 语句
问答系统实现
待续。。。
参考
[1]. 基于 Gemini 和 NebulaGraph 构建知识图谱问答系统
[3]. nGQL 指南