SQL Server 图数据库学习笔记1:构建图数据库
SQL Server 图数据库学习笔记1构建图数据库摘要在AI开发中知识图谱是非常火的一个领域而提到图数据库大家都会第一时间想到Neo4J其实在SQLServer中早已有支持此篇将简单演示如何在SQLServer下构建图数据库实现知识图谱的管理。最终我们将搭建出一个如下的简单知识图谱页面SQL Server 图数据库搭建数据库创建与配置开始之前需要确定SQLServer安装的版本是2017之后的版本。-- 创建支持中文的图数据库CREATEDATABASEGraphDBCOLLATEChinese_PRC_CI_AS;GOUSEGraphDB;GO库的创建跟创建常规数据库的方法一致。图数据库核心表结构在SQLServer中跟Neo4J一样基本物件都是NODE和EDGE在SQLServer中的创建方法如下节点表 (Nodes)-- 使用 AS NODE 创建原生图节点表CREATETABLENodes(NodeType NVARCHAR(100)NOTNULL,Name NVARCHAR(255)NOTNULL,Properties NVARCHAR(MAX)DEFAULT{},CreatedAt DATETIME2DEFAULTGETDATE(),UpdatedAt DATETIME2DEFAULTGETDATE(),IsDeletedBITDEFAULT0)ASNODE;-- 创建索引CREATEINDEXIX_Nodes_NodeTypeONNodes(NodeType);CREATEINDEXIX_Nodes_NameONNodes(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 创建原生图边表CREATETABLEEdges(EdgeType NVARCHAR(100)NOTNULL,Properties NVARCHAR(MAX)DEFAULT{},WeightFLOATDEFAULT1.0,CreatedAt DATETIME2DEFAULTGETDATE(),UpdatedAt DATETIME2DEFAULTGETDATE(),IsDeletedBITDEFAULT0)ASEDGE;-- 创建索引CREATEINDEXIX_Edges_EdgeTypeONEdges(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语句差别很大这里需要留意。测试数据生成插入节点数据-- 人物节点INSERTINTONodes(NodeType,Name,Properties)VALUES(Person,张三,{age: 35, occupation: 工程师, city: 北京}),(Person,李四,{age: 42, occupation: CEO, city: 深圳}),(Person,王五,{age: 28, occupation: 产品经理, city: 杭州});-- 公司节点INSERTINTONodes(NodeType,Name,Properties)VALUES(Company,腾讯科技,{founded_year: 1998, industry: 互联网}),(Company,阿里巴巴,{founded_year: 1999, industry: 电子商务}),(Company,字节跳动,{founded_year: 2012, industry: 科技});插入边关系数据 - 使用原生图语法-- 工作关系使用 $from_id 和 $to_id 插入边INSERTINTOEdges($from_id,$to_id,EdgeType,Properties)SELECTn1.$node_id,n2.$node_id,WORKS_AT,{department: 技术部, start_year: 2020}FROMNodes n1,Nodes n2WHEREn1.Name张三ANDn2.Name腾讯科技;INSERTINTOEdges($from_id,$to_id,EdgeType,Properties)SELECTn1.$node_id,n2.$node_id,FOUNDED,{role: 创始人}FROMNodes n1,Nodes n2WHEREn1.Name李四ANDn2.Name阿里巴巴;知识点笔记使用$from_id和$to_id指定边的起始和目标节点通过子查询从已有节点获取$node_id边类型命名采用大写蛇形命名法保持一致性JSON 属性字段支持灵活扩展复杂关系网络构建-- 产品节点INSERTINTONodes(NodeType,Name,Properties)VALUES(Product,微信,{launch_year: 2011, category: 社交}),(Product,淘宝,{launch_year: 2003, category: 电商});-- 产品归属关系INSERTINTOEdges($from_id,$to_id,EdgeType,Properties)SELECTn1.$node_id,n2.$node_id,PRODUCES,{}FROMNodes n1,Nodes n2WHEREn1.Name腾讯科技ANDn2.Name微信;INSERTINTOEdges($from_id,$to_id,EdgeType,Properties)SELECTn1.$node_id,n2.$node_id,PRODUCES,{}FROMNodes n1,Nodes n2WHEREn1.Name阿里巴巴ANDn2.Name淘宝;图数据库查询实战查询节点及其邻居 - MATCH 语法-- 使用 MATCH 语法查询张三的直接关系SELECTn1.NameASsource_name,e.EdgeType,n2.NameAStarget_nameFROMNodes n1,Edges e,Nodes n2WHEREMATCH(n1-(e)-n2)ANDn1.Name张三;知识点笔记MATCH语法SQL Server 原生图查询语法n1-(e)-n2表示从 n1 通过边 e 指向 n2方向性-表示有向边从 n1 到 n2无需 JOIN 关键字路径关系在 MATCH 中声明多跳路径查询-- 查询张三所属公司的产品两跳查询SELECTn1.NameASperson_name,n2.NameAScompany_name,n3.NameASproduct_nameFROMNodes n1,Edges e1,Nodes n2,Edges e2,Nodes n3WHEREMATCH(n1-(e1)-n2-(e2)-n3)ANDn1.Name张三ANDe1.EdgeTypeWORKS_ATANDe2.EdgeTypePRODUCES;知识点笔记MATCH支持多跳路径n1-(e1)-n2-(e2)-n3在一条 MATCH 中声明完整的路径模式边类型过滤e1.EdgeType WORKS_AT支持任意深度的路径查询查询边的方向信息-- 查询边的方向入向/出向SELECTn.NameASnode_name,e.EdgeType,CASEWHENe.$from_idn.$node_idTHENoutgoingELSEincomingENDASdirectionFROMNodes n,Edges e,Nodes n2WHEREMATCH(n-(e)-n2)AND(n.Name张三ORn2.Name张三);运行测试查询会发现SQLServer在SSMS里目前还并不像Neo4J自带的browser一样可以直接把知识图谱展现出来目前能显示的只是常规表格数据。想要看到知识图谱效果后续需要自己搭建对应的前端应用。总结使用SQLServer创建图数据库是支持的如果已经熟悉了SQLServer那么学习的成本不会很高而且如果已经部署了SQLServer的话也不需要再去安装额外的东西。使用起来跟Neo4J的差异还是很大包括建库和插入数据。功能上虽还有差距但也基本可用。后续会继续介绍如何搭建前端应用让知识图谱显示在页面上。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2580779.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!