série zatím:

  1. databáze grafů SQL Server – Část 1: Úvod
  2. databáze grafů SQL Server – Část 2: dotazování dat v databázi grafů
  3. databáze grafů SQL Server – Část 3: úprava dat v databázi grafů
  4. databáze grafů SQL Server-Část 4: Práce s hierarchickými daty v databázi grafů
  5. databáze grafů SQL Server-Část 5: Import relačních dat do databáze grafů

s vydáním SQL Server 2017 společnost Microsoft přidala podporu pro databáze grafů pro lepší zpracování datových sad, které obsahují složité vztahy entit, jako je typ dat generovaných webem sociálních médií, kde můžete mít kombinaci mnoha až mnoha vztahů, které se často mění. Databáze grafů používají stejné struktury tabulek nalezené v tradičních databázích SQL Serveru a podporují stejné nástroje a příkazy T-SQL, ale také obsahují funkce pro ukládání a navigaci složitých vztahů.

tento článek je první ze série o databázích grafů SQL Server. Článek vás seznámí se základními koncepty grafů a ukazuje, jak vytvářet a naplňovat grafové tabulky pomocí SQL Server Management Studio (SSMS) a místní instance SQL Server 2017. V následujících článcích se podíváme na to, jak dotazovat databázi grafů a upravit její data, ale pro tento článek Začínáme se základy.

databáze grafů SQL Server

databáze grafů SQL Server mohou pomoci zjednodušit proces modelování dat, která obsahují složité vztahy mezi mnoha a mnoha. V jeho nejzákladnější, databáze grafů je sbírka uzlů a hran, které společně definují různé typy vztahů. Uzel je entita, jako je osoba nebo umístění. Okraj je vztah mezi dvěma entitami. Například, může existovat vztah mezi místem, jako je Toledo, a osobou jménem Chris, který žije v Toledu. Chris a Toledo jsou entity, a „lives in“ je vztah mezi nimi.

tabulka uzlů v SQL Serveru je sbírka podobných entit a tabulka okrajů je sbírka podobných vztahů. Chcete-li pomoci pochopit, jak to funguje, zvažte grafový model zobrazený na následujícím obrázku, který je založen na fiktivním fóru milovníků ryb. Model obsahuje tři uzly (FishSpecies, FishLover a FishPost) a tři hrany (Likes, Posts a LinksTo).

obdélníky představují uzly a šipky spojující uzly představují hrany, přičemž šipky směřují ve směru vztahu. Například, hrany lajků mohou definovat některý z následujících vztahů:

  • milovník ryb má rád druhy ryb.
  • milovník ryb má rád příspěvek o rybách.
  • milovník ryb má rád jiného milovníka ryb.

všechny tři vztahy můžete reprezentovat jako data v jedné hraně tabulky v databázi grafů, přičemž každý vztah ve svém vlastním řádku. Tabulka uzlů funguje téměř stejným způsobem, kromě toho, že obsahuje řádek pro každou entitu. Vlastnosti Můžete také přiřadit k uzlům i hranám. Vlastnost je atribut klíčové hodnoty, který je definován jako sloupec v tabulce uzlů nebo hran. Například uzel FishSpecies může obsahovat vlastnosti pro ukládání společných a vědeckých názvů každého druhu. Vlastnosti jsou vytvořeny jako uživatelem definované sloupce v tabulce FishSpecies. Při vytváření tabulky uzlů musíte zahrnout alespoň jednu vlastnost.

pro většinu operací fungují tabulky uzlů a hran stejně jako každá jiná tabulka definovaná uživatelem SQL Server. I když existuje několik omezení-například není možné deklarovat dočasné tabulky nebo proměnné tabulky jako tabulky uzlů nebo hran-většinu času zjistíte, že práce s grafovými tabulkami bude známým územím.

kde jsou věci trochu nejasné, je samotná databáze grafů. Ačkoli název může naznačovat, že vytváříte nový typ databázového objektu, není tomu tak. Databáze grafů je pouze logický konstrukt definovaný v uživatelem definované databázi, která nemůže podporovat více než jednu databázi grafů. Existence databáze grafů je z vnějšku relativně průhledná a z větší části není něco, čeho byste se měli obávat. Při práci s databázemi grafů se primárně zaměříte na tabulky grafů a data, která obsahují.

