暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server 图形数据库

原创 CiciLee 2022-08-27
381

在今天的文章中,我们将研究 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/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论