dotychczasowa seria:

  1. SQL Server graph Databases-Część 1: Wprowadzenie
  2. SQL Server Graph Databases – część 2: odpytywanie danych w bazie danych grafu
  3. SQL Server graph Databases – Część 3: modyfikowanie danych w bazie danych grafu
  4. SQL Server graph Databases – Część 4: Praca z hierarchicznymi danymi w bazie danych grafu
  5. SQL Server Graph Databases – Część 5: Importowanie danych relacyjnych do bazy danych grafów

wraz z wydaniem SQL Server 2017 firma Microsoft dodała obsługę baz danych grafów, aby lepiej obsługiwać zestawy danych zawierające złożone relacje jednostek, takie jak typ danych generowanych przez witrynę mediów społecznościowych, w której można uzyskać mieszankę wielu do wielu relacji, które często się zmieniają. Bazy danych Graph wykorzystują te same struktury tabel, które występują w tradycyjnych bazach danych SQL Server i obsługują te same narzędzia i instrukcje T-SQL, ale zawierają również funkcje do przechowywania i nawigacji złożonych relacji.

ten artykuł jest pierwszym z serii o bazach danych SQL Server graph. W artykule przedstawiono podstawowe koncepcje wykresów i pokazano, jak tworzyć i wypełniać tabele Wykresów za pomocą SQL Server Management Studio (SSMS) i lokalnej instancji SQL Server 2017. W artykułach, które będziemy śledzić, będziemy kopać w jaki sposób odpytywać bazę danych grafów i modyfikować jej dane, ale w tym artykule zaczynamy od podstaw.

baz danych Wykresów SQL Server

bazy danych Wykresów SQL Server mogą pomóc w uproszczeniu procesu modelowania danych, które zawierają złożone relacje wielu do wielu i hierarchiczne. W swojej najbardziej podstawowej bazie danych Graf jest zbiorem węzłów i krawędzi, które współpracują ze sobą, aby zdefiniować różne typy relacji. Węzeł to jednostka taka jak osoba lub lokalizacja. Krawędź jest relacją między dwoma jednostkami. Na przykład może istnieć związek między miejscem takim jak Toledo a osobą o imieniu Chris, która mieszka w Toledo. Chris I Toledo są istotami, a „mieszka w” to relacja między nimi.

tabela węzłów w SQL Server jest zbiorem podobnych jednostek, a tabela krawędzi jest zbiorem podobnych relacji. Aby pomóc zrozumieć, jak to działa, rozważ model wykresu pokazany na poniższym rysunku, który opiera się na fikcyjnym forum miłośników ryb. Model zawiera trzy węzły (FishSpecies, FishLover i FishPost) i trzy krawędzie (Polubienia, posty i linki).

prostokąty reprezentują węzły, a strzałki łączące węzły reprezentują krawędzie, ze strzałkami skierowanymi w kierunku relacji. Na przykład krawędzie polubień mogą definiować dowolną z następujących relacji:

  • miłośnik ryb lubi gatunki ryb.
  • miłośnik ryb lubi post o rybach.
  • miłośnik ryb lubi innego miłośnika ryb.

możesz reprezentować wszystkie trzy relacje jako dane w pojedynczej tabeli krawędzi w bazie danych grafu, z każdą relacją we własnym wierszu. Tabela węzłów działa w podobny sposób, z wyjątkiem tego, że zawiera wiersz dla każdej jednostki. Właściwości można również powiązać zarówno z węzłami, jak i krawędziami. Właściwość jest atrybutem klucz-wartość, który jest zdefiniowany jako kolumna w tabeli węzła lub krawędzi. Na przykład węzeł gatunków ryb może zawierać właściwości do przechowywania wspólnych i naukowych nazw każdego gatunku. Właściwości są tworzone jako kolumny zdefiniowane przez użytkownika w tabeli FishSpecies. Tworząc tabelę węzłów, musisz uwzględnić przynajmniej jedną właściwość.