databáze grafů obecně neposkytuje žádné funkce, kterých nelze dosáhnout pomocí tradičních relačních funkcí. Příslib databáze grafů spočívá v tom, že je schopen efektivněji organizovat a dotazovat se na určité typy dat. Společnost Microsoft doporučuje zvážit implementaci databáze grafů za následujících okolností:

  • musíte analyzovat vysoce propojená data a vztahy mezi těmito daty.
  • podporujete data složitými vztahy mezi mnoha a mnoha, které se neustále vyvíjejí.
  • pracujete s hierarchickými daty a zároveň se snažíte orientovat v omezeních datového typu HierarchyID.

funkce databáze grafů SQL Serveru jsou plně integrovány do databázového stroje a využívají takové komponenty, jako je procesor dotazů a modul úložiště. Díky této integraci můžete používat databáze grafů ve spojení s širokou škálou komponent, včetně indexů columnstore, služeb strojového učení, SSM a různých dalších funkcí a nástrojů.

definování tabulek uzlů grafů

Chcete-li vytvořit databázi grafů založenou na modelu zobrazeném na předchozím obrázku, musíte vytvořit tři tabulky uzlů a tři tabulky okrajů. Společnost Microsoft aktualizovala příkaz Vytvořit tabulku v SQL Server 2017, aby zahrnovala možnosti pro definování obou typů tabulky. Jak již bylo uvedeno, tabulky můžete vytvořit v libovolných uživatelem definovaných databázích. Pro příklady v tomto článku, vytvořil jsem základní databázi s názvem FishGraph, jak je uvedeno v následujícím kódu T-SQL:

1
2
3
4
5
6

použijte master;
GO
DROP databáze, pokud existuje FishGraph;
GO
vytvořit databázi FishGraph;
GO

jak vidíte, nic zvláštního se tu neděje. Databázi vytvoříte stejně jako každá jiná uživatelem definovaná databáze. Není nic zvláštního, co musíte udělat, abyste jej nastavili tak, aby podporovali databázi grafů.

pokud máte v plánu vyzkoušet tyto příklady pro sebe, můžete použít databázi FishGraph nebo jeden z vašeho vlastního výběru. Ať už se rozhodnete cokoli, dalším krokem je vytvoření tabulky uzlů FishSpecies pomocí následujícího příkazu Vytvořit tabulku:

1
2
3
4
5
6
7
8
9

použijte FishGraph;
GO
DROP TABLE, pokud existuje FishSpecies;
GO
vytvořit tabulku FishSpecies (
FishID int IDENTITY primární klíč,
CommonName NVARCHAR(100) NOT NULL,
ScientificName NVARCHAR(100) NOT NULL
) jako uzel;

definice sloupců by měly být poměrně jednoduché. Důležité je klauzule as NODE, kterou musíte zahrnout, abyste vytvořili tabulku uzlů. Když zadáte tuto klauzuli, databázový stroj přidá do tabulky dva sloupce (ke kterým se brzy dostaneme) a vytvoří jedinečný index bez klastrů na jednom z těchto sloupců.

dotazem na sys můžete ověřit, zda byla tabulka vytvořena jako tabulka uzlů.zobrazení tabulek. S vydáním SQL Server 2017 Společnost Microsoft aktualizovala pohled tak, aby zahrnoval bitové sloupce is_node a is_edge. Pokud je tabulka tabulkou uzlu, hodnota sloupce is_node je nastavena na 1 a hodnota sloupce is_edge je nastavena na 0. Pokud je tabulka hran, hodnoty jsou obráceny. Následující příklad používá pohled k potvrzení, že tabulka FishSpecies byla správně definována:

1
2

vyberte is_node, is_edge ze sys.tabulky
kde name = ‚FishSpecies‘;

příkaz SELECT vrací výsledky zobrazené na následujícím obrázku, které naznačují, že FishSpecies byl vytvořen jako tabulka uzlů.

Microsoft také aktualizoval sys.zobrazení sloupců zahrnuje sloupce graph_type a graph_type_desc. Pomocí zobrazení a nových sloupců se můžete dozvědět více o tabulce FishSpecies:

1
2
3

vyberte název, graph_type, graph_type_desc
ze sys.sloupce
kde object_id = OBJECT_ID (‚FishSpecies‘);

následující obrázek ukazuje sloupce vytvořené pro tabulku FishSpecies.

