Aracılığıyla paylaş


Grafik veritabanı oluşturma ve T-SQL kullanarak desen eşleştirme sorguları çalıştırma

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri Microsoft Fabric'teAzure SQL VeritabanıAzure SQL Yönetilen Örneği SQL veritabanı

Bu örnek, düğümler ve kenarlar içeren bir grafik veritabanı oluşturmak ve ardından bazı desenleri eşleştirmek ve grafikte gezinmek için yeni MATCH yan tümcesini kullanmak için Transact-SQL betiği sağlar. Bu örnek betik hem Azure SQL Veritabanı hem de SQL Server 2017 (14.x) ve sonraki sürümlerde çalışır.

Örnek Şema

Bu örnek, , Peopleve Restaurant düğümleri olan Cityvarsayımsal bir sosyal ağ için bir grafik şeması oluşturur. Bu düğümler, , , FriendsLikesve LivesIn kenarları kullanılarak LocatedInbirbirine bağlanır. Aşağıdaki diyagramda , , restaurant düğümleri ve city, personLivesInLocatedInkenarlarını içeren Likesbir örnek şema gösterilmektedir.

Restoran, şehir, kişi düğümleri ve LivesIn, LocatedIn, Likes kenarlarını içeren örnek şemayı gösteren diyagram.

Örnek Senaryo

Aşağıdaki örnek betik, düğüm ve kenar tabloları oluşturmak için yeni T-SQL söz dizimini kullanır. deyimini kullanarak INSERT düğüm ve kenar tablolarına veri eklemeyi öğrenin ve ayrıca desen eşleştirme ve gezinti için yan tümcesini kullanmayı MATCH gösterir.

Bu betik aşağıdaki adımları gerçekleştirir:

  1. adlı GraphDemobir veritabanı oluşturun.
  2. Düğüm tabloları oluşturma.
  3. Kenar tabloları oluşturun.
-- Create a GraphDemo database
IF NOT EXISTS (SELECT * FROM sys.databases WHERE NAME = 'graphdemo')
    CREATE DATABASE GraphDemo;
GO

USE GraphDemo;
GO

-- Create NODE tables
CREATE TABLE Person (
  ID INTEGER PRIMARY KEY,
  name VARCHAR(100)
) AS NODE;

CREATE TABLE Restaurant (
  ID INTEGER NOT NULL,
  name VARCHAR(100),
  city VARCHAR(100)
) AS NODE;

CREATE TABLE City (
  ID INTEGER PRIMARY KEY,
  name VARCHAR(100),
  stateName VARCHAR(100)
) AS NODE;

-- Create EDGE tables.
CREATE TABLE likes (rating INTEGER) AS EDGE;
CREATE TABLE friendOf AS EDGE;
CREATE TABLE livesIn AS EDGE;
CREATE TABLE locatedIn AS EDGE;

Şimdi ilişkileri temsil eden veriler ekleyeceğiz.

  1. Düğüm tablolarına veri ekleme.
    1. Düğüm tablosuna ekleme, normal tabloya ekleme ile aynıdır.
  2. Bu durumda, her bir kişinin uçta hoşlandığı uç tablolarına likes veri ekleyin.
    1. Kenar tablosuna eklerken ve $node_id sütunlarını $from_id$to_id sağlayın.
  3. Kişileri bulundukları şehirle ilişkilendirmek için uç noktaya veri livesIn ekleyin.
  4. Restoranları bulundukları şehirle ilişkilendirmek için uç noktaya veri locatedIn ekleyin.
  5. İlişkili arkadaşlarınıza friendOf uçta veri ekleyin.
-- Insert data into node tables. Inserting into a node table is same as inserting into a regular table
INSERT INTO Person (ID, name)
    VALUES (1, 'John')
         , (2, 'Mary')
         , (3, 'Alice')
         , (4, 'Jacob')
         , (5, 'Julie');

INSERT INTO Restaurant (ID, name, city)
    VALUES (1, 'Taco Dell','Bellevue')
         , (2, 'Ginger and Spice','Seattle')
         , (3, 'Noodle Land', 'Redmond');

INSERT INTO City (ID, name, stateName)
    VALUES (1,'Bellevue','WA')
         , (2,'Seattle','WA')
         , (3,'Redmond','WA');

-- Insert into edge table. While inserting into an edge table,
-- you need to provide the $node_id from $from_id and $to_id columns.
/* Insert which restaurants each person likes */
INSERT INTO likes
    VALUES ((SELECT $node_id FROM Person WHERE ID = 1), (SELECT $node_id FROM Restaurant WHERE ID = 1), 9)
         , ((SELECT $node_id FROM Person WHERE ID = 2), (SELECT $node_id FROM Restaurant WHERE ID = 2), 9)
         , ((SELECT $node_id FROM Person WHERE ID = 3), (SELECT $node_id FROM Restaurant WHERE ID = 3), 9)
         , ((SELECT $node_id FROM Person WHERE ID = 4), (SELECT $node_id FROM Restaurant WHERE ID = 3), 9)
         , ((SELECT $node_id FROM Person WHERE ID = 5), (SELECT $node_id FROM Restaurant WHERE ID = 3), 9);