w przypadku większości operacji tabele węzłów i krawędzi działają tak, jak każda inna tabela zdefiniowana przez użytkownika SQL Server. Chociaż istnieje kilka ograniczeń-takich jak brak możliwości deklarowania tabel tymczasowych lub zmiennych tabel jako tabel węzłów lub krawędzi—przez większość czasu okaże się, że praca z tabelami Wykresów będzie znana.

gdzie rzeczy się trochę niejasne jest z samej bazy danych graph. Chociaż nazwa może sugerować, że tworzysz nowy typ obiektu bazy danych, tak nie jest. Graph database jest jedynie logiczną konstrukcją zdefiniowaną w bazie danych zdefiniowanej przez użytkownika, która może obsługiwać nie więcej niż jedną bazę grafów. Istnienie bazy danych grafów jest stosunkowo przejrzyste z zewnątrz i w większości przypadków nie jest czymś, o co trzeba się martwić. Podczas pracy z bazami danych grafów główny nacisk zostanie położony na tabele grafów i dane, które zawierają.

ogólnie rzecz biorąc, baza danych Wykresów nie zapewnia żadnych możliwości, których nie można osiągnąć przy użyciu tradycyjnych funkcji relacyjnych. Obietnica bazy danych grafów polega na możliwości bardziej efektywnego organizowania i odpytywania określonych typów danych. Firma Microsoft zaleca rozważenie wdrożenia bazy danych grafów w następujących okolicznościach:

  • musisz analizować wysoce Powiązane Dane i relacje między tymi danymi.
  • obsługujesz dane za pomocą złożonych relacji wielu do wielu, które stale się rozwijają.
  • pracujesz z danymi hierarchicznymi, próbując poruszać się po ograniczeniach typu danych Hierarchiid.

funkcje bazy danych Wykresów SQL Server są w pełni zintegrowane z silnikiem bazy danych, wykorzystując takie komponenty, jak procesor zapytań i silnik pamięci masowej. Dzięki tej integracji można korzystać z baz danych wykresów w połączeniu z szeroką gamą komponentów, w tym indeksami magazynu kolumn, usługami uczenia maszynowego, SSMS i różnymi innymi funkcjami i narzędziami.

Definiowanie tabel węzłów wykresu

aby utworzyć bazę danych wykresu w oparciu o model przedstawiony na poprzednim rysunku, należy utworzyć trzy tabele węzłów i trzy tabele krawędzi. Firma Microsoft zaktualizowała instrukcję CREATE TABLE w SQL Server 2017, aby zawierała opcje definiowania dowolnego typu tabeli. Jak już wspomniano, można tworzyć tabele w dowolnych bazach danych zdefiniowanych przez użytkownika. Dla przykładów w tym artykule stworzyłem podstawową bazę danych o nazwie FishGraph, jak pokazano w poniższym kodzie T-SQL:

1
2
3
4
5
6

użyj master;
idź
upuść bazę danych, jeśli istnieje FishGraph;
idź
Utwórz bazę danych FishGraph;
idź

jak widzisz, nie ma tu nic specjalnego. Tworzysz bazę danych tak jak każda inna baza danych zdefiniowana przez użytkownika. Nie ma nic specjalnego, co trzeba zrobić, aby skonfigurować go do obsługi bazy danych grafów.

jeśli planujesz wypróbować te przykłady dla siebie, możesz użyć bazy danych FishGraph lub jednego z wybranych przez siebie. Niezależnie od tego, co zdecydujesz, następnym krokiem jest utworzenie tabeli węzłów FishSpecies za pomocą następującego polecenia CREATE TABLE:

1
2
3
4
5
6
7
8
9

użyj FishGraph;
idź
upuść tabelę, jeśli istnieje FishSpecies;
idź
Utwórz tabelę FishSpecies (
FishID INT identity PRIMARY KEY,
CommonName nvarchar(100) NOT NULL,
nvarchar(100) NOT NULL
) jako węzeł;

