Graph Database در پایگاه داده SQL Server

Graph Database در پایگاه داده SQL Server

نوشته شده توسط: تیم فنی نیک آموز
۰۲ مهر ۱۴۰۱
زمان مطالعه: 20 دقیقه
۰
(۰)

مقدمه

در این مقاله قصد دارم به بررسی ویژگی Graph Database در پایگاه داده SQL Server بپردازم. ویژگی Graph Database از ورژن SQL Server 2017 به این نرم‌افزار اضافه شده است و برای مدیریت روابط پیچیده و سلسله مراتبی ارائه شده است.

می‌توان گفت که Graph Database برای نمایش داده‌های سلسله مراتبی پیچیده‌ای که در سیستم‌های پایگاه داده رابطه‌ای و پایگاه داده‌های NoSQL وجود دارد، معرفی شده است. این ویژگی برای حذف مشکلات کارایی که در اثر تعداد سطوح رابطه و اندازه پایگاه داده به وجود می‌آید، مورد استفاده است.

تعدادی از مواردی که می‌توانیم از Graph Database استفاده کنیم عبارتند از:

  • شبکه اجتماعی
  • تشخیص تقلب
  • سیستم‌های پیشنهاد دهنده محصول
  • آنالیز شبکه فناوری اطلاعات (IT)
  • سیستم‌های پیشنهاد دهنده اجتماعی

 قسمت‌های Graph Database 

  • Node: موجودیت‌های Graph Database را نشان می‌دهد. مانند مشتری در مقابل کارمند
  • Edge: نشان دهنده رابطه میان موجودیت‌ها (Node ها) است.

پس از اطلاعات مختصری که در مورد Graph Database  درSQL Server  ارائه شد، برای درک بیشتر یک مثال آزمایشی در مورد استفاده از آن ارائه می‌دهیم.

مثال: موجودیت‌های Person, City, Team, Stat را در نظر بگیرید. روابط میان آن‌ها را با Graph Database توصیف می‌کنیم.

در اولین گام، یک پایگاه داده به نام DMCGraph با اجرای کد زیر ایجاد می‌کنیم تا سناریو را پیاده‌سازی کنیم.

USE master;
GO
DROP DATABASE IF EXISTS DMCGraph;
GO
CREATE DATABASE DMCGraph;
GO

در گام دوم، جداول  node را ایجاد می‌کنیم. ابتدا برای User اقدام می‌کنیم.

USE DMCGraph;
GO
DROP TABLE IF EXISTS Users;
GO
CREATE TABLE Users (
UserID INT IDENTITY PRIMARY KEY,
UserName NVARCHAR(100) NOT NULL,
) AS NODE;

 

با نگاهی به کد بالا، متوجه می‌شوید که روال ایجاد node  مشابه ایجاد جداول است با این تفاوت که عبارت AS NODE را به انتهای سینتکس ایجاد جدول اضافه کرده است.

node با نام Users شامل UserID و Username است. توجه کنید همیشه باید یک کلید اصلی در node وجود داشته باشد. برای مشخص کردن اینکه یک جدول node یا edge است از ستون‌های is_node و is_edge در جدول سسیستمی sys.tables استفاده می‌کنیم. کوئری زیر این اطلاعات را نشان می‌دهد:

select name, is_node, is_edge from sys.tables

همان طور که در تصویر بالا مشاهده می‌کنید، جدولی به نام Users یک node است. قبلاً گفتیم که هنگام تعریف یک node از عبارت AS NODE استفاده می‌کنیم.

اکنون یک graph table به نام users  داریم و می‌توانیم داده‌ها را در آن درج کنیم.

insert into Users values
(‘Caglar’),(‘Baki’),(‘Contemporary’),(‘Musa’),(‘Sait’),(‘Burak’)

 

با کوئری زیر محتوای node با نام users  را دریافت می‌کنیم:

 

select * from dbo.Users

همان طور که مشاهده می‌کنید غیر از ستون‌های UserID و UserName که تعریف کرده بودیم، ستون دیگری نیز نمایش داده شده است. این ستون شامل داده‌های جیسون است و به صورت پیش‌فرض از صفر شروع می‌شود.

مشابه روال ایجاد Users در اینجا node هایی به نام Team، Stat و city را ایجاد می‌کنیم.

ایجاد Team

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’)

ایجاد Stat

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ı’),(‘Fatih Terim Stadı’)

ایجاد city

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’)

تا اینجا nodeهای مورد نیاز برای Graph Database را ایجاد کردیم. حالا یک edge ایجاد می‌کنیم. Edge‌هایی به نام 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;

