Freigeben über


Erstellen einer Graphdatenbank und Ausführen von Musterabgleichsabfragen mithilfe von T-SQL

Gilt für: SQL Server 2017 (14.x) und höher Azure SQL-DatenbankAzure SQL Managed Instance

Dieses Beispiel stellt ein Transact-SQL-Skript bereit, um eine Graphdatenbank mit Knoten und Kanten zu erstellen und dann die neue MATCH-Klausel zu verwenden, um einige Muster abzugleichen und das Diagramm zu durchlaufen. Dieses Beispielskript funktioniert sowohl für Azure SQL-Datenbank als auch für SQL Server 2017 (14.x) und höhere Versionen.

Beispielschema

In diesem Beispiel wird ein Diagrammschema für ein hypothetisches soziales Netzwerk mit PeopleKnoten und CityRestaurant erstellt. Diese Knoten sind über Friends, LikesLivesIn und LocatedIn Kanten miteinander verbunden. Das folgende Diagramm zeigt ein Beispielschema mit restaurant, city, Knoten person und LivesIn, LocatedInKanten Likes .

Diagramm eines Beispielschemas mit Restaurant-, Stadt-, Personenknoten und LivesIn, LocatedIn, Likes-Kanten.

Beispielskript

Das folgende Beispielskript verwendet die neue T-SQL-Syntax, um Knoten- und Edgetabellen zu erstellen. Erfahren Sie, wie Sie Mithilfe der INSERT -Anweisung Daten in Knoten- und Edgetabellen einfügen, und erfahren Sie, wie Sie die Klausel für musterabgleich und navigation verwenden MATCH .

Dieses Skript führt die folgenden Schritte aus:

  1. Erstellen Sie eine Datenbank mit dem Namen GraphDemo.
  2. Erstellen sie Knotentabellen.
  3. Erstellen von Edgetabellen
-- 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;

Nun fügen wir Daten ein, um die Beziehungen darzustellen.

  1. Fügen Sie Daten in Knotentabellen ein.
    1. Das Einfügen in eine Knotentabelle entspricht dem Einfügen in eine reguläre Tabelle.
  2. Fügen Sie In diesem Fall Daten in Edgetabellen ein, für die die einzelnen Personen in Restaurants likes gefallen.
    1. Geben Sie beim Einfügen in eine Randtabelle die $node_id Spalten from $from_id und $to_id an.
  3. Fügen Sie Daten in den livesIn Edge ein, um Personen der Stadt zuzuordnen, in der sie leben.
  4. Fügen Sie Daten in den locatedIn Edge ein, um Restaurants der Stadt zuzuordnen, in der sie sich befinden.
  5. Fügen Sie Daten in den friendOf Edge für zugeordnete Freunde ein.
-- 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));

Als Nächstes fragen wir die Daten ab, um Erkenntnisse aus den Daten zu finden.

  1. Verwenden Sie die Diagrammfunktion MATCH , um zu ermitteln, welche Restaurants John mag.
  2. Findet die Restaurants, die Johns Freunde mögen.
  3. Finden Sie Leute, die ein Restaurant in derselben Stadt mögen, in der sie leben.
-- 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);

Schließlich findet eine erweiterte Abfrage die Freunde von Freunden von Freunden. Diese Abfrage schließt diejenigen Fälle aus, in denen sich die Beziehung "zurückschleifet". Alice ist beispielsweise eine Freundin von John; Johannes ist ein Freund Marias; und Mary wiederum ist eine Freundin von Alice. Dies führt zu einer "Schleife" zurück zu Alice. In vielen Fällen ist es notwendig, solche Schleifen explizit zu überprüfen und die Ergebnisse auszuschließen.

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

Bereinigen

Bereinigen Sie das Schema und die Datenbank, die für das Beispiel in SQL Server erstellt wurden.

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

Bereinigen Sie das Schema und die Datenbank, die für das Beispiel in Azure SQL-Datenbank erstellt wurden.

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

Nächste Schritte