SQL Server 2017 图形表

 

SQL SERVER 2017 提供了图形数据库功能(实际是在表级别提供),图形数据库集成到关系型数据库中,便于关系型数据库使用SQL操作。图形数据库属于NOSQL类型,如Neo4j 等。

 

图形数据库是一个集合节点(或顶点) 和边缘 (或关系)。 节点表示实体 (例如,一个人或组织),边缘表示连接 (如组件或好友) 的两个节点之间的关系。 节点和边缘可能具有与之关联的属性。总的来说,图形数据库就是存储实体与关系的数据库。

 

基础概念:

节点表:存储一类节点信息(一般实体表),如“人员表”、“城市表”、“餐馆表”等

边缘表:关系表,存储节点之间的有向关系。

说到关系,我们一直都接触过。比如部门人员关系、物品层级分类等,都用到父级别,这是比较简单的关系模型。但以往我们用的这种关系,我们默认是知道父级别和子级别对应的字段,这样才能关联。因为只有实体,没有关系,当我们需要对关系标注一些额外信息时(如我们之间关系友好程度、权重等),就可能需要单独的一张关系表了。多麻烦,原本有id和父级id就体现关系了,现在又得多家一张表。查询的时候还要按顺序递归父节点。

 

节点表和边缘表都可以添加自己的属性(字段),创建节点表需指定“NODE”,创建边缘表需制定“EDGE”。节点表和边缘表都会添加隐藏的字段,如下图出属性之外的字段。

 

 

示例:

创建三个节点对象表: Person(人)、Restaurant(餐馆)、City(城市)

它们之前的边缘表(关系表):likes(人喜欢的城市、餐馆)、friendOf(人与人之间的好友关系)、livesIn(人生活在哪个城市)、locatedIn(餐馆位于哪个城市)

脚本如下:

-- 创建一个数据库
CREATE DATABASE graphdemo;
go
USE  graphdemo;
go

-- 创建节点表(声明为 NODE)
CREATE TABLE Person (
  ID INTEGER PRIMARY KEY, 
  name VARCHAR(100)
) AS NODE;
go
CREATE TABLE Restaurant (
  ID INTEGER NOT NULL, 
  name VARCHAR(100), 
  city VARCHAR(100)
) AS NODE;
go
CREATE TABLE City (
  ID INTEGER PRIMARY KEY, 
  name VARCHAR(100), 
  stateName VARCHAR(100)
) AS NODE;
go
-- 创建边缘表(声明为 EDGE)
CREATE TABLE likes (rating INTEGER) AS EDGE;
CREATE TABLE friendOf AS EDGE;
CREATE TABLE livesIn AS EDGE;
CREATE TABLE locatedIn AS EDGE;
go
-- 插入节点数据
INSERT INTO Person VALUES (1,'John');
INSERT INTO Person VALUES (2,'Mary');
INSERT INTO Person VALUES (3,'Alice');
INSERT INTO Person VALUES (4,'Jacob');
INSERT INTO Person VALUES (5,'Julie');
go
INSERT INTO Restaurant VALUES (1,'Taco Dell','Bellevue');
INSERT INTO Restaurant VALUES (2,'Ginger and Spice','Seattle');
INSERT INTO Restaurant VALUES (3,'Noodle Land', 'Redmond');
go
INSERT INTO City VALUES (1,'Bellevue','wa');
INSERT INTO City VALUES (2,'Seattle','wa');
INSERT INTO City VALUES (3,'Redmond','wa');
go
-- 插入边缘数据,需要节点提供 $node_id 和 $from_id 两个字段(属于隐藏字段)
INSERT INTO likes VALUES ((SELECT $node_id FROM Person WHERE id = 1), (SELECT $node_id FROM Restaurant WHERE id = 1),9);
INSERT INTO likes VALUES ((SELECT $node_id FROM Person WHERE id = 2), (SELECT $node_id FROM Restaurant WHERE id = 2),9);
INSERT INTO likes VALUES ((SELECT $node_id FROM Person WHERE id = 3), (SELECT $node_id FROM Restaurant WHERE id = 3),9);
INSERT INTO likes VALUES ((SELECT $node_id FROM Person WHERE id = 4), (SELECT $node_id FROM Restaurant WHERE id = 3),9);
INSERT INTO likes VALUES ((SELECT $node_id FROM Person WHERE id = 5), (SELECT $node_id FROM Restaurant WHERE id = 3),9);
go
INSERT INTO livesIn VALUES ((SELECT $node_id FROM Person WHERE id = 1),(SELECT $node_id FROM City WHERE id = 1));
INSERT INTO livesIn VALUES ((SELECT $node_id FROM Person WHERE id = 2),(SELECT $node_id FROM City WHERE id = 2));
INSERT INTO livesIn VALUES ((SELECT $node_id FROM Person WHERE id = 3),(SELECT $node_id FROM City WHERE id = 3));
INSERT INTO livesIn VALUES ((SELECT $node_id FROM Person WHERE id = 4),(SELECT $node_id FROM City WHERE id = 3));
INSERT INTO livesIn VALUES ((SELECT $node_id FROM Person WHERE id = 5),(SELECT $node_id FROM City WHERE id = 1));
go
INSERT INTO locatedIn VALUES ((SELECT $node_id FROM Restaurant WHERE id = 1),(SELECT $node_id FROM City WHERE id =1));
INSERT INTO locatedIn VALUES ((SELECT $node_id FROM Restaurant WHERE id = 2),(SELECT $node_id FROM City WHERE id =2));
INSERT INTO locatedIn VALUES ((SELECT $node_id FROM Restaurant WHERE id = 3),(SELECT $node_id FROM City WHERE id =3));
go
INSERT INTO friendof VALUES ((SELECT $NODE_ID FROM person WHERE ID = 1), (SELECT $NODE_ID FROM person WHERE ID = 2));
INSERT INTO friendof VALUES ((SELECT $NODE_ID FROM person WHERE ID = 2), (SELECT $NODE_ID FROM person WHERE ID = 3));
INSERT INTO friendof VALUES ((SELECT $NODE_ID FROM person WHERE ID = 3), (SELECT $NODE_ID FROM person WHERE ID = 1));
INSERT INTO friendof VALUES ((SELECT $NODE_ID FROM person WHERE ID = 4), (SELECT $NODE_ID FROM person WHERE ID = 2));
INSERT INTO friendof VALUES ((SELECT $NODE_ID FROM person WHERE ID = 5), (SELECT $NODE_ID FROM person WHERE ID = 4));
go