když vytvoříte tabulku uzlů, databázový stroj přidá sloupce graph_id_<hex_string> a $node_id_<hex_string> a vytvoří jedinečný index bez klastrů ve sloupci $node_id. Databázový stroj používá první sloupec pro interní operace a druhý sloupec je k dispozici pro externí přístup. Sloupec $node_id ukládá pro každou entitu jedinečný identifikátor, který můžete zobrazit při dotazování na data. Toto je jediný sloupec dvou, se kterými se musíte zabývat. Ve skutečnosti, pokud byste se dotazovali přímo na tabulku, viděli byste pouze sloupec $node_id, nikoli sloupec graph_id.

sloupce graph_type a graph_type_desc vrácené sys.zobrazení sloupců je specifické pro automaticky generované sloupce v tabulce grafů. Sloupce označují typy sloupců, které databázový stroj vygeneroval. Typ je označen předdefinovanou číselnou hodnotou a jejím souvisejícím popisem. Společnost Microsoft neposkytuje mnoho podrobností o těchto kódech a popisech, ale některé podrobnosti najdete v architektuře Microsoft document SQL Graph. Opět je vaším hlavním zájmem sloupec $node_id a data, která obsahuje.

po vytvoření tabulky můžete začít přidávat data. Spuštění příkazu INSERT proti tabulce uzlů funguje stejně jako každá jiná tabulka. Zadáte cílové sloupce a jejich hodnoty, jak je uvedeno v následujícím příkladu:

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‘),
(‚štika Severní“, „Esox lucius‘),
(‚sleď obecný“, „Clupea pallasi‘),
(‚pstruh duhový“, „Oncorhynchus mykiss‘),
(‚Sole (Dover)“, „Solea solea‘),
(‚White bass‘, ‚Morone chrysops‘);

samozřejmě můžete přidat jakýkoli druh ryb, pro který máte zvláštní zálibu. Moje volby zde byly zcela svévolné. Ale pokud se budete držet mých údajů a poté se dotazujete na tabulku FishSpecies, vaše výsledky by měly vypadat podobně jako na následujícím obrázku.

jak bylo uvedeno výše, sloupec graph_id se ve výsledcích nezobrazuje, ale sloupec $node_id Ano, doplněný automaticky generovanými hodnotami. Databázový stroj vytvoří každou hodnotu jako řetězec JSON, který poskytuje Typ (uzel nebo okraj), schéma, tabulku a hodnotu BIGINT jedinečnou pro každý řádek. Podle očekávání databázový stroj také vrací hodnoty v uživatelem definovaných sloupcích, stejně jako typická relační tabulka.

dalším krokem je vytvoření a naplnění tabulky uzlů FishLover pomocí následujícího kódu T-SQL:

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

DROP tabulka, pokud existuje FishLover;
GO
vytvořit tabulku FishLover (
FishLoverID int IDENTITY primární klíč,
uživatelské jméno nvarchar (50) NOT NULL,
) jako uzel;
vložit do FishLover (uživatelské jméno) hodnoty
(‚powerangler‘),
(‚jessie98‘),
(‚zahnutý‘),
(‚deepdive‘),
(‚pod vodou‘);

tabulka obsahuje pouze dva uživatelem definované sloupce-FishLoverID a UserName-ale můžete definovat tolik sloupců podle potřeby. Například, možná budete chtít zahrnout jméno a příjmení, kontaktní informace, a další podrobnosti, v závislosti na povaze aplikace. Jakmile vytvoříte tabulku, můžete spustit dotaz k ověření dat. Vaše výsledky by měly vypadat podobně jako výsledky uvedené na následujícím obrázku.

poté můžete provést stejné kroky k vytvoření a naplnění tabulky FishPost, předávání jakéhokoli textu zprávy, který si přejete:

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

DROP tabulka, pokud existuje FishPost;
GO
CREATE TABLE FishPost (
PostID int IDENTITY PRIMARY KEY,
Title NVARCHAR(50) NOT NULL,
MessageText NVARCHAR(800) NOT NULL
) jako uzel;
INSERT INTO FishPost (Title, MessageText) VALUES
(„ten, který se dostal pryč“, “ náš tým je k dispozici, kontaktujte nás. Aeneas výhoda vyhrazena potřeby.‘),
(‚studie o rybách“, “ penatibus venenatis, nascetur ridiculus mus.‘),
(‚Hook, line and Platin ‚, ‚ Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.‘),
(‚tolik ryb, tak málo času“, “ Nullam dictum felis eu pede mollis pretium. Celočíselný tincidunt.‘),
(‚moje oblíbená ryba“, “ Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.‘);

