SQL Server 2017 GraphDB Part-1

SQL Server 2017 ile hayatımıza giren GraphDB yi bu makalede örneklerle ele alacağız. Makale sonunda GraphDB nin çalışma mantığını ve Query atmayı öğrenmiş olacağız. Makalemizde normal Relational DB ile GraphDB arasında ki farka değinmek için Normal tasarımda yapacağız.

SQL Server 2017 Grph Node ve Edge tablolarından oluşmaktadır.Bir Node bir varlığı temsil eder.Bu bir kişi veya kuruluş olabilir.Bir Edge ise bağlandığı iki düğüm arasında ki ilişkiyi gösterir.Node ve Edge tabloları , veritabanı içerisinde ki herhangi bir Schema altında oluşturabilirsiniz fakat hepsi mantıksal bir grafiğe aittir.

SQL Server Relational Database Örneğimizi yapalım :

Bu örneğimizde ilişkisel veritabanı sorgusunun nasıl çalıştığını göreceğiz ve bunun için üç adet tablooluşturacağız. Tablolarımız  : Personel,WorksIn ve Company

Bu tabloları oluşturduktan sonra demo verimizi tablolarımıza basıp birbirine bağlı sorgular hazırlayacağız.

Demo veritabanımızı oluşturalım.

Create Database SQLTurkiye_GraphDB
Go

Şimdi ise Demo tablolarımızı oluşturalım.

USE [SQLTurkiye_GraphDB]
GO