当查询关系的时候,需要新的条件关键字  MATCH (更多参考MATCH (Transact SQL)

-- 找到 John 喜欢的餐馆
SELECT Restaurant.name as Restaurant
FROM Person, likes, Restaurant
WHERE MATCH (Person-(likes)->Restaurant)
AND Person.name = 'John';
go
-- 找到 John 的朋友喜欢的餐馆
SELECT person1.name,person2.name as friend,Restaurant.name as Restaurant
FROM Person person1, Person person2, likes, friendOf, Restaurant
WHERE MATCH(person1-(friendOf)->person2-(likes)->Restaurant) 
AND person1.name='John';
go
--有哪些人生活与喜欢的餐馆在同一个城市
SELECT Person.name
FROM Person, likes, Restaurant, livesIn, City, locatedIn
WHERE MATCH (Person-(likes)->Restaurant-(locatedIn)->City AND Person-(livesIn)->City);
go


查询结果:

 

其他元素据查看:

--找出节点表和边缘表
select * from sys.tables where is_node =1
select * from sys.tables where is_edge =1
go
--查看节点表和边缘表的字段(有较多隐藏字段)
select [object_id],name,is_hidden,graph_type,graph_type_desc,*
from sys.columns where [object_id] = OBJECT_ID('Person')
go
select [object_id],name,is_hidden,graph_type,graph_type_desc
from sys.columns where [object_id] = OBJECT_ID('friendOf')
go


最后,删除测试数据:

USE graphdemo;
go
DROP TABLE IF EXISTS likes;
DROP TABLE IF EXISTS Person;
DROP TABLE IF EXISTS Restaurant;
DROP TABLE IF EXISTS City;
DROP TABLE IF EXISTS friendOf;
DROP TABLE IF EXISTS livesIn;
DROP TABLE IF EXISTS locatedIn;
go
USE master;
go
DROP DATABASE graphdemo;
go

注意:字段 $node_id、$edge_id、$from_id、$to_id 是不可更改的,若要更改,只能删除重新添加

 

 

参考:Graph processing with SQL Server and Azure SQL Database

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决方案。 作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL Server 2008技术内幕:T-SQL查询》内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读《Microsoft SQL Server 2008技术内幕:T-SQL查询》,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。 序言 I 致谢III 前言 V 第1章 逻辑查询处理1 1.1 逻辑查询处理的各个阶段2 1.1.1 逻辑查询处理阶段简介2 1.2 客户/订单场景下的查询示例4 1.3 逻辑查询处理阶段详解5 1.3.1 步骤1:FROM阶段5 1.3.2 步骤2:WHERE阶段9 1.3.3 步骤3:GROUP BY阶段10 1.3.4 步骤4:HAVING阶段11 1.3.5 步骤5:SELECT阶段12 1.3.6 步骤6:排序用的ORDER BY阶段13 1.4 逻辑查询处理的深入内容16 1.4.1 运算符16 1.4.2 OVER子句23 1.4.3 集合运算符25 1.5 总结26 第2章 集合论和谓词逻辑27 2.1 自然语言述到数学示的转换27 2.1.1 严格定义(well-Definedness)28 2.1.2 相等、恒等和同一性30 2.1.3 数学命名约定30 2.1.4 数字31 2.1.5 上下文32 2.1.6 函数、参数和变量33 2.1.7 指令和算法34 2.2 集合论34 2.2.1 集合的标记方法35 2.2.2 集合的严格定义36 2.2.3 论域36 2.2.4 真实性38 2.2.5 罗素悖论(Russell s Paradox)40 2.2.6 有序对、元组和笛卡尔积41 2.2.7 空集42 2.2.8 集合的特征函数43 2.2.9 集合的基数(Cardinality)43 2.2.10 顺序44 2.2.11 集合运算符47 2.2.12 集合论的推广50 2.3 谓词逻辑50 2.3.1 编程语言中的逻辑功能50 2.3.2 命题和谓词51 2.3.3 排中律53 2.3.4 与、或、非运算53 2.3.5 逻辑等价55 2.3.6 逻辑蕴含55 2.3.7 量化(Quantification)56 2.3.8 替代和推广58 2.4 关系59 2.4.1 自反性、对称性和传递性59 2.5 一个实际的应用60 2.6 总结63 第3章 关系模型65 3.1 关系模型简介65 3.1.1 关系、元组和类型65 3.1.2 关系模型:快速摘要70 3.2 关系代数和关系计算70 3.2.1 基本运算符71 3.2.2 关系代数71 3.2.3 Codd提出的8个原始关系运算符72 3.2.4 关系演算79 T-SQL支持80 3.3 数据完整性81 3.3.1 声明式约束82 3.3.2 实施完整性的其他方法84 3.4 数据库正规化和其他设计主题86 3.4.1 解决函数依赖的范式87 3.4.2 更高级的范式92 3.4.3 反规范化(Denormalization)95 3.4.4 一般化和特殊化96 3.5 总结98 第4章 查询优化99 4.1 本章用到的样本数据99 4.2 优化方法论102 4.2.1 分析实例级别的等待104 4.2.2 关联等待和队列111 4.2.3 确定行动方案112 4.2.4 细化到数据库/文件级别113 4.2.5 细化到进程级别115 4.2.6 优化索引和查询132 4.3 查询优化的工具133 4.3.1 查询执行计划的缓存133 4.3.2 清空缓存134 4.3.3 动态管理对象134 4.3.4 STATISTICS IO135 4.3.5 测量查询的运行时间135 4.3.6 分析执行计划136 4.3.7 图形化的执行计划136 4.3.8 提示(Hint)144 4.3.9 跟踪/Profiler145 4.3.10 数据库引擎优化顾问145 4.3.11 数据收集和管理数据仓库146 4.3.12 使用SMO来复制统计信息146 4.4 索引优化146 4.4.1 和索引的结构146 4.4.2 索引访问方法153 4.4.3 索引策略的分析191 4.4.4 碎片200 4.4.5 分区201 4.5 准备样本数据202 4.5.1 数据准备202 4.5.2 TABLESAMPLE206 4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习208 4.7 总结214 第5章 算法和复杂性215 5.1 你有一个1夸特的硬币吗?215 5.1.1 如何从零钱罐中取回1夸特钱216 5.1.2 有时零钱罐中没有1夸特的硬币216 5.2 如何度量算法(How Algorithms Scale)217 5.2.1 二次缩放(Quadratic Scaling)的一个例子217 5.2.2 具有线性复杂度的算法218 5.2.3 指数和超指数复杂度218 5.2.4 次线性(sublinear)复杂度219 5.2.5 常量复杂度219 5.2.6 复杂度的技术定义220 5.2.7 复杂度的比较221 5.3 经典算法和算法策略222 5.3.1 排序算法223 5.3.2 字符串查找225 5.4 一个实际的应用程序226 5.4.1 识别测量数据的趋势226 5.4.2 LISLP算法的复杂度226 5.4.3 用T-SQL解决最长上升子序列的长度问题227 5.5 总结229 第6章 子查询、达式和排名函数231 6.1 子查询232 6.1.1 独立子查询232 6.1.2 相关子查询235 6.1.3 行为不当的子查询244 6.1.4 不常用的谓词245 6.2 达式(Table Expressions)246 6.2.1 派生247 6.2.2 公用达式249 6.3 分析排名函数255 6.3.1 行号257 6.3.2 排名和密集排名(Dense Rank)271 6.3.3 组号(Tile Number)272 6.4 数字辅助276 6.5 缺失范围和现有范围(也称为间断和孤岛)279 6.5.1 缺失范围(间断)281 6.5.2 现有范围(孤岛)288 6.6 总结296 第7章 联接和集合运算297 7.1 联接297 7.1.1 旧语法和新语法297 7.1.2 基本联接类型298 7.1.3 其他的联接分类306 7.1.4 上一年度的滑动合计317 7.1.5 联接算法320 7.1.6 拆分元素326 7.2 集合运算332 7.2.1 UNION332 7.2.2 EXCEPT333 7.2.3 INTERSECT334 7.2.4 集合运算的优先级335 7.2.5 在集合运算中使用INTO336 7.2.6 避开不支持的逻辑阶段336 7.3 总结338 第8章 数据聚合和透视339 8.1 OVER 子句339 8.2 决胜属性(Tiebreaker)341 8.3 连续聚合343 8.3.1 累积聚合(Cumulative Aggregation)344 8.3.2 滑动聚合(Sliding Aggregation)348 8.3.3 年初至今(YTD)349 8.4 透视转换(Pivoting)350 8.4.1 透视转换属性350 8.4.2 关系除法353 8.4.3 聚合数据355 8.5 逆透视转换357 8.6 自定义聚合360 8.6.1 使用透视转换的自定义聚合361 8.6.2 用户定义聚合函数(UDA,User Defined Aggregate)362 8.6.3 专用解决方案370 8.7 直方图(Histogram)380 8.8 分组因子383 8.9 分组集385 8.9.1 样例数据386 8.9.2 GROUPING SETS从属子句387 8.9.3 CUBE从属子句389 8.9.4 ROLLUP从属子句390 8.9.5 分组集代数392 8.9.6 GROUPING_ID函数395 8.9.7 保存分组集397 8.9.8 排序399 8.10 总结400 第9章 TOP和APPLY401 9.1 SELECT TOP401 9.1.1 TOP和确定性402 9.1.2 TOP和输入达式403 9.1.3 TOP和修改404 9.1.4 增强的TOP406 9.2 APPLY407 9.3 使用TOP和APPLY解决常见问题408 9.3.1 每组中的TOP n408 9.3.2 匹配当前值和前一个值413 9.3.3 分页416 9.4 逻辑转换422 9.5 总结424 第10章 数据修改425 10.1 插入数据425 10.1.1 增强的VALUES子句425 10.1.2 SELECT INTO426 10.1.3 BULK行集提供程序428 10.1.4 按最小方式记录日志的操作430 10.1.5 INSERT EXEC447 10.1.6 序列机制450 10.2 删除数据454 10.2.1 TRUNCATE与DELETE454 10.2.2 删除包含重复数据的行455 10.2.3 基于联结的DELETE456 10.3 更新数据458 10.3.1 基于联结的UPDATE458 10.3.3 更新大值数据类型461 10.3.3 用SELECT和UPDATE语句进行赋值462 10.4 合并数据465 10.4.1 MERGE语句基础467 10.4.2 额外增加一个谓词470 10.4.3 多个WHEN子句471 10.4.4 WHEN NOT MATCHED BY SOURCE子句472 10.4.5 MERGE Values473 10.4.6 MERGE与触发器474 10.5 OUTPUT子句475 10.6 总结482 第11章 查询分区483 11.1 在SQL Server中进行分区483 11.1.1 分区视图483 11.1.2 分区484 11.2 总结496 第12章 图、树、层次结构和递归查询497 12.1 术语497 12.1.1 图497 12.1.2 树498 12.1.3 层次结构498 12.2 应用场景498 12.2.1 员工组织图499 12.2.2 材料清单(BOM)500 12.2.3 道路系统503 12.3 迭代/递归506 12.3.1 下属506 12.3.2 祖先514 12.3.3 带有路径枚举的子图/子树517 12.3.4 排序519 12.3.5 环521 12.4 具体化路径524 12.4.1 维护数据524 12.4.2 查询529 12.5 使用HIERARCHYID数据类型的具体化路径533 12.5.1 维护数据534 12.5.2 查询539 12.5.3 使用HIERARCHYID的其他方面542 12.6 嵌套集合550 12.6.1 分配左值和右值551 12.6.2 查询555 12.7 传递闭包(Transitive Closure)557 12.7.1 有向无环图557 12.7.2 无向有环图561 12.8 总结568

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值