س از اجرای کد بالا، مقادیر is_node و is_edge را در sys.tables بررسی می‌کنیم.

همان طور که در تصویر بالا مشاهده می‌کنید، Edge ها به درستی ایجاد شده‌اند. Edge برای تعریف رابطه بین دو یا چند node به کار می‌رود. اکنون برای درج در  Edgeاقدام می‌کنیم. با فرض اینکه کاربر ابزاری را در دست دارد، یک Edge به نام retainedteam را درج می‌کنیم.

برای کاربر شماره ۱ اقدام می‌کنیم. رابطه‌ای میان user #1 با team #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));

این عملیات را مجدد برای کاربر شماره ۱ انجام میدهیم. رابطه‌ای میان user #1 با team #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));

این عملیات را برای کاربر شماره ۲ انجام می‌دهیم. رابطه‌ای میان user #2 با team #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));

این عملیات را برای کاربر شماره ۳ انجام می‌دهیم. رابطه‌ای میان user #3 با team #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 اضافه میکنیم. team شماره ۱ را برای شهر شماره ۱ اضافه کردم.

insert into whichCityTeam($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 1),
(SELECT $node_id FROM Cities WHERE CityId = 1))

team شماره ۴ را برای city شماره ۲ اضافه کردم.

insert into whichCityTeam($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 4),
(SELECT $node_id FROM Cities WHERE CityId = 2))

team شماره ۳ را برای city شماره ۱ اضافه کردم.

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 اضافه می‌کنم. team شماره ۱ را با stat شماره ۱ مرتبط کردم.

insert into TeamsStadium($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 1),
(SELECT $node_id FROM Stat WHERE StatId = 1))

team شماره ۲ را با stat شماره ۲ مرتبط کردم.

insert into TeamsStadium($from_id, $to_id)
values
((SELECT $node_id FROM Teams WHERE TeamId = 2),
(SELECT $node_id FROM Stat WHERE StatId = 2))

من team شماره ۳ را با stat شماره ۳ مرتبط کردم.

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 باید عبارت match را در شرط Where مشخص کنید. به عنوان مثال، برای نمایش team هایی که user در اختیار دارند، می‌توانیم از کوئری زیر استفاده کنیم.

SELECT u.UserName,  t.TeamName
FROM Users u, retainedteam tt, Teams t
WHERE MATCH(u-(tt)->t);

در مثال بالا، برای users node، retainedteam  با نام مستعار tt و teams node  را با نام مستعار t نام گذاری کردم.

به همین ترتیب با روالی مشابه یک مثال دیگر می‌زنیم. شهرهایی که میزبان تیم هستند را با کوئری زیر به دست می‌آوریم.

select t.TeamName,c.CityName
from
Teams as t,
whichCityTeam as hst,Cities as c
WHERE MATCH(t-(hst)->c);

من از نام مستعار t برای Teams node، hst برای WhichCityTeam و c برای Cities استفاده کردم. خروجی کوئری زیر شامل تیم‌های کاربران و شهرهای تیم‌ها می‌شود.

select u.UserName,  t.TeamName,C.CityName
from
Users as u,
Teams as t,
Cities as c,
TutulanTakim as tt,
HangiSehirTakimi as hst
where
۱=۱
and Match(u-(tt)->t)
and Match(t-(hst)->c)

برای حذف داده‌ها

برای انجام عملیات Delete در Edge، باید مقادیر $from_id و $to_id را مشخص کنید.

delete from retainedteam
where
۱=۱
and $from_id = (select $node_id from users where UserId = 1 )
and $to_id = (select $node_id from Teams where TeamId =4  )

وقتی دوباره کوئری بالا را اجرا کنید، اطلاعات Trabzonspor  را مشاهده نخواهید کرد.

جمع بندی

Graph database ها در حال تغییر روش اجرای بسیاری از عملیات‌ها از ساده تا پیچیده هستند. در این مقاله به طور خلاصه نحوه ایجاد node ها و edge ها در Graph database ها را بررسی کردیم. همچنین نحوه پیاده‌سازی روابط بین node های مختلف و چگونگی افزودن، خواندن و حذف edge ها را بررسی کردیم.

چه رتبه ای می‌دهید؟

میانگین ۰ / ۵. از مجموع ۰

اولین نفر باش

title sign
دانلود مقاله
Graph Database در پایگاه داده SQL Server
فرمت PDF
صفحه
حجم مگابایت
دانلود مقاله
title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
172 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
پروفایل نویسنده
title sign
دیدگاه کاربران