Architektura programu SQL Graph
Dotyczy: SQL Server 2017 (14.x) i nowsze wersje
Azure SQL Database
Azure SQL Managed Instance
SQL Database w usłudze Microsoft Fabric
Dowiedz się więcej o architekturze programu SQL Graph. Znajomość podstaw ułatwia zrozumienie innych artykułów dotyczących programu SQL Graph.
Baza danych programu SQL Graph
Użytkownicy mogą tworzyć jeden graf na bazę danych. Graf to kolekcja tabel węzłów i krawędzi. Tabele węzłów lub krawędzi można tworzyć w dowolnym schemacie w bazie danych, ale wszystkie należą do jednego grafu logicznego. Tabela węzłów jest kolekcją podobnych typów węzłów. Na przykład tabela węzłów Person
zawiera wszystkie węzły Person
należące do grafu. Podobnie tabela krawędzi jest kolekcją podobnych typów krawędzi. Na przykład tabela krawędzi Friends
zawiera wszystkie krawędzie łączące Person
z innym Person
. Ponieważ węzły i krawędzie są przechowywane w tabelach, większość operacji obsługiwanych w zwykłych tabelach jest obsługiwana w tabelach węzłów lub krawędzi.
Na poniższym diagramie przedstawiono architekturę bazy danych programu SQL Graph.
Tabela węzłów
Tabela węzłów reprezentuje jednostkę w schemacie grafu. Za każdym razem, gdy jest tworzona tabela węzłów wraz z kolumnami zdefiniowanymi przez użytkownika, tworzona jest niejawna $node_id
kolumna, która unikatowo identyfikuje dany węzeł w bazie danych. Wartości w $node_id
są generowane automatycznie i są kombinacją identyfikatora obiektu dla tabeli grafów tej tabeli węzłów i wewnętrznie wygenerowanej wartości bigint. Jednak po wybraniu kolumny $node_id
zostanie wyświetlona obliczona wartość w postaci ciągu JSON. Ponadto $node_id
jest pseudokolumną, która mapuje na nazwę wewnętrzną z unikatowym sufiksem. Po wybraniu pseudokolumny $node_id
z tabeli nazwa kolumny będzie wyświetlana jako $node_id_<unique suffix>
.
Nuta
Używanie pseudokolumny w zapytaniach jest jedynym obsługiwanym i zalecanym sposobem wykonywania zapytań względem wewnętrznej kolumny $node_id
. Nie należy bezpośrednio używać kolumn $node_id_<hex_string>
w żadnych zapytaniach.
Ponadto obliczona reprezentacja JSON wyświetlana w pseudo-kolumnach jest szczegółem implementacji. Nie należy stosować bezpośredniej zależności od formatu tej reprezentacji JSON. Jeśli musisz radzić sobie z tą reprezentacją JSON, rozważ użycie NODE_ID_FROM_PARTS() i innych powiązanych system functions.
Nie zaleca się bezpośredniego używania pseudo-kolumn grafu ($node_id
, $from_id
, $to_id
) w predykatach. Na przykład należy unikać predykatu takiego jak n.$node_id = e.$from_id
. Takie porównania wydają się być nieefektywne ze względu na konwersję na reprezentację JSON. Zamiast tego polegaj na funkcji MATCH tak daleko, jak to możliwe.
Zaleca się, aby użytkownicy utworzyli unikatowe ograniczenie lub indeks w kolumnie $node_id
podczas tworzenia tabeli węzłów, ale jeśli nie został utworzony, zostanie automatycznie utworzony domyślny unikatowy, nieklastrowany indeks. Jednak każdy indeks w pseudokolumnie grafu jest tworzony w podstawowych kolumnach wewnętrznych. Oznacza to, że indeks utworzony w kolumnie $node_id
jest wyświetlany w wewnętrznej kolumnie graph_id_<hex_string>
.
Tabela edge
Tabela krawędzi reprezentuje relację na grafie. Krawędzie są zawsze kierowane i łączą dwa węzły. Tabela krawędzi umożliwia użytkownikom modelowanie relacji wiele-do-wielu na wykresie. Kolumny zdefiniowane przez użytkownika ("atrybuty") są opcjonalne w tabeli krawędzi. Za każdym razem, gdy tabela brzegowa jest tworzona wraz z kolumnami zdefiniowanymi przez użytkownika, w tabeli krawędzi są tworzone trzy niejawne kolumny:
Nazwa kolumny | Opis |
---|---|
$edge_id |
Unikatowo identyfikuje daną krawędź w bazie danych. Jest to wygenerowana kolumna, a wartość jest kombinacją object_id tabeli krawędzi i wewnętrznie wygenerowaną wartością bigint. Jednak po wybraniu kolumny $edge_id zostanie wyświetlona obliczona wartość w postaci ciągu JSON.
$edge_id to pseudokolumna, która mapuje na nazwę wewnętrzną z unikatowym sufiksem. Po wybraniu $edge_id z tabeli nazwa kolumny będzie wyświetlana jako $edge_id_<unique suffix> . Używanie nazw pseudokolumny w zapytaniach jest zalecanym sposobem wykonywania zapytań względem wewnętrznej kolumny $edge_id i używania nazwy wewnętrznej z ciągiem szesnastkowym. |
$from_id |
Przechowuje $node_id węzła, z którego pochodzi krawędź. |
$to_id |
Przechowuje $node_id węzła, w którym kończy się krawędź. |
Węzły, z którymi dana krawędź może nawiązać połączenie, są kontrolowane przez dane wstawione w kolumnach $from_id
i $to_id
. W pierwszej wersji nie można zdefiniować ograniczeń w tabeli krawędzi, aby ograniczyć połączenie z dowolnym dwoma typami węzłów. Oznacza to, że krawędź może połączyć dowolne dwa węzły na grafie, niezależnie od ich typów.
Podobnie jak w kolumnie $node_id
, zaleca się, aby użytkownicy utworzyli unikatowy indeks lub ograniczenie w kolumnie $edge_id
w momencie utworzenia tabeli krawędzi, ale jeśli ta kolumna nie została utworzona, domyślny unikatowy indeks nieklastrowany zostanie automatycznie utworzony w tej kolumnie. Jednak każdy indeks w pseudokolumnie grafu jest tworzony w podstawowych kolumnach wewnętrznych. Oznacza to, że indeks utworzony w kolumnie $edge_id
jest wyświetlany w wewnętrznej kolumnie graph_id_<unique suffix>
. W przypadku scenariuszy OLTP zaleca się również utworzenie przez użytkowników indeksu w kolumnach ($from_id
, $to_id
) w celu szybszego wyszukiwania w kierunku krawędzi.
Na poniższym diagramie przedstawiono sposób przechowywania tabel węzłów i krawędzi w bazie danych.
Metadane
Użyj tych widoków metadanych, aby wyświetlić atrybuty węzła lub tabeli krawędzi.
sys.tables
Następujące kolumny bit
w sys.tables mogą służyć do identyfikowania tabel grafów. Jeśli is_node
jest ustawiona na 1, tabela jest tabelą węzłów, a jeśli is_edge
jest ustawiona na 1, tabela jest tabelą brzegową.
Nazwa kolumny | Typ danych | Opis |
---|---|---|
is_node | bit | W przypadku tabel węzłów is_node jest ustawiona na 1. |
is_edge | bit | W przypadku tabel krawędzi is_edge jest ustawiona na 1. |
sys.columns
Kolumny graph_type
i graph_type_desc
w widoku sys.columns
są przydatne w zrozumieniu różnych typów kolumn używanych w węźle grafu i tabelach krawędzi:
Nazwa kolumny | Typ danych | Opis |
---|---|---|
graph_type | Int | Kolumna wewnętrzna z zestawem wartości. Wartości są z zakresu od 1 do 8 dla kolumn grafu i NULL dla innych. |
graph_type_desc | nvarchar(60) | Kolumna wewnętrzna z zestawem wartości. |
W poniższej tabeli wymieniono prawidłowe wartości dla kolumny graph_type
:
Wartość kolumny | Opis |
---|---|
1 | GRAPH_ID |
2 | GRAPH_ID_COMPUTED |
3 | GRAPH_FROM_ID |
4 | GRAPH_FROM_OBJ_ID |
5 | GRAPH_FROM_ID_COMPUTED |
6 | GRAPH_TO_ID |
7 | GRAPH_TO_OBJ_ID |
8 | GRAPH_TO_ID_COMPUTED |
sys.columns
również przechowuje informacje o niejawnych kolumnach utworzonych w tabelach węzłów lub krawędzi. Poniższe informacje można pobrać z pliku sys.columns, jednak użytkownicy nie mogą wybierać tych kolumn z tabeli węzła lub krawędzi.
Niejawne kolumny w tabeli węzłów to:
Nazwa kolumny | Typ danych | is_hidden | Komentarz |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 1 | Wartość identyfikatora grafu wewnętrznego. |
$node_id_\<hex_string> |
NVARCHAR | 0 | Zewnętrzna, znakowa reprezentacja identyfikatora węzła. |
Niejawne kolumny w tabeli krawędzi to:
Nazwa kolumny | Typ danych | is_hidden | Komentarz |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 1 | Wartość identyfikatora grafu wewnętrznego. |
$edge_id_\<hex_string> |
NVARCHAR | 0 | Reprezentacja znaku identyfikatora krawędzi. |
from_obj_id_\<hex_string> |
INT | 1 | Wewnętrzna wartość object_id dla węzła "from node". |
from_id_\<hex_string> |
BIGINT | 1 | Wewnętrzna wartość identyfikatora grafu dla elementu "from node". |
$from_id_\<hex_string> |
NVARCHAR | 0 | reprezentacja znaku "from node". |
to_obj_id_\<hex_string> |
INT | 1 | Wewnętrzne object_id dla węzła "do". |
to_id_\<hex_string> |
BIGINT | 1 | Wewnętrzna wartość identyfikatora grafu dla węzła "do". |
$to_id_\<hex_string> |
NVARCHAR | 0 | Zewnętrzna reprezentacja znaku "do węzła". |
Funkcje systemowe
Poniższe wbudowane funkcje umożliwiają interakcję z pseudo-kolumnami w tabelach grafów. Szczegółowe odwołania są dostępne dla każdej z tych funkcji w odpowiednich odwołaniach funkcji języka T-SQL.
Wbudowane | Opis |
---|---|
OBJECT_ID_FROM_NODE_ID | Wyodrębnij identyfikator obiektu dla tabeli grafów z node_id . |
GRAPH_ID_FROM_NODE_ID | Wyodrębnij wartość identyfikatora grafu z node_id . |
NODE_ID_FROM_PARTS | Skonstruuj node_id z identyfikatora obiektu dla tabeli grafu i wartości identyfikatora grafu. |
OBJECT_ID_FROM_EDGE_ID | Wyodrębnij identyfikator obiektu dla tabeli grafów z edge_id . |
GRAPH_ID_FROM_EDGE_ID | Wyodrębnij wartość identyfikatora grafu dla danego edge_id . |
EDGE_ID_FROM_PARTS | Skonstruuj edge_id z identyfikatora obiektu dla tabeli grafu i wartości identyfikatora grafu. |
dokumentacja Transact-SQL
Poznaj rozszerzenia Transact-SQL wprowadzone w programie SQL Server i usłudze Azure SQL Database, które umożliwiają tworzenie i wykonywanie zapytań względem obiektów grafu. Rozszerzenia języka zapytań pomagają wykonywać zapytania i przechodzić przez graf przy użyciu składni sztuki ASCII.
Instrukcje języka Data Definition Language (DDL)
Zadanie | Powiązany artykuł | Notatki |
---|---|---|
CREATE TABLE | CREATE TABLE (Transact-SQL) |
CREATE TABLE jest teraz rozszerzona o obsługę tworzenia tabeli AS NODE lub AS EDGE. Tabela brzegowa nie jest wymagana do posiadania atrybutów zdefiniowanych przez użytkownika. |
ALTER TABLE | ALTER TABLE (Transact-SQL) | Tabele węzłów i krawędzi mogą być zmieniane w taki sam sposób, jak tabela relacyjna, przy użyciu ALTER TABLE . Użytkownicy mogą dodawać lub modyfikować kolumny, indeksy lub ograniczenia zdefiniowane przez użytkownika. Jednak zmiana wewnętrznych kolumn grafu, takich jak $node_id lub $edge_id , powoduje wystąpienie błędu. |
TWORZENIE INDEKSU | CREATE INDEX (Transact-SQL) | Użytkownicy mogą tworzyć indeksy w kolumnach pseudo-kolumnach i kolumnach zdefiniowanych przez użytkownika w tabelach węzłów i krawędzi. Obsługiwane są wszystkie typy indeksów, w tym klastrowane i nieklastrowane indeksy magazynu kolumn. |
TWORZENIE OGRANICZEŃ USŁUGI EDGE | ograniczenia usługi EDGE (Transact-SQL) | Użytkownicy mogą teraz tworzyć ograniczenia krawędzi w tabelach brzegowych w celu wymuszania określonych semantyki, a także zachować integralność danych |
DROP TABLE | DROP TABLE (Transact-SQL) | Tabele węzłów i krawędzi można porzucić tak samo jak tabela relacyjna przy użyciu DROP TABLE . Obecnie nie ma żadnych mechanizmów zapobiegania usuwaniu węzłów, do których odwołują się krawędzie. Nie ma obsługi kaskadowego usuwania krawędzi po usunięciu węzła (lub po usunięciu całej tabeli węzłów). We wszystkich takich przypadkach wszelkie krawędzie połączone z usuniętymi węzłami muszą zostać usunięte ręcznie, aby zachować spójność grafu. |
Instrukcje języka manipulowania danymi (DML)
Zadanie | Powiązany artykuł | Notatki |
---|---|---|
WSTAWIAĆ | INSERT (Transact-SQL) | Wstawianie do tabeli węzłów nie różni się od wstawiania do tabeli relacyjnej. Wartości kolumny $node_id są generowane automatycznie. Próba wstawienia wartości w kolumnie $node_id lub $edge_id powoduje wystąpienie błędu. Użytkownicy muszą podać wartości dla kolumn $from_id i $to_id podczas wstawiania do tabeli krawędzi.
$from_id i $to_id to wartości $node_id węzłów, z którymi łączy się dana krawędź. |
USUNĄĆ | DELETE (Transact-SQL) | Dane z tabel węzłów lub krawędzi można usuwać w taki sam sposób, jak dane są usuwane z tabel relacyjnych. Jednak w tej wersji nie ma żadnych ograniczeń, aby upewnić się, że żadne krawędzie nie wskazują usuniętego węzła i kaskadowego usuwania krawędzi po usunięciu węzła nie jest obsługiwane. Zaleca się, aby za każdym razem, gdy węzeł zostanie usunięty, wszystkie krawędzie łączące się z tym węzłem również zostaną usunięte. |
AKTUALIZACJA | UPDATE (Transact-SQL) | Wartości w kolumnach zdefiniowanych przez użytkownika można aktualizować przy użyciu instrukcji UPDATE. Nie można zaktualizować wewnętrznych kolumn grafu, $node_id , $edge_id , $from_id i $to_id . |
POŁĄCZYĆ | MERGE (Transact-SQL) | instrukcja MERGE jest obsługiwana w tabeli węzła lub krawędzi. |
Instrukcje zapytania
Zadanie | Powiązany artykuł | Notatki |
---|---|---|
WYBRAĆ | SELECT (Transact-SQL) | Ponieważ węzły i krawędzie są przechowywane jako tabele, większość operacji tabeli jest również obsługiwana w tabelach węzłów i krawędzi. |
ZAPAŁKA | MATCH (Transact-SQL) | Wbudowana funkcja MATCH jest wprowadzana w celu obsługi dopasowywania wzorców i przechodzenia przez graf. |
Ograniczenia
Istnieją pewne ograniczenia dotyczące tabel węzłów i krawędzi:
- Tabele lokalne lub globalne tabele tymczasowe nie mogą być tabelami węzłów ani krawędzi.
- Nie można zadeklarować typów tabel i zmiennych tabeli jako węzła ani tabeli krawędzi.
- Tabele węzłów i krawędzi nie mogą być tworzone jako tabele czasowe w wersji systemowej.
- Tabele węzłów i krawędzi nie mogą być tabelami zoptymalizowanymi pod kątem pamięci.
- Użytkownicy nie mogą aktualizować kolumn
$from_id
i$to_id
krawędzi przy użyciu instrukcji UPDATE. Aby zaktualizować węzły, do których odwołuje się krawędź, użytkownicy muszą wstawić nową krawędź wskazującą nowe węzły i usunąć poprzednią. - Zapytania między bazami danych na obiektach grafu nie są obsługiwane.
- Pseudokolumny grafu (
node_id
,$from_id
,$to_id
iedge_id
) nie mogą być używane jako kolumny sortowania dla uporządkowanego klastrowanego indeksu magazynu kolumn. Próba użycia dowolnych pseudokolumny grafu jako kolumn sortowania dla uporządkowanego klastrowanego magazynu kolumn powoduje błądMsg 102: Incorrect syntax
. - W usłudze Fabric SQL Databaseprogram SQL Graph jest dozwolony, ale tabele node i Edge nie będą dublować w usłudze Fabric OneLake.
Zobacz też
Następne kroki
- Aby rozpocząć pracę z programem SQL Graph, zobacz SQL Graph Database — przykład