/* Associate in which city live each person*/
INSERT INTO livesIn
    VALUES ((SELECT $node_id FROM Person WHERE ID = 1), (SELECT $node_id FROM City WHERE ID = 1))
         , ((SELECT $node_id FROM Person WHERE ID = 2), (SELECT $node_id FROM City WHERE ID = 2))
         , ((SELECT $node_id FROM Person WHERE ID = 3), (SELECT $node_id FROM City WHERE ID = 3))
         , ((SELECT $node_id FROM Person WHERE ID = 4), (SELECT $node_id FROM City WHERE ID = 3))
         , ((SELECT $node_id FROM Person WHERE ID = 5), (SELECT $node_id FROM City WHERE ID = 1));

/* Insert data where the restaurants are located */
INSERT INTO locatedIn
    VALUES ((SELECT $node_id FROM Restaurant WHERE ID = 1), (SELECT $node_id FROM City WHERE ID =1))
         , ((SELECT $node_id FROM Restaurant WHERE ID = 2), (SELECT $node_id FROM City WHERE ID =2))
         , ((SELECT $node_id FROM Restaurant WHERE ID = 3), (SELECT $node_id FROM City WHERE ID =3));

/* Insert data into the friendOf edge */
INSERT INTO friendOf
    VALUES ((SELECT $NODE_ID FROM Person WHERE ID = 1), (SELECT $NODE_ID FROM Person WHERE ID = 2))
         , ((SELECT $NODE_ID FROM Person WHERE ID = 2), (SELECT $NODE_ID FROM Person WHERE ID = 3))
         , ((SELECT $NODE_ID FROM Person WHERE ID = 3), (SELECT $NODE_ID FROM Person WHERE ID = 1))
         , ((SELECT $NODE_ID FROM Person WHERE ID = 4), (SELECT $NODE_ID FROM Person WHERE ID = 2))
         , ((SELECT $NODE_ID FROM Person WHERE ID = 5), (SELECT $NODE_ID FROM Person WHERE ID = 4));

Ardından, verilerden içgörüler bulmak için verileri sorgulayacağız.

  1. John'un beğendiği restoranları bulmak için graf KAÇINCI işlevini kullanın.
  2. John'un arkadaşlarının beğendiğini restoranları bulur.
  3. Aynı şehirde yaşayan bir restoranı seven kişileri bulun.
-- Find Restaurants that John likes
SELECT Restaurant.name
FROM Person, likes, Restaurant
WHERE MATCH (Person-(likes)->Restaurant)
AND Person.name = 'John';

-- Find Restaurants that John's friends like
SELECT Restaurant.name
FROM Person person1, Person person2, likes, friendOf, Restaurant
WHERE MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
AND person1.name='John';

-- Find people who like a restaurant in the same city they live in
SELECT Person.name
FROM Person, likes, Restaurant, livesIn, City, locatedIn
WHERE MATCH (Person-(likes)->Restaurant-(locatedIn)->City AND Person-(livesIn)->City);

Son olarak, daha gelişmiş bir sorgu arkadaş arkadaşlarının arkadaşlarını bulur. Bu sorgu, ilişkinin "geri döngü yaptığı" durumları dışlar. Örneğin, Alice John'un bir arkadaşıdır; John, Mary'nin bir arkadaşıdır. Ve Mary de Alice'in bir arkadaşıdır. Bu, Alice'e geri bir "döngü" neden olur. Çoğu durumda, bu tür döngüleri açıkça denetlemek ve sonuçları dışlamak gerekir.

-- Find friends-of-friends-of-friends, excluding those cases where the relationship "loops back".
-- For example, Alice is a friend of John; John is a friend of Mary; and Mary in turn is a friend of Alice.
-- This causes a "loop" back to Alice. In many cases, it is necessary to explicitly check for such loops and exclude the results.
SELECT CONCAT(Person.name, '->', Person2.name, '->', Person3.name, '->', Person4.name)
FROM Person, friendOf, Person as Person2, friendOf as friendOffriend, Person as Person3, friendOf as friendOffriendOfFriend, Person as Person4
WHERE MATCH (Person-(friendOf)->Person2-(friendOffriend)->Person3-(friendOffriendOfFriend)->Person4)
AND Person2.name != Person.name
AND Person3.name != Person2.name
AND Person4.name != Person3.name
AND Person.name != Person4.name;

Temizleme

SQL Server'da örnek için oluşturulan şemayı ve veritabanını temizleyin.

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;

USE master;
go
DROP DATABASE graphdemo;
go

Azure SQL Veritabanı'nda örnek için oluşturulan şemayı ve veritabanını temizleyin.

--Connect to the graphdemo database
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;

--Connect to the master database
DROP DATABASE graphdemo;
go

Sonraki Adımlar