následující obrázek ukazuje výsledky, které byste viděli, pokud jste uvízli s daty Lorem Ipsum.

to je vše, co je k vytvoření a vyplnění tabulky uzlů. Kromě klauzule as NODE v příkazu Vytvořit tabulku je většina ostatních věcí obvyklá.

definování tabulek hran grafu

vytvoření tabulky hran je podobné vytvoření tabulky uzlů, kromě toho, že musíte zadat klauzuli as EDGE spíše než klauzuli as NODE. Chcete-li například vytvořit tabulku příspěvků, použijte následující příkaz Vytvořit tabulku:

1
2
3
4
5

DROP tabulka, pokud existuje příspěvky;
GO
vytvořit tabulky příspěvků (
ImportantFlag BIT NOT NULL DEFAULT 0
) jako okraj;

definice tabulky je podobná tabulce uzlu, kromě toho, že neobsahuje sloupec primárního klíče (a samozřejmě má klauzuli as EDGE). V tomto případě není primární klíč nutný, ale pokud v určitém okamžiku zjistíte, že potřebujete primární klíč, určitě jej můžete přidat. (Brzy uvidíte, proč jsou primární klíče užitečné pro tabulky uzlů.)

Všimněte si, že definice tabulky obsahuje také sloupec ImportantFlag. Zahrnul jsem to především proto, abych ukázal, že do tabulky edge můžete přidat uživatelem definované sloupce, stejně jako u tabulek uzlů. To znamená, že není neobvyklé vytvořit tabulku okrajů bez uživatelem definovaných sloupců, na rozdíl od tabulky uzlů, která musí obsahovat alespoň jeden uživatelem definovaný sloupec.

po vytvoření tabulky edge můžete ověřit, zda byla správně definována dotazem na sys.zobrazení tabulek, jak jste viděli dříve:

1
2

vyberte is_node, is_edge ze sys.tabulky
kde name = ‚příspěvky‘;

pokud jste udělali všechno správně, vaše výsledky by měly vypadat jako na následujícím obrázku.

můžete také dotaz sys.zobrazení tabulek pro ověření podrobností sloupce, stejně jako předtím:

1
2
3

vyberte název, graph_type, graph_type_desc
ze sys.sloupce
kde object_id = OBJECT_ID (‚příspěvky‘);

následující obrázek ukazuje výsledky vrácené v mém systému.

jak vidíte, databázový stroj přidává osm sloupců do tabulky hran, spíše než dva, které jste viděli s tabulkami uzlů. Popisy jednotlivých typů sloupců naleznete v dokumentu SQL Graph Architecture. Že většina z těchto sloupců jsou používány databázovým strojem pro interní operace. Musíte se zabývat především následujícími třemi sloupci:

  • sloupec $edge_id_<hex_string> jednoznačně identifikuje každý vztah.
  • sloupec $from_id_<hex_string> ukládá hodnotu $node_id přidruženou k entitě v tabulce, odkud vztah pochází.
  • sloupec $to_id_<hex_string> ukládá hodnotu $node_id přidruženou k entitě v tabulce, kde vztah končí.

stejně jako u sloupce $node_id v tabulce uzlů generuje databázový stroj automaticky hodnoty pro sloupec $ edge_id. Chcete-li definovat vztah, musíte specificky přidat hodnoty do sloupců $from_id a $to_id. Chcete-li ukázat, jak to funguje, začneme s jediným záznamem:

1
2
3

vložit do příspěvků ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishLover, kde FishLoverID = 1),
(vyberte $node_id z FishPost kde PostID = 3));

příkaz INSERT definuje vztah v tabulce příspěvků mezi entitou FishLover, jejíž hodnota FishLoverID je 1, a entitou FishPost, jejíž hodnota PostID je 3. Všimněte si, že můžete použít aliasy $node_id, $from_id a $to_id pro odkaz na cílové sloupce, aniž byste museli přicházet s hexadecimálními řetězci.

Chcete-li přidat data do sloupce $from_id, musíte zadat hodnotu $node_id přidruženou k entitě FishLover. Jedním ze způsobů, jak získat tuto hodnotu, je zahrnout poddotaz, který se zaměřuje na entitu, pomocí její primární hodnoty klíče. Stejný přístup můžete použít pro sloupec $from_id.

