Delen via


SQL Graph-architectuur

Van toepassing op: SQL Server 2017 (14.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceSQL-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.

diagram met 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.

diagram met de weergave van de knooppunt- en edge-tabel.

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_iduit.
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_idniet bijwerken.
FUSEREN SAMENVOEGEN (Transact-SQL) MERGE instructie wordt ondersteund in een knooppunt of edge-tabel.

Query-instructies

Taak Gerelateerd artikel Notities
SELECTEREN SELECT (Transact-SQL) Omdat knooppunten en randen als tabellen worden opgeslagen, worden de meeste tabelbewerkingen ook ondersteund op knooppunt- en edge-tabellen.
LUCIFER VERGELIJKEN (Transact-SQL) De ingebouwde MATCH-functionaliteit wordt geïntroduceerd ter ondersteuning van patroonkoppeling en doorkruising via de grafiek.

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 en edge_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 een Msg 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