Megosztás a következőn keresztül:


Gráfadatbázis létrehozása és mintaegyező lekérdezések futtatása a T-SQL használatával

A következőkre vonatkozik: Az SQL Server 2017 (14.x) és újabb verziói az Azure SQL DatabaseAzure SQL Managed InstanceSQL Database-adatbázist a Microsoft Fabricben

Ez a minta egy Transact-SQL szkriptet biztosít egy csomópontokkal és élekkel rendelkező gráfadatbázis létrehozásához, majd az új MATCH záradék használatával megfeleltethet néhány mintát, és áthaladhat a gráfon. Ez a példaszkript az Azure SQL Database és az SQL Server 2017 (14.x) és újabb verzióiban is működik.

Mintaséma

Ez a minta létrehoz egy gráfsémát egy hipotetikus közösségi hálózathoz, amely People, Restaurantés City csomópontokkal rendelkezik. Ezek a csomópontok Friends, Likes, LivesInés LocatedIn élek használatával csatlakoznak egymáshoz. Az alábbi ábrán egy mintaséma látható restaurant, city, person csomópontokkal és LivesIn, LocatedIn, Likes élekkel.

Diagram egy mintaséma étteremmel, várossal, személycsomópontokkal és LivesIn, LocatedIn, Likes élekkel.

Példaforgatókönyv

Az alábbi példaszkript az új T-SQL-szintaxist használja csomópont- és éltáblák létrehozásához. Megtudhatja, hogyan szúrhat be adatokat a csomópont- és éltáblákba INSERT utasítással, és azt is bemutatja, hogyan használható MATCH záradék a mintaegyeztetéshez és a navigációhoz.

Ez a szkript a következő lépéseket hajtja végre:

  1. Hozzon létre egy GraphDemonevű adatbázist.
  2. Csomóponttáblák létrehozása.
  3. Éltáblák létrehozása.
-- 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;

Most beszúrunk adatokat a kapcsolatok megjelenítéséhez.

  1. Adatok beszúrása csomóponttáblákba.
    1. A csomóponttáblába való beszúrás ugyanaz, mint egy normál táblába való beszúrás.
  2. Szúrjon be adatokat a peremtáblákba, ebben az esetben, amelyekhez az egyes személyek szeretik az likes élét.
    1. Amikor beszúr egy éltáblába, adja meg a $node_id$from_id és $to_id oszlopokból.
  3. Adatok beszúrása a livesIn élére, hogy személyeket társítson a lakhelyük szerinti városhoz.
  4. Adatokat szúrhat be a locatedIn élére, hogy az éttermeket társítsa ahhoz a városhoz, ahol találhatók.
  5. Adatok beszúrása a friendOf peremhálózatra a társított barátok számára.
-- 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));

Ezután lekérdezzük az adatokat, hogy megállapításokat találjunk az adatokból.

  1. A gráf MATCH függvénnyel megtalálhatja, hogy mely éttermeket szereti John.
  2. Megkeresi azokat az éttermeket, amiket John barátai kedvelnek.
  3. Keresse meg azokat az embereket, akik szeretik az éttermet ugyanabban a városban, ahol élnek.
-- 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);

Végül egy fejlettebb lekérdezés megkeresi a barátok barátait. Ez a lekérdezés kizárja azokat az eseteket, amikor a kapcsolat "visszacsatolás". Alice például János barátja; János Mary barátja; Mary pedig Alice barátja. Ez "hurkot" okoz Alice-nek. Sok esetben kifejezetten ellenőrizni kell az ilyen ciklusokat, és ki kell zárni az eredményeket.

-- 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;

Takarítás

Törölje a mintához létrehozott sémát és adatbázist az SQL Serveren.

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

Törölje a mintához létrehozott sémát és adatbázist az Azure SQL Database-ben.

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

Következő lépések