definicje kolumn powinny być dość proste. To, co jest tutaj ważne, to klauzula as NODE, którą musisz dołączyć, aby utworzyć tabelę węzłów. Kiedy określisz tę klauzulę, silnik bazy danych doda dwie kolumny do tabeli (do której wkrótce się przejdziemy) i utworzy unikalny, nieklastrowany indeks na jednej z tych kolumn.

możesz sprawdzić, czy tabela została utworzona jako tabela węzłów, odpytywając sys.widok tabel. Wraz z wydaniem SQL Server 2017 firma Microsoft zaktualizowała widok, aby uwzględnić kolumny bitów is_node i is_edge. Jeśli tabela jest tabelą węzła, wartość kolumny is_node jest ustawiona na 1, a wartość kolumny is_edge na 0. Jeśli tabela krawędzi, wartości są odwrócone. Poniższy przykład używa widoku, aby potwierdzić, że tabela gatunków ryb została poprawnie zdefiniowana:

1
2

wybierz is_node, is_edge z sys.tabele
WHERE name = „FishSpecies”;

instrukcja SELECT zwraca wyniki pokazane na poniższym rysunku, które wskazują, że FishSpecies zostało utworzone jako tabela węzłów.

Microsoft zaktualizował również sys.widok kolumn zawiera kolumny graph_type i graph_type_desc. Możesz użyć widoku i nowych kolumn, aby dowiedzieć się więcej o tabeli FishSpecies:

1
2
3

wybierz name, graph_type, graph_type_desc
z sys.columns
WHERE object_id = OBJECT_ID (’FishSpecies’);

poniższy rysunek przedstawia kolumny utworzone dla tabeli gatunków ryb.

podczas tworzenia tabeli węzłów silnik bazy danych dodaje kolumny graph_id_< hex_string>i $node_id_< hex_string> i tworzy unikalny, nieklastrowany indeks w kolumnie $node_id. Silnik bazy danych wykorzystuje pierwszą kolumnę do wewnętrznych operacji i udostępnia drugą kolumnę do zewnętrznego dostępu. Kolumna $node_id przechowuje unikalny identyfikator dla każdej jednostki, który można wyświetlić podczas zapytania o dane. To jedyna kolumna z tych dwóch, którymi musisz się zająć. W rzeczywistości, jeśli zapytasz tabelę bezpośrednio, zobaczysz tylko kolumnę $node_id, a nie kolumnę graph_id.

kolumny graph_type i graph_type_desc zwracane przez sys.widok kolumn jest specyficzny dla automatycznie generowanych kolumn w tabeli Wykresów. Kolumny wskazują typy kolumn generowanych przez silnik bazy danych. Typ jest oznaczany predefiniowaną wartością liczbową i powiązanym z nią opisem. Microsoft nie podaje zbyt wielu szczegółów na temat tych kodów i opisów, ale niektóre szczegóły można znaleźć w architekturze Microsoft document SQL Graph. Ponownie, Twoim głównym zmartwieniem jest kolumna $node_id i dane w niej zawarte.

po utworzeniu tabeli możesz rozpocząć dodawanie danych. Uruchomienie instrukcji INSERT przeciwko tabeli węzłów działa tak jak każda inna tabela. Można określić kolumny docelowe i ich wartości, jak pokazano w poniższym przykładzie:

1
2
3
4
5
6
7
8
9
10
11