vložení dat tímto způsobem ukazuje, proč je užitečné přidat primární klíče do tabulek uzlů, ale není nutné pro tabulky okrajů. Primární klíče v tabulkách uzlů usnadňují poskytnutí hodnoty $node_id příkazu INSERT.

pokud se nyní dotazujete na tabulku příspěvků, vaše výsledky by měly vypadat podobně jako výsledky uvedené na následujícím obrázku.

tabulka by měla obsahovat nový vztah s ImportantFlag nastavenou na 0, výchozí. Nyní můžete přidat několik dalších řádků pomocí následujících příkazů vložit:

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

vložit do příspěvků ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishLover, kde FishLoverID = 3),
(vyberte $node_id z FishPost kde PostID = 2));
vložit do příspěvků ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishLover, kde FishLoverID = 2),
(vyberte $node_id z FishPost kde PostID = 5));
vložit do příspěvků ($from_id, $to_id, ImportantFlag) hodnoty (
(vyberte $node_id z FishLover, kde FishLoverID = 5),
(vyberte $node_id z FishPost kde PostID = 4), 1);
vložit do příspěvků ($from_id, $to_id, ImportantFlag) hodnoty (
(vyberte $node_id z FishLover, kde FishLoverID = 4),
(vyberte $node_id z FishPost kde PostID = 1), 1);

Všimněte si, že poslední dva příkazy INSERT také poskytují hodnotu pro sloupec ImportantFlag. Když se dotazujete na tabulku příspěvků, vaše výsledky by nyní měly obsahovat všech pět řádků.

dalším krokem je vytvoření a naplnění tabulky lajků pomocí následujícího kódu T-SQL:

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

DROP TABLE, pokud existuje Líbí;
GO
CREATE TABLE Likes AS EDGE;
INSERT INTO Likes ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishLover WHERE FishLoverID = 3),
(vyberte $node_id z FishSpecies kde FishID = 8));
vložit do Likes ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishLover kde FishLoverID = 5),
(vyberte $node_id z FishPost kde PostID = 4));
vložit do Likes ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishLover kde FishLoverID = 1),
(vyberte $node_id z FishLover kde FishLoverID = 4));

můžete, samozřejmě, definovat všechny vztahy, které chcete. Důležitým bodem, který je třeba si všimnout, je, že nejste omezeni na žádnou sadu uzlů. Například, první příkaz INSERT vytváří vztah mezi FishLover a FishSpecies, druhé prohlášení vytváří vztah mezi FishLover a FishPost, a třetí příkaz vytváří vztah mezi FishLover a FishLover. To nám dává výsledky dotazu zobrazené na následujícím obrázku.

stejný přístup můžete použít při vytváření a vyplňování tabulky LinksTo:

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

DROP TABLE pokud existuje LinksTo;
GO
CREATE TABLE LinksTo AS EDGE;
INSERT INTO LinksTo ($from_id, $to_id) VALUES (
(SELECT $node_id FROM FishPost WHERE PostID = 2),
(vyberte $node_id z FishSpecies kde FishID = 6));
vložit do LinksTo ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishPost, kde PostID = 4),
(vyberte $node_id z FishLover kde FishLoverID = 1));
vložit do LinksTo ($from_id, $to_id) hodnoty (
(vyberte $node_id z FishPost, kde PostID = 3),
(vyberte $node_id z FishPost kde PostID = 5));

následující obrázek ukazuje, jak by měla data vypadat po přidání do tabulky, za předpokladu, že jste postupovali podle příkladu.

pomocí databáze grafů můžete přidat širokou škálu vztahů mezi počátečními a ukončujícími uzly. Můžete také snadno začlenit změny do grafového modelu. Můžete se například rozhodnout přidat tabulku uzlů FishRecipes pro ukládání receptů na ryby, které uživatelé zveřejňují na fóru, v takovém případě můžete využít stávající tabulky příspěvků, lajků a LinksTo edge.

posun vpřed s databázemi grafů

protože společnost Microsoft obsahuje funkce databáze grafů jako součást databázového stroje SQL Server, můžete je snadno vyzkoušet, aniž byste museli instalovat nebo překonfigurovat jakékoli komponenty. Nejlepší ze všeho je, že můžete použít stejné nástroje a postupy, které jste používali po celou dobu k vytvoření a naplnění tabulek uzlů a hran. V následujících článcích se budeme zabývat tím, jak dotazovat a upravovat data grafu a blíže se podívat na práci s hierarchickými daty, takže nezapomeňte zůstat naladěni.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.