SQL Graph-architectuur
Van toepassing op: SQL Server 2017 (14.x) en latere versies
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Meer informatie over de architectuur van SQL Graph. Als u de basisprincipes kent, is het eenvoudiger om andere SQL Graph-artikelen te begrijpen.
SQL Graph-database
Gebruikers kunnen per database één grafiek maken. Een grafiek is een verzameling knooppunt- en edge-tabellen. Knooppunt- of edge-tabellen kunnen worden gemaakt onder elk schema in de database, maar ze behoren allemaal tot één logische grafiek. Een knooppunttabel is een verzameling van vergelijkbaar type knooppunten. Een Person
knooppunttabel bevat bijvoorbeeld alle Person
knooppunten die behoren tot een grafiek. Op dezelfde manier is een randtabel een verzameling van vergelijkbaar type randen. Een Friends
randtabel bevat bijvoorbeeld alle randen die een Person
verbinden met een andere Person
. Omdat knooppunten en randen worden opgeslagen in tabellen, worden de meeste bewerkingen die worden ondersteund in normale tabellen, ondersteund op knooppunt- of edge-tabellen.
In het volgende diagram ziet u de SQL Graph-databasearchitectuur.
Knooppunttabel
Een knooppunttabel vertegenwoordigt een entiteit in een grafiekschema. Telkens wanneer een knooppunttabel wordt gemaakt, samen met de door de gebruiker gedefinieerde kolommen, wordt een impliciete $node_id
kolom gemaakt, waarmee een bepaald knooppunt in de database uniek wordt geïdentificeerd. De waarden in $node_id
worden automatisch gegenereerd en zijn een combinatie van object-id voor de grafiektabel van die knooppunttabel en een intern gegenereerde bigint waarde. Wanneer de kolom $node_id
is geselecteerd, wordt echter een berekende waarde weergegeven in de vorm van een JSON-tekenreeks.
$node_id
is ook een pseudokolom die wordt toegewezen aan een interne naam met een uniek achtervoegsel. Wanneer u de $node_id
pseudokolom in de tabel selecteert, wordt de kolomnaam weergegeven als $node_id_<unique suffix>
.
Notitie
Het gebruik van pseudokolommen in query's is de enige ondersteunde en aanbevolen manier om query's uit te voeren op de interne $node_id
kolom. U moet de $node_id_<hex_string>
kolommen in query's niet rechtstreeks gebruiken.
Verder is de berekende JSON-weergave die wordt weergegeven in de pseudokolommen, een implementatiedetail. U moet geen directe afhankelijkheid nemen van de indeling van die JSON-weergave. Als u deze JSON-weergave moet verwerken, kunt u overwegen de NODE_ID_FROM_PARTS() en andere gerelateerde System Functionste gebruiken.
Het is niet raadzaam om de pseudokolommen van de grafiek ($node_id
, $from_id
, $to_id
) rechtstreeks te gebruiken in predicaten. Een predicaat zoals n.$node_id = e.$from_id
moet bijvoorbeeld worden vermeden. Dergelijke vergelijkingen zijn meestal inefficiënt, vanwege de conversie naar de JSON-weergave. Vertrouw in plaats daarvan zoveel mogelijk op de functie VERGELIJKEN.
Het wordt aanbevolen dat gebruikers op het moment van het maken van een knooppunttabel een unieke beperking of index maken op de $node_id
kolom, maar als deze niet wordt gemaakt, wordt automatisch een unieke, niet-geclusterde index gemaakt. Elke index van een pseudokolom in een grafiek wordt echter gemaakt op de onderliggende interne kolommen. Dat wil gezegd: een index die is gemaakt op de $node_id
kolom, wordt weergegeven in de interne graph_id_<hex_string>
kolom.
Edge-tabel
Een randtabel vertegenwoordigt een relatie in een grafiek. Randen worden altijd omgeleid en verbinden twee knooppunten. Met een randtabel kunnen gebruikers veel-op-veel-relaties modelleren in de grafiek. Door de gebruiker gedefinieerde kolommen (kenmerken) zijn optioneel in een randtabel. Telkens wanneer een edge-tabel wordt gemaakt, samen met de door de gebruiker gedefinieerde kolommen, worden er drie impliciete kolommen gemaakt in de randtabel:
Kolomnaam | Beschrijving |
---|---|
$edge_id |
Identificeert een bepaalde rand in de database op unieke wijze. Het is een gegenereerde kolom en de waarde is een combinatie van object_id van de randtabel en een intern gegenereerde bigint waarde. Wanneer de kolom $edge_id is geselecteerd, wordt echter een berekende waarde weergegeven in de vorm van een JSON-tekenreeks.
$edge_id is een pseudokolom die wordt toegewezen aan een interne naam met een uniek achtervoegsel. Wanneer u $edge_id selecteert in de tabel, wordt de kolomnaam weergegeven als $edge_id_<unique suffix> . Het gebruik van pseudokolomnamen in query's is de aanbevolen manier om een query uit te voeren op de interne $edge_id kolom en het gebruik van een interne naam met een hex-tekenreeks moet worden vermeden. |
$from_id |
Slaat de $node_id van het knooppunt op, van waaruit de rand afkomstig is. |
$to_id |
Slaat de $node_id van het knooppunt op, waarop de rand wordt beëindigd. |
De knooppunten waarmee een bepaalde rand verbinding kan maken, worden beheerd door de gegevens die zijn ingevoegd in de $from_id
en $to_id
kolommen. In de eerste release is het niet mogelijk om beperkingen voor de edge-tabel te definiëren, om te voorkomen dat er twee typen knooppunten worden verbonden. Dat wil gezegd, een rand kan elke twee knooppunten in de grafiek verbinden, ongeacht hun typen.
Net als bij de $node_id
kolom wordt aangeraden dat gebruikers op het moment van het maken van de randtabel een unieke index of beperking maken op de $edge_id
kolom, maar als er geen wordt gemaakt, wordt er automatisch een unieke, niet-geclusterde standaardindex gemaakt op deze kolom. Elke index van een pseudokolom in een grafiek wordt echter gemaakt op de onderliggende interne kolommen. Dat wil gezegd: een index die is gemaakt op de $edge_id
kolom, wordt weergegeven in de interne graph_id_<unique suffix>
kolom. Voor OLTP-scenario's wordt ook aanbevolen dat gebruikers een index maken op kolommen ($from_id
, $to_id
) voor snellere zoekacties in de richting van de rand.
In het volgende diagram ziet u hoe knooppunt- en edge-tabellen worden opgeslagen in de database.
Metagegevens
Gebruik deze metagegevensweergaven om kenmerken van een knooppunt of edge-tabel weer te geven.
sys.tables
De volgende bit
kolommen in sys.tables kunnen worden gebruikt om grafiektabellen te identificeren. Als is_node
is ingesteld op 1, is de tabel een knooppunttabel en als is_edge
is ingesteld op 1, is de tabel een randtabel.
Kolomnaam | Gegevenstype | Beschrijving |
---|---|---|
is_node | bit | Voor knooppunttabellen is is_node ingesteld op 1. |
is_edge | bit | Voor randtabellen is is_edge ingesteld op 1. |
sys.columns
De kolommen graph_type
en graph_type_desc
in de sys.columns
weergave zijn handig om inzicht te krijgen in de verschillende typen kolommen die worden gebruikt in grafiekknooppunt- en edge-tabellen:
Kolomnaam | Gegevenstype | Beschrijving |
---|---|---|
graph_type | Int | Interne kolom met een set waarden. De waarden liggen tussen 1 en 8 voor grafiekkolommen en NULL voor anderen. |
graph_type_desc | nvarchar(60) | Interne kolom met een set waarden. |
De volgende tabel bevat de geldige waarden voor graph_type
kolom:
Kolomwaarde | Beschrijving |
---|---|
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
slaat ook informatie op over impliciete kolommen die zijn gemaakt in knooppunt- of edge-tabellen. De volgende informatie kan worden opgehaald uit sys.columns, maar gebruikers kunnen deze kolommen niet selecteren uit een knooppunt of edge-tabel.
De impliciete kolommen in een knooppunttabel zijn:
Kolomnaam | Gegevenstype | is_hidden | Commentaar |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 1 | Interne grafiek-id-waarde. |
$node_id_\<hex_string> |
NVARCHAR | 0 | Externe, tekenweergave van de knooppunt-id. |
De impliciete kolommen in een randtabel zijn:
Kolomnaam | Gegevenstype | is_hidden | Commentaar |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 1 | Interne grafiek-id-waarde. |
$edge_id_\<hex_string> |
NVARCHAR | 0 | Tekenweergave van de edge-id. |
from_obj_id_\<hex_string> |
INT | 1 | Interne object_id waarde voor het 'van knooppunt'. |
from_id_\<hex_string> |
BIGINT | 1 | Interne grafiek-id-waarde voor het 'van knooppunt'. |
$from_id_\<hex_string> |
NVARCHAR | 0 | tekenweergave van het 'van knooppunt'. |
to_obj_id_\<hex_string> |
INT | 1 | Interne object_id voor het to-knooppunt. |
to_id_\<hex_string> |
BIGINT | 1 | Interne grafiek-id-waarde voor het 'naar-knooppunt'. |
$to_id_\<hex_string> |
NVARCHAR | 0 | Extern, tekenweergave van het 'naar knooppunt'. |
Systeemfuncties
U kunt de volgende ingebouwde functies gebruiken om te communiceren met de pseudokolommen in grafiektabellen. Gedetailleerde verwijzingen worden verstrekt voor elk van deze functies in de respectieve T-SQL-functieverwijzingen.
Ingebouwd | Beschrijving |
---|---|
OBJECT_ID_FROM_NODE_ID | Pak de object-id voor de grafiektabel uit een node_id . |
GRAPH_ID_FROM_NODE_ID | Pak de grafiek-id-waarde uit een node_id . |
NODE_ID_FROM_PARTS | Maak een node_id op basis van een object-id voor de grafiektabel en een grafiek-id-waarde. |
OBJECT_ID_FROM_EDGE_ID | Object-id voor de grafiektabel extraheren uit edge_id . |
GRAPH_ID_FROM_EDGE_ID | Pak de grafiek-id-waarde voor een bepaalde edge_id uit. |
EDGE_ID_FROM_PARTS | Maak edge_id van object-id voor de grafiektabel- en grafiek-id-waarde. |
Transact-SQL verwijzing
Meer informatie over de Transact-SQL-extensies die zijn geïntroduceerd in SQL Server en Azure SQL Database waarmee u grafiekobjecten kunt maken en er query's op kunt uitvoeren. Met de querytaalextensies kunt u query's uitvoeren en de grafiek doorlopen met behulp van de ASCII-tekensyntaxis.
DDL-instructies (Data Definition Language)
Taak | Gerelateerd artikel | Notities |
---|---|---|
CREATE TABLE | CREATE TABLE (Transact-SQL) |
CREATE TABLE wordt nu uitgebreid ter ondersteuning van het maken van een tabel AS NODE of AS EDGE. Een edge-tabel is niet vereist om door de gebruiker gedefinieerde kenmerken te hebben. |
ALTER TABLE | ALTER TABLE (Transact-SQL) | Knooppunt- en edge-tabellen kunnen op dezelfde manier worden gewijzigd als een relationele tabel, met behulp van de ALTER TABLE . Gebruikers kunnen door de gebruiker gedefinieerde kolommen, indexen of beperkingen toevoegen of wijzigen. Het wijzigen van interne grafiekkolommen, zoals $node_id of $edge_id , resulteert echter in een fout. |
CREATE INDEX | CREATE INDEX (Transact-SQL) | Gebruikers kunnen indexen maken voor pseudokolommen en door de gebruiker gedefinieerde kolommen in knooppunt- en edge-tabellen. Alle indextypen worden ondersteund, inclusief geclusterde en niet-geclusterde columnstore-indexen. |
EDGE-BEPERKINGEN MAKEN | EDGE-BEPERKINGEN (Transact-SQL) | Gebruikers kunnen nu randbeperkingen maken voor edge-tabellen om specifieke semantiek af te dwingen en ook gegevensintegriteit te behouden |
DROP TABLE | DROP TABLE (Transact-SQL) | Knooppunt- en edge-tabellen kunnen op dezelfde manier worden verwijderd als een relationele tabel, met behulp van de DROP TABLE . Er zijn momenteel geen mechanismen om te voorkomen dat knooppunten worden verwijderen, waarnaar wordt verwezen door randen. Er is geen ondersteuning voor trapsgewijs verwijderen van randen, bij het verwijderen van een knooppunt (of het verwijderen van de hele knooppunttabel). In dergelijke gevallen moeten alle randen die zijn verbonden met de verwijderde knooppunten handmatig worden verwijderd om de consistentie van de grafiek te behouden. |
DML-instructies (Data Manipulation Language)
Taak | Gerelateerd artikel | Notities |
---|---|---|
INVOEGEN | INSERT (Transact-SQL) | Invoegen in een knooppunttabel is niet anders dan invoegen in een relationele tabel. De waarden voor $node_id kolom worden automatisch gegenereerd. Als u een waarde probeert in te voegen in $node_id of $edge_id kolom, treedt er een fout op. Gebruikers moeten waarden opgeven voor $from_id en $to_id kolommen tijdens het invoegen in een randtabel.
$from_id en $to_id zijn de $node_id waarden van de knooppunten waarmee een bepaalde rand verbinding maakt. |
VERWIJDEREN | DELETE (Transact-SQL) | Gegevens uit knooppunt- of edge-tabellen kunnen op dezelfde manier worden verwijderd als gegevens uit relationele tabellen. In deze release zijn er echter geen beperkingen om ervoor te zorgen dat er geen randen verwijzen naar een verwijderd knooppunt en trapsgewijs verwijderen van randen, wanneer het verwijderen van een knooppunt niet wordt ondersteund. Het is raadzaam dat wanneer een knooppunt wordt verwijderd, alle verbindingsranden met dat knooppunt ook worden verwijderd. |
UPDATE | UPDATE (Transact-SQL) | Waarden in door de gebruiker gedefinieerde kolommen kunnen worden bijgewerkt met behulp van de UPDATE-instructie. U kunt de interne grafiekkolommen, $node_id , $edge_id , $from_id en $to_id niet bijwerken. |
FUSEREN | SAMENVOEGEN (Transact-SQL) |
MERGE instructie wordt ondersteund in een knooppunt of edge-tabel. |
Query-instructies
Beperkingen
Er gelden bepaalde beperkingen voor knooppunt- en edge-tabellen:
- Lokale of globale tijdelijke tabellen kunnen geen knooppunt- of edge-tabellen zijn.
- Tabeltypen en tabelvariabelen kunnen niet worden gedeclareerd als een knooppunt of edge-tabel.
- Knooppunt- en edge-tabellen kunnen niet worden gemaakt als tijdelijke tabellen met systeemversies.
- Knooppunt- en edge-tabellen kunnen geen tabellen zijn die zijn geoptimaliseerd voor geheugen.
- Gebruikers kunnen de kolommen
$from_id
en$to_id
van een rand niet bijwerken met behulp van de UPDATE-instructie. Als u knooppunten wilt bijwerken waarnaar wordt verwezen door een rand, moeten gebruikers een nieuwe rand invoegen die verwijst naar nieuwe knooppunten en de vorige verwijderen. - Query's voor meerdere databases op grafiekobjecten worden niet ondersteund.
- Pseudokolommen voor grafieken (
node_id
,$from_id
,$to_id
enedge_id
) kunnen niet worden gebruikt als sorteerkolommen voor een geordende columnstore-index. Als u pseudokolommen voor grafieken probeert te gebruiken als de sorteerkolommen voor geordende geclusterde columnstore, resulteert dit in eenMsg 102: Incorrect syntax
fout. - In Fabric SQL Databaseis SQL Graph toegestaan, maar knooppunt- en Edge-tabellen worden niet gespiegeld naar Fabric OneLake.
Zie ook
Volgende stappen
- Zie SQL Graph Database - Voorbeeld- om aan de slag te gaan met SQL Graph