INSERT INTO FishSpecies (CommonName, ScientificName) VALUES
(’Atlantic halibut’, 'Hippoglossus hippoglossus’),
(’Chinook salmon’, 'Oncorhynchus tshawytscha’),
(’European seabass’, 'Morone (Decentrarchus) labrax’),
(’Gizzard shad’, 'Dorosoma cepedianum’),
(’Japanese striped knife jaw’, „Oplegnathus faciatus’),
(’szczupak północny”, „Esox lucius’),
(’śledź pacyficzny”, „Clupea pallasi’),
(’pstrąg tęczowy”, „Oncorhynchus mykiss’),
(’Sola (Dover)”, „Solea solea’),
(’White bass’, 'Morone chrysops’);

oczywiście możesz dodać dowolne gatunki ryb, do których masz szczególny sentyment. Moje wybory były całkowicie arbitralne. Ale jeśli będziesz trzymać się moich danych, a następnie zapytasz tabelę FishSpecies, Twoje wyniki powinny wyglądać podobnie do tych na poniższym rysunku.

jak wspomniano powyżej, kolumna graph_id nie pojawia się w wynikach, ale kolumna $node_id, wraz z automatycznie wygenerowanymi wartościami. Silnik bazy danych tworzy każdą wartość jako ciąg JSON, który zapewnia Typ (węzeł lub krawędź), schemat, tabelę i wartość bigint unikalną dla każdego wiersza. Zgodnie z oczekiwaniami silnik bazy danych zwraca również wartości w kolumnach zdefiniowanych przez użytkownika, podobnie jak typowa tabela relacyjna.

następnym krokiem jest utworzenie i wypełnienie tabeli węzłów FishLover, przy użyciu następującego kodu T-SQL:

1
2
3
4
5
6
7
8
9
10
11
12

upuść tabelę, jeśli istnieje FishLover;
przejdź
Utwórz tabelę FishLover (
FishLoverID INT identity PRIMARY KEY,
Username nvarchar (50) NOT NULL,
) jako węzeł;
wstaw do FishLover (nazwa użytkownika) wartości
(’powerangler’),
(’jessie98′),
(’hooked’),
(’deepdive’),
(’underwatercasey’);

tabela zawiera tylko dwie kolumny zdefiniowane przez użytkownika-FishLoverID i UserName-ale można zdefiniować tyle kolumn, ile potrzeba. W zależności od charakteru aplikacji możesz na przykład podać imię i nazwisko, dane kontaktowe i inne szczegóły. Po utworzeniu tabeli można uruchomić zapytanie w celu weryfikacji danych. Twoje wyniki powinny wyglądać podobnie do tych pokazanych na poniższym rysunku.

następnie możesz wykonać te same kroki, aby utworzyć i wypełnić tabelę słupków rybnych, przekazując dowolny tekst wiadomości:

1
2
3
4
5
6
7
8
9
10
11
12
13

DROP TABLE jeśli istnieje FishPost;
PRZEJDŹ
UTWÓRZ TABELĘ FISHPOST (
IDENTYFIKATOR postID INT KLUCZ PODSTAWOWY,
Nagłówek NVARCHAR(50) not NULL,
NVARCHAR(800) NIE NULL
) JAKO WĘZŁA;
WSTAW W FISHPOST (Nagłówek, treść WIADOMOŚCI) WARTOŚCI
(„Ten, który uciekł”, „Nasz zespół jest dostępny, skontaktuj się z nami. Korzyść Eneasza jest zarezerwowana dla potrzeb.’),
(’ badania nad rybami”, ” penatibus venenatis, nascetur ridiculus mus.’),
(’Hook, line and sinker”, ” Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.’),
(’tak wiele ryb, tak mało czasu”, ” Nullam dictum felis eu pede mollis pretium. Integer tincidunt.’),
(’moja ulubiona ryba”, ” Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.’);

poniższy rysunek pokazuje wyniki, które można zobaczyć, jeśli utknąłeś z danymi Lorem Ipsum.

to wszystko do tworzenia i wypełniania tabel węzłów. Z wyjątkiem klauzuli as NODE w instrukcji CREATE TABLE, większość pozostałych elementów jest typu business as usual.

Definiowanie tabel krawędzi wykresu

Tworzenie tabeli krawędzi jest podobne do tworzenia tabeli węzłów, z tym wyjątkiem, że musisz określić klauzulę as EDGE, a nie as node. Na przykład, aby utworzyć tabelę Posts, użyj następującej instrukcji CREATE TABLE:

1
2
3
4
5

upuść tabelę, jeśli istnieją posty;
idź
Utwórz posty w tabeli (
ważny BIT FLAG nie NULL Domyślnie 0
) jako krawędź;

definicja tabeli jest podobna do tabeli węzłów z tym wyjątkiem, że nie zawiera kolumny klucza podstawowego (i oczywiście przyjmuje klauzulę as EDGE). W takim przypadku klucz podstawowy nie jest konieczny, ale jeśli w pewnym momencie stwierdzisz, że potrzebujesz klucza podstawowego, z pewnością możesz go dodać. (Wkrótce zobaczysz, dlaczego klucze podstawowe są przydatne w tabelach węzłów.)

zauważ, że definicja tabeli zawiera również ważną kolumnę Flag. Dodałem to przede wszystkim, aby zademonstrować, że możesz dodawać kolumny zdefiniowane przez użytkownika do tabeli krawędzi, tak jak w przypadku tabel węzłów. W przeciwieństwie do tabeli węzłów, która musi zawierać co najmniej jedną kolumnę zdefiniowaną przez użytkownika, Tworzenie tabeli krawędzi nie jest rzadkością.

po utworzeniu tabeli edge możesz sprawdzić, czy została ona poprawnie zdefiniowana przez zapytanie sys.widok tabel, jak widziałeś wcześniej:

1
2

wybierz is_node, is_edge z sys.tabele
WHERE name = „Posts’;

jeśli zrobiłeś wszystko dobrze, Twoje wyniki powinny wyglądać jak na poniższym rysunku.

możesz również odpytywać sys.widok tabel, aby zweryfikować szczegóły kolumn, tak jak wcześniej:

1
2
3

wybierz name, graph_type, graph_type_desc
z sys.columns
WHERE object_id = OBJECT_ID (’Posts’);

poniższy rysunek pokazuje wyniki zwrócone w moim systemie.

jak widać, silnik bazy danych dodaje osiem kolumn do tabeli krawędzi, a nie dwie z tabelami węzłów. Ponownie, zapoznaj się z dokumentem SQL Graph Architecture, aby uzyskać opisy każdego typu kolumn. Że większość tych kolumn jest używana przez silnik bazy danych do wewnętrznych operacji. Należy przede wszystkim zająć się następującymi trzema kolumnami:

  • kolumna $ edge_id_< hex_string> jednoznacznie identyfikuje każdą relację.
  • kolumna $from_id_<hex_string> przechowuje wartość $node_id powiązaną z encją w tabeli, z której pochodzi relacja.
  • kolumna $to_id_<hex_string> przechowuje wartość $node_id powiązaną z encją w tabeli, w której kończy się relacja.

podobnie jak w przypadku kolumny $node_id w tabeli węzłów, silnik bazy danych automatycznie generuje wartości dla kolumny $edge_id. Aby zdefiniować relację, musisz jednak dodać wartości do kolumn $from_id i $to_id. Aby zademonstrować, jak to działa, zaczniemy od jednego rekordu:

1
2
3

INSERT INTO posts ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 1),
(SELECT $node_id FROM FishPost WHERE PostID = 3));

instrukcja INSERT definiuje relację w tabeli Posts pomiędzy podmiotem FishLover, którego wartość FishLoverID wynosi 1, A podmiotem FishPost, którego wartość PostID wynosi 3. Zauważ, że możesz używać aliasów $node_id, $from_id i $to_id do odwoływania się do kolumn docelowych, bez konieczności wymyślania ciągów szesnastkowych.

aby dodać dane do kolumny $from_id, musisz podać wartość $node_id powiązaną z encją FishLover. Jednym ze sposobów uzyskania tej wartości jest włączenie podquery, która jest skierowana na encję, używając jej podstawowej wartości klucza. To samo można zastosować dla kolumny $from_id.

wstawianie danych w ten sposób pokazuje, dlaczego warto dodawać klucze podstawowe do tabel węzłów, ale nie jest to konieczne w przypadku tabel krawędzi. Klucze podstawowe w tabelach węzłów znacznie ułatwiają podanie wartości $node_id do instrukcji INSERT.

jeśli teraz zapytasz tabelę Posts, Twoje wyniki powinny wyglądać podobnie do tych pokazanych na poniższym rysunku.

tabela powinna zawierać nową relację, z wartością domyślną ImportantFlag ustawioną na 0. Możesz teraz dodać kilka wierszy, używając następujących instrukcji INSERT:

1
2
3
4
5
6
7
8
9
10
11
12

INSERT INTO posts ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 3),
(SELECT $node_id FROM FishPost WHERE PostID = 2));
INSERT INTO posts ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 2),
(SELECT $node_id FROM FishPost WHERE PostID = 5));
INSERT INTO posts ($from_id, $to_id, ImportantFlag) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 5),
(SELECT $node_id FROM FishPost WHERE PostID = 4), 1);
wstaw do postów ($from_id, $to_id, ImportantFlag) wartości (
(wybierz $node_id z FishLover, gdzie FishLoverID = 4),
(SELECT $node_id FROM FishPost WHERE PostID = 1), 1);

