在今天的文章中,我们将研究 SQL Server 图形数据库。
我将在文章中尝试解释 Graph 数据库功能,这些功能提供复杂的分层关系管理,它开始与 SQL Server 2017 一起使用。
可以说,图形数据库对于显示我们在使用关系数据库系统和 NoSQL 数据库时遇到的复杂分层数据至关重要,以消除诸如关系级别数量和数据库大小等性能问题。
我们可以在哪里使用图形数据库?
社交网络
欺诈识别
产品推荐
IT网络分析
社会推荐
等等
图形数据库由两个元素组成。
节点:表示图形数据库中的实体。客户、员工 vs.
边:表示实体之间的-节点-关系。
在简要介绍了 SQL Server Graph 数据库之后,让我们来演示一下它的用法并巩固我们的知识。
示例场景:让我们描述 Person、City、Team、Stat 以及它们之间的关系。
第一步,让我们使用以下代码块创建一个名为“DMCGraph”的数据库,以实现该场景。
USE master;
GO
DROP DATABASE IF EXISTS DMCGraph;
GO
CREATE DATABASE DMCGraph;
GO
让我们开始创建“节点”表。 首先,让我们为用户采取行动。
USE DMCGraph;
GO
DROP TABLE IF EXISTS Users;
GO
CREATE TABLE Users (
UserID INT IDENTITY PRIMARY KEY,
UserName NVARCHAR(100) NOT NULL,
) AS NODE;
查看上面的代码块,你可以看到它就像一个经典的建表过程。唯一的区别是您在表语法的末尾使用短语“AS NODE”指定“节点”。
名为“Users”的节点由 UserID 和 Username 信息组成,我们需要注意节点中有一个主键。要检查表是节点还是边,我们使用 sys.tables 系统表中的 is_node 和 is_edge 列。
从 sys.tables 中选择名称、is_node、is_edge
在上图中,我们看到名为 users 的表是一个节点。我们已经说过在定义它时有一个带有“AS NODE”的节点。
现在我们有一个名为 users 的图表,让我们在其中输入数据。
插入用户值
(‘Caglar’),(‘Baki’),(‘Contemporary’),(‘Musa’),(‘Sait’),(‘Burak’)
现在让我们查看名为 users 的节点的内容。
从 dbo.Users 中选择 *
当您查看上图时,您会看到除了我们定义的 UserID 和 UserName 之外,还有一列。这里的数据内容包括 JSON 数据,默认排序值从 0 开始。
同样,让我们创建 Team、Stat 和 city 节点。
为了队伍;
USE DMCGraph;
GO
DROP TABLE IF EXISTS Teams;
GO
CREATE TABLE Teams (
TeamID INT IDENTITY PRIMARY KEY,
TeamName NVARCHAR(100) NOT NULL,
) AS NODE;
INSERT INTO Teams (TeamName)
VALUES
(‘Galatasaray’),(‘Fenerbahçe’),(‘Beşiktaş’),(‘Trabzonspor’),(‘Başakşehir’)
为国家;
USE DMCGraph;
GO
DROP TABLE IF EXISTS Stat;
GO
CREATE TABLE Stat (
StatID INT IDENTITY PRIMARY KEY,
StatName NVARCHAR(100) NOT NULL,
) AS NODE;
INSERT INTO Stat (StatName)
VALUES
(‘Türk Telekom Arena’),(‘Şükrüsaraçoğlu’),(‘Vodafone Arena’),(‘Avni Aker Stadı’),
为城市;
USE DMCGraph;
GO
DROP TABLE IF EXISTS Cities;
GO
CREATE TABLE Cities (
CityID INT IDENTITY PRIMARY KEY,
CityName NVARCHAR(100) NOT NULL,
) AS NODE;
INSERT INTO Cities (CityName)
VALUES
(‘İstanbul’),(‘Trabzon’)
我们已经创建了图形数据库所需的节点。 现在是时候创造优势了。
让我们创建一个名为 FavoriteTeam、WhichCityTeam 和 TeamsInStad 的边。
DROP TABLE IF EXISTS RetainedTeam;
GO
CREATE TABLE RetainedTeam AS EDGE;
DROP TABLE IF EXISTS WhichCityTeam;
GO
CREATE TABLE WhichCityTeam AS EDGE;
DROP TABLE IF EXISTS TeamsStad;
GO
CREATE TABLE TeamsStad AS EDGE;
运行上述代码块后,让我们检查一下 sys.tables 上的 is_node 和 is_edge。
我们做了如上图所示的定义。 现在是时候在 Edge 上插入 insert 了。 边用于描述两个或多个节点之间的关系。
假设用户拿着一个工具,让我们插入名为 Team Retained 的边。 但在我们这样做之前,让我们看看 HeldTeam 的优势。
从 RetainedTeam 中选择 *
如上图所示,边缘有 3 列。 当我们查看列命名法时,它实际上具有告诉我们节点之间关系的结构。
让我们为 1 号用户采取行动。(我将用户 1 号与团队 1 号相关联。)
insert into retainedteam($from_id, $to_id)
values
((SELECT $node_id FROM Users WHERE UserID = 1),
(SELECT $node_id FROM Teams WHERE TeamID = 1));
让我们再次为用户 1 执行操作。(我将用户 #1 与团队 #4 关联。)
insert into retainedteam($from_id, $to_id)
values
((SELECT $node_id FROM Users WHERE UserID = 1),
(SELECT $node_id FROM Teams WHERE TeamID = 4));
让我们再次为用户 2 执行操作。(我将用户 #2 与团队 #3 关联。)
insert into retainedteam($from_id, $to_id)
values
((SELECT $node_id FROM Users WHERE UserID = 2),
(SELECT $node_id FROM Teams WHERE TeamID = 3));
让我们再次为用户 3 执行操作。(我将用户 #3 与团队 #1 关联。)
insert into retainedteam($from_id, $to_id)
values
((SELECT $node_id FROM Users WHERE UserID = 3),
(SELECT $node_id FROM Teams WHERE TeamID = 1));
让我们为 whichCityTeam 添加一条记录。
我为 1 号城市添加了 1 号团队。
insert into whichCityTeam($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 1),
(SELECT $node_id FROM Cities WHERE CityId = 1))
我为 2 号城市添加了 4 号团队。
insert into whichCityTeam($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 4),
(SELECT $node_id FROM Cities WHERE CityId = 2))
我为 3 号城市添加了 1 号团队。
insert into whichCityTeam($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 3),
(SELECT $node_id FROM Cities WHERE CityId = 1))
让我们为 TeamsStadium 添加一条记录。
我将排名第一的球队与排名第一的数据相匹配。
sert into TeamsStadium($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 1),
(SELECT $node_id FROM Stat WHERE StatId = 1))
我将 2 号团队与 2 号统计数据相匹配。
insert into TeamsStadium($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 2),
(SELECT $node_id FROM Stat WHERE StatId = 2))
我将 3 号团队与 3 号统计数据相匹配。
insert into TeamsStadium($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 3),
(SELECT $node_id FROM Stat WHERE StatId = 3))
查看数据;
在 select 语句中,必须在 where 条件中指定 match 语句。 例如,您需要使用以下查询来显示用户持有的团队。
SELECT u.UserName, t.TeamName
FROM Users u, retainedteam tt, Teams t
WHERE MATCH(u-(tt)->t);
在上面的示例中,作为用户节点,我将 Retained Team 边命名为 tt,将团队节点命名为 t。 输出如下。
同样,作为一个不同的示例,我们可以使用以下查询来获得哪个城市主办哪个球队的问题的答案。
select t.TeamName,c.CityName
from
Teams as t,
whichCityTeam as hst,Cities as c
WHERE MATCH(t-(hst)->c);
我将 t 用于 Teams 节点,将 hst 用于 WhoCityTeam,c 用于 Cities,并使其与 match 匹配。
如果我们要编写包含用户所在团队和团队所在城市的查询;
select u.UserName, t.TeamName,C.CityName
from
Users as u,
Teams as t,
Cities as c,
TutulanTakim as tt,
HangiSehirTakimi as hst
where
1=1
and Match(u-(tt)->t)
and Match(t-(hst)->c)
删除数据;
要对 Edge 执行删除操作,您需要指定 $from_id 和 $to_id 的值。
delete from retainedteam
where
1=1
and $from_id = (select $node_id from users where UserId = 1 )
and $to_id = (select $node_id from Teams where TeamId =4 )
当您再次运行上图的查询时,您将看不到 Trabzonspor 信息。
图数据库正在改变许多复杂操作的实现方式。
在本文中,我们简要回顾了如何在图数据库中创建节点和边。
我们还看到了如何实现不同节点之间的关系以及如何添加、读取和删除边。
原文标题:SQL Server Graph Database
原文作者:Çağlar Özenç
原文地址:https://dbtut.com/index.php/2022/08/05/sql-server-graph-database/