CREATE TABLE [dbo].[Personel](
 [Personel_id] [int] NOT NULL,
 [Name] [nvarchar](75) NULL,
 [Gender] [nvarchar](6) NULL,
PRIMARY KEY CLUSTERED 
(
 [Personel_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WorksIn](
 [Personel_id] [int] NULL,
 [Cmp_ID] [int] NULL,
 [Since] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Company](
 [cmp_ID] [int] NULL,
 [cmpName] [varchar](100) NULL
) ON [PRIMARY]
GO

Oluşturduğumuz tablolarımıza veri basalım.

INSERT INTO Personel VALUES (1,'Yusuf Kahveci','Male');
INSERT INTO Personel VALUES (2,'Yasar Kahveci','Male');
INSERT INTO Personel VALUES (3,'Julia Mertz Shand','Female');
INSERT INTO Personel VALUES (4,'March Hons','Male');
INSERT INTO Personel VALUES (5,'Lady Mish','Female');
INSERT INTO Personel VALUES (6,'Elizabeth Tork','Female');

INSERT INTO Company VALUES (1,'SQL Turkiye')
INSERT INTO Company VALUES (2,'noSQLturkiye')
INSERT INTO Company VALUES (3,'dataplatform services')
INSERT INTO Company VALUES (4,'Orange Performance')

INSERT INTO WorksIn  VALUES(1,1,2015)
INSERT INTO WorksIn  VALUES(2,2,2014)
INSERT INTO WorksIn  VALUES(3,3,2016)
INSERT INTO WorksIn  VALUES(4,3,2016)
INSERT INTO WorksIn  VALUES(5,3,2014)
INSERT INTO WorksIn  VALUES(6,4,2014)

Tablolarımızın bağlantılarını hangi kolonda yaptığımızı aşağıda hazırladığım grafikte görmektesiniz.

Gördüğünüz gibi Personel tablosunda ki Personel_id yi kullanarak WorksIn tablosuna erişebiliyoruz. Tabiki WorksIn deki Personel_id ile eşleştirerek. Daha sonra WorksIn tablosunda ki Cmp_Id kullanrakta Company tablosuna erişebiliryoruz. Tabi burda da Company cmp_ID kolonu eşitliğini kullanarak.

Şimdi bu sorguyu yazarsak ;

SELECT p.[Name] FROM Personel p 
INNER JOIN WorksIn w ON p.Personel_id=w.Personel_id
INNER JOIN Company c ON w.Cmp_ID=c.Cmp_ID
WHERE c.cmpName='SQL Turkiye'

Yukarıda ki sorguda şirkette ki çalışanları bulmak için bağlantı kolonlarını (Foreign Keys)kullanarak verilere eriştik. Bu örnekte 3 tablo ve 3 FK ile bu sonuca eriştik fakat karmaşıklık arttıkça daha fazla tablo ve daha fazla FK kullanarak yapı büyüyecek ve efor artacak.

Yukarıda ki örneğimizi unutmayalım ve aynı süreci GraphDB modelinde analiz edelim yani Düğümleri (Nodes) ve kenarları (Edges) kullanarak.

Şimdi Nodes ve Edges tablolarının oluşturalım.

CREATE TABLE [dbo].[Company_Node](
 [ID] [int] NOT NULL,
 [name] [varchar](100) NULL,
 [sector] [varchar](100) NULL,
 [city] [varchar](100) NULL
)
AS NODE;

CREATE TABLE [dbo].[Personel_Node](
 [ID] [int] NOT NULL,
 [name] [varchar](100) NULL,
 [Gender] [char](10) NULL
 ) As Node;


 CREATE TABLE [dbo].[City_Node](
 [ID] [int] NOT NULL,
 [name] [varchar](100) NULL,
 [stateName] [varchar](100) NULL
 ) As Node;

CREATE TABLE [WorksIn_Edge] ([year] [int] )AS EDGE

CREATE TABLE  LocatedIn_Edge as edge;

CREATE TABLE  LivesIn_Edge as edge;

Şimdi ise Node tablolarına veri ekleyelim. Fark etmeniz gereken durum ise şudur ki Node tablolarına veri eklemenin normal Relation Database inde olan tablolara veri eklemek ile hiçbir farkı yok.

INSERT INTO [Personel_Node] VALUES (1,'Yusuf Kahveci','Male');
INSERT INTO [Personel_Node] VALUES (2,'Yasar Kahveci','Male');
INSERT INTO [Personel_Node] VALUES (3,'Taj Shand','Male');
INSERT INTO [Personel_Node] VALUES (4,'Archer Lamble','Male');
INSERT INTO [Personel_Node] VALUES (5,'Piper Koch','FeMale');
INSERT INTO [Personel_Node] VALUES (6,'Katie Darwin','FeMale');

INSERT INTO [Company_Node] VALUES (1,'SQL Turkiye','IT','Istanbul');
INSERT INTO [Company_Node] VALUES (2,'noSQLturkiye','IT','Istanbul');
INSERT INTO [Company_Node] VALUES (3,'Fabrikam Land','Pharma','Jonesbough');
INSERT INTO [Company_Node] VALUES (4,'Nod Publishers', 'IT','Jonesbough');

INSERT INTO [City_Node] VALUES (1,'Istanbul','Atasehir');
INSERT INTO [City_Node] VALUES (2,'Istanbul','Atasehir');
INSERT INTO [City_Node] VALUES (3,'Jonesbough','Lancing');
INSERT INTO [City_Node] VALUES (4,'Abbeville','Lancing');
INSERT INTO [City_Node] VALUES (5,'Zortman','Wyoming');
INSERT INTO [City_Node] VALUES (6,'Zortman','Wyoming');

Edge tablosuna veri eklemek için $ from_id ve $ to_id referanslarını her iki Düğüme de referans noktası olarak vermemiz gerekir.

INSERT INTO [WorksIn_Edge]  VALUES ((SELECT $node_id FROM [Personel_Node] WHERE ID = 1), 
       (SELECT $node_id FROM [Company_Node] WHERE ID = 1),2015);
INSERT INTO [WorksIn_Edge] VALUES ((SELECT $node_id FROM [Personel_Node] WHERE ID = 2), 
      (SELECT $node_id FROM [Company_Node] WHERE ID = 2),2014);
INSERT INTO [WorksIn_Edge] VALUES ((SELECT $node_id FROM [Personel_Node] WHERE ID = 3), 
      (SELECT $node_id FROM [Company_Node] WHERE ID = 3),2015);
INSERT INTO [WorksIn_Edge] VALUES ((SELECT $node_id FROM [Personel_Node] WHERE ID = 4), 
      (SELECT $node_id FROM [Company_Node] WHERE ID = 3),2016);
INSERT INTO [WorksIn_Edge] VALUES ((SELECT $node_id FROM [Personel_Node] WHERE ID = 5), 
      (SELECT $node_id FROM [Company_Node] WHERE ID = 3),2014);
   INSERT INTO [WorksIn_Edge] VALUES ((SELECT $node_id FROM [Personel_Node] WHERE ID = 6), 
      (SELECT $node_id FROM [Company_Node] WHERE ID = 4),2014);

Insert into LocatedIn_Edge values ((select $node_id FROM [Company_Node] WHERE ID = 1),
(select $node_id FROM  [City_Node] where ID=2))

Insert into LocatedIn_Edge values ((select $node_id FROM [Company_Node] WHERE ID = 2),
(select $node_id FROM  [City_Node] where ID=1))

Insert into LocatedIn_Edge values ((select $node_id FROM [Company_Node] WHERE ID = 3),
(select $node_id FROM  [City_Node] where ID=3))

Insert into LocatedIn_Edge values ((select $node_id FROM [Company_Node] WHERE ID = 4),
(select $node_id FROM  [City_Node] where ID=2))

Insert into LivesIn_Edge values ((select $node_id FROM [City_Node] WHERE ID = 1),
(select $node_id FROM  [City_Node] where ID=6))

Insert into LivesIn_Edge values ((select $node_id FROM [City_Node] WHERE ID = 2),
(select $node_id FROM  [City_Node] where ID=5))

Insert into LivesIn_Edge values ((select $node_id FROM [City_Node] WHERE ID = 3),
(select $node_id FROM  [City_Node] where ID=4))

Insert into LivesIn_Edge values ((select $node_id FROM [City_Node] WHERE ID = 4),
(select $node_id FROM  [City_Node] where ID=2))

Insert into LivesIn_Edge values ((select $node_id FROM [City_Node] WHERE ID = 5),
(select $node_id FROM  [City_Node] where ID=3))

Insert into LivesIn_Edge values ((select $node_id FROM [City_Node] WHERE ID = 6),
(select $node_id FROM  [City_Node] where ID=1))

Insert ettikten sonra Node lara SELECT çekelim ;

SELECT * FROM [Personel_Node]

SELECT * FROM [Company_Node]

SELECT * FROM [City_Node]

Edge Tablolarına SELECT çekelim ;

Şimdi ise Graph dan sonuçları almak için CQL yazıp EXEC etmemiz gerek.Örneğimiz belirli bir şirkette çalışan adlarını almak olsun. Buna göre CQL ‘imiz ise ;

SELECT PN.name FROM [Personel_Node] PN, [WorksIn_Edge], [Company_Node] CN
WHERE MATCH(PN-(WorksIn_Edge)->CN)
AND CN.name='SQL Turkiye';

Yukarıda ki grafikte de görüldüğü üzere sorgunun 1 dizin aramasına ihtiyaç duyacağını görüyoruz. Sonra fiziksel işaretçilere doğrudan başvurarak ilişkileri geçecek.

Şimdide Farklı örneklerle çalışalım ,

SELECT CN.name FROM [Personel_Node] PN, [WorksIn_Edge], [Company_Node] CN
WHERE MATCH(PN-(WorksIn_Edge)->CN)
AND PN.name='Yusuf Kahveci';

select Personel_Node.name ,Company_Node.name
From [Personel_Node] ,[WorksIn_Edge], [Company_Node] ,LocatedIn_Edge,[City_Node] 
where MATCH(Personel_Node-(WorksIn_Edge)->Company_Node and Company_Node-(LocatedIn_Edge)->City_Node )
and WorksIn_Edge.year='2014' and Company_Node.name='Fabrikam Land'

 

Kolay Gelsin …

 

NOT : Yakında Neo4j üzerinden de Garph anlatımlarımız olacak.

Leave a Reply

Your email address will not be published. Required fields are marked *