zauważ, że dwa ostatnie polecenia INSERT również dostarczają wartości dla ważnej kolumny FLAG. Podczas odpytywania tabeli Posts wyniki powinny teraz zawierać wszystkie pięć wierszy.

następnym krokiem jest utworzenie i wypełnienie tabeli polubień przy użyciu następującego kodu T-SQL:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE IF EXISTS Likes;
GO
CREATE TABLE Likes AS EDGE;
INSERT INTO Likes ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 3),
(SELECT $node_id FROM FishSpecies WHERE FishID = 8));
INSERT INTO Likes ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 5),
(SELECT $node_id FROM FishPost WHERE PostID = 4));
INSERT INTO Likes ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 1),
(SELECT $node_id FROM FishLover WHERE FishLoverID = 4));

możesz oczywiście zdefiniować dowolne relacje. Ważne jest, aby zauważyć, że nie jesteś ograniczony do jednego zestawu węzłów. Na przykład, pierwsze polecenie INSERT tworzy relację między FishLover i FishSpecies, drugie polecenie tworzy relację między FishLover i FishPost, a trzecie polecenie tworzy relację między FishLover i FishLover. To daje nam wyniki zapytania pokazane na poniższym rysunku.

możesz zastosować to samo podejście podczas tworzenia i wypełniania tabeli LinksTo:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE IF EXISTS Linkssto;
GO
CREATE TABLE Linkssto AS EDGE;
INSERT INTO Linkssto ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishPost WHERE PostID = 2),
(SELECT $node_id FROM FishSpecies WHERE FishID = 6));
INSERT INTO Linkssto ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishPost WHERE PostID = 4),
(SELECT $node_id FROM FishLover WHERE FishLoverID = 1));
INSERT INTO Linkssto ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishPost WHERE PostID = 3),
(SELECT $node_id FROM FishPost WHERE PostID = 5));

poniższy rysunek pokazuje, jak powinny wyglądać dane po dodaniu do tabeli, zakładając, że zastosowałeś się do przykładu.

dzięki bazie danych wykresów można dodać szeroki zakres relacji między węzłami wyjściowymi i końcowymi. Można również łatwo włączyć zmiany do modelu wykresu. Na przykład możesz zdecydować się na dodanie tabeli węzła FishRecipes do przechowywania przepisów na ryby, które użytkownicy publikują na forum, w takim przypadku możesz wykorzystać istniejące posty, Polubienia i linki do tabel krawędzi.

przechodzenie do przodu z graph Databases

Ponieważ Microsoft zawiera funkcje graph database jako część silnika bazy danych SQL Server, możesz je łatwo wypróbować bez konieczności instalowania lub rekonfigurowania żadnych komponentów. Co najlepsze, możesz używać tych samych narzędzi i procedur, których używałeś przez cały czas, do tworzenia i wypełniania tabel węzłów i krawędzi. W kolejnych artykułach omówimy, jak wyszukiwać i modyfikować dane Wykresów,a także przyjrzymy się bliżej pracy z danymi hierarchicznymi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.