SQL Server RAG 笔记1:图数据库构建 在AI开发中知识图谱是非常火的一个领域而提到图数据库大家都会第一时间想到Neo4J其实在SQLServer中早已有支持此篇将简单演示如何在SQLServer下构建图数据库实现知识图谱的管理。最终我们将搭建出一个如下的简单知识图谱页面SQL Server 图数据库搭建数据库创建与配置开始之前需要确定SQLServer安装的版本是2017之后的版本。-- 创建支持中文的图数据库 CREATE DATABASE GraphDB COLLATE Chinese_PRC_CI_AS; GO USE GraphDB; GO库的创建跟创建常规数据库的方法一致。图数据库核心表结构在SQLServer中跟Neo4J一样基本物件都是NODE和EDGE在SQLServer中的创建方法如下节点表 (Nodes)-- 使用 AS NODE 创建原生图节点表 CREATE TABLE Nodes ( NodeType NVARCHAR(100) NOT NULL, Name NVARCHAR(255) NOT NULL, Properties NVARCHAR(MAX) DEFAULT {}, CreatedAt DATETIME2 DEFAULT GETDATE(), UpdatedAt DATETIME2 DEFAULT GETDATE(), IsDeleted BIT DEFAULT 0 ) AS NODE; -- 创建索引 CREATE INDEX IX_Nodes_NodeType ON Nodes(NodeType); CREATE INDEX IX_Nodes_Name ON Nodes(Name);知识点笔记AS NODE将表声明为图节点表SQL Server 自动添加$node_id列$node_id系统生成的唯一标识格式为 JSON如{type:node,schema:dbo,table:Nodes,id:0}自定义列NodeType、Name、Properties等业务字段无需手动定义主键SQL Server 自动管理节点 ID边表 (Edges)-- 使用 AS EDGE 创建原生图边表 CREATE TABLE Edges ( EdgeType NVARCHAR(100) NOT NULL, Properties NVARCHAR(MAX) DEFAULT {}, Weight FLOAT DEFAULT 1.0, CreatedAt DATETIME2 DEFAULT GETDATE(), UpdatedAt DATETIME2 DEFAULT GETDATE(), IsDeleted BIT DEFAULT 0 ) AS EDGE; -- 创建索引 CREATE INDEX IX_Edges_EdgeType ON Edges(EdgeType);知识点笔记AS EDGE将表声明为图边表SQL Server 自动添加$edge_id、$from_id、$to_id列$edge_id边的唯一标识JSON 格式$from_id起始节点的$node_id$to_id目标节点的$node_id方向性边是有向的$from_id指向$to_id无需外键约束原生图自动维护引用完整性创建节点和关系跟Neo4J的Cypher语句差别很大这里需要留意。测试数据生成插入节点数据-- 人物节点 INSERT INTO Nodes (NodeType, Name, Properties) VALUES (Person, 张三, {age: 35, occupation: 工程师, city: 北京}), (Person, 李四, {age: 42, occupation: CEO, city: 深圳}), (Person, 王五, {age: 28, occupation: 产品经理, city: 杭州}); -- 公司节点 INSERT INTO Nodes (NodeType, Name, Properties) VALUES (Company, 腾讯科技, {founded_year: 1998, industry: 互联网}), (Company, 阿里巴巴, {founded_year: 1999, industry: 电子商务}), (Company, 字节跳动, {founded_year: 2012, industry: 科技});插入边关系数据 - 使用原生图语法-- 工作关系使用 $from_id 和 $to_id 插入边 INSERT INTO Edges ($from_id, $to_id, EdgeType, Properties) SELECT n1.$node_id, n2.$node_id, WORKS_AT, {department: 技术部, start_year: 2020} FROM Nodes n1, Nodes n2 WHERE n1.Name 张三 AND n2.Name 腾讯科技; INSERT INTO Edges ($from_id, $to_id, EdgeType, Properties) SELECT n1.$node_id, n2.$node_id, FOUNDED, {role: 创始人} FROM Nodes n1, Nodes n2 WHERE n1.Name 李四 AND n2.Name 阿里巴巴;知识点笔记使用$from_id和$to_id指定边的起始和目标节点通过子查询从已有节点获取$node_id边类型命名采用大写蛇形命名法保持一致性JSON 属性字段支持灵活扩展复杂关系网络构建-- 产品节点 INSERT INTO Nodes (NodeType, Name, Properties) VALUES (Product, 微信, {launch_year: 2011, category: 社交}), (Product, 淘宝, {launch_year: 2003, category: 电商}); -- 产品归属关系 INSERT INTO Edges ($from_id, $to_id, EdgeType, Properties) SELECT n1.$node_id, n2.$node_id, PRODUCES, {} FROM Nodes n1, Nodes n2 WHERE n1.Name 腾讯科技 AND n2.Name 微信; INSERT INTO Edges ($from_id, $to_id, EdgeType, Properties) SELECT n1.$node_id, n2.$node_id, PRODUCES, {} FROM Nodes n1, Nodes n2 WHERE n1.Name 阿里巴巴 AND n2.Name 淘宝;图数据库查询实战查询节点及其邻居 - MATCH 语法-- 使用 MATCH 语法查询张三的直接关系 SELECT n1.Name AS source_name, e.EdgeType, n2.Name AS target_name FROM Nodes n1, Edges e, Nodes n2 WHERE MATCH(n1-(e)-n2) AND n1.Name 张三;知识点笔记MATCH语法SQL Server 原生图查询语法n1-(e)-n2表示从 n1 通过边 e 指向 n2方向性-表示有向边从 n1 到 n2无需 JOIN 关键字路径关系在 MATCH 中声明多跳路径查询-- 查询张三所属公司的产品两跳查询 SELECT n1.Name AS person_name, n2.Name AS company_name, n3.Name AS product_name FROM Nodes n1, Edges e1, Nodes n2, Edges e2, Nodes n3 WHERE MATCH(n1-(e1)-n2-(e2)-n3) AND n1.Name 张三 AND e1.EdgeType WORKS_AT AND e2.EdgeType PRODUCES;知识点笔记MATCH支持多跳路径n1-(e1)-n2-(e2)-n3在一条 MATCH 中声明完整的路径模式边类型过滤e1.EdgeType WORKS_AT支持任意深度的路径查询查询边的方向信息-- 查询边的方向入向/出向 SELECT n.Name AS node_name, e.EdgeType, CASE WHEN e.$from_id n.$node_id THEN outgoing ELSE incoming END AS direction FROM Nodes n, Edges e, Nodes n2 WHERE MATCH(n-(e)-n2) AND (n.Name 张三 OR n2.Name 张三);运行测试查询会发现SQLServer在SSMS里目前还并不像Neo4J自带的browser一样可以直接把知识图谱展现出来目前能显示的只是常规表格数据。想要看到知识图谱效果后续需要自己搭建对应的前端应用。