Arquitectura de SQL Graph
Se aplica a: SQL Server 2017 (14.x) y versiones posteriores Azure SQL DatabaseAzure SQL Managed Instance
Obtenga información sobre la arquitectura de SQL Graph. Conocer los conceptos básicos facilitan la comprensión de otros artículos de SQL Graph.
Base de datos de SQL Graph
Los usuarios pueden crear un grafo por base de datos. Un gráfico es una colección de tablas perimetrales y de nodo. Las tablas perimetrales o de nodo se pueden crear en cualquier esquema de la base de datos, pero todas pertenecen a un grafo lógico. Una tabla de nodos es una colección de un tipo similar de nodos. Por ejemplo, una Person
tabla de nodos contiene todos los Person
nodos que pertenecen a un grafo. De forma similar, una tabla perimetral es una colección de bordes similares. Por ejemplo, una Friends
tabla perimetral contiene todos los bordes que conectan a Person
otro Person
. Dado que los nodos y bordes se almacenan en tablas, la mayoría de las operaciones admitidas en tablas normales se admiten en tablas perimetrales o nodos.
En el diagrama siguiente se muestra la arquitectura de la base de datos de SQL Graph.
Tabla de nodos
Una tabla de nodos representa una entidad en un esquema de grafo. Cada vez que se crea una tabla de nodos, junto con las columnas definidas por el usuario, se crea una columna implícita $node_id
, que identifica de forma única un nodo determinado en la base de datos. Los valores de $node_id
se generan automáticamente y son una combinación de identificador de objeto para la tabla de grafos de esa tabla de nodos y un valor bigint generado internamente. Sin embargo, cuando se selecciona la $node_id
columna, se muestra un valor calculado en forma de cadena JSON. Además, $node_id
es una pseudocolumnía que se asigna a un nombre interno con un sufijo único. Al seleccionar la $node_id
pseudocolumba de la tabla, el nombre de la columna aparece como $node_id_<unique suffix>
.
Nota
El uso de las pseudo columnas en las consultas es la única manera admitida y recomendada de consultar la columna interna $node_id
. No debe usar directamente las $node_id_<hex_string>
columnas en ninguna consulta.
Además, la representación JSON calculada que se muestra en las pseudo columnas es un detalle de implementación. No debe tomar una dependencia directa del formato de esa representación JSON. Si debe tratar con esta representación JSON, considere la posibilidad de usar el NODE_ID_FROM_PARTS() y otras funciones del sistema relacionadas.
No se recomienda usar directamente las pseudo columnas del grafo ($node_id
, $from_id
, $to_id
) en predicados. Por ejemplo, se debe evitar un predicado como n.$node_id = e.$from_id
. Estas comparaciones tienden a ser ineficaz, debido a la conversión a la representación JSON. En su lugar, confíe en la función MATCH en la medida de lo posible.
Se recomienda que los usuarios creen una restricción o índice únicos en la $node_id
columna en el momento de la creación de la tabla de nodos, pero si no se crea uno, se crea automáticamente un índice único y no agrupado predeterminado. Sin embargo, cualquier índice de una pseudo columna de grafo se crea en las columnas internas subyacentes. Es decir, un índice creado en la $node_id
columna aparece en la columna interna graph_id_<hex_string>
.
Tabla perimetral
Una tabla perimetral representa una relación en un grafo. Los bordes siempre se dirigen y conectan dos nodos. Una tabla perimetral permite a los usuarios modelar relaciones de varios a varios en el gráfico. Las columnas definidas por el usuario ("atributos") son opcionales en una tabla perimetral. Cada vez que se crea una tabla perimetral, junto con las columnas definidas por el usuario, se crean tres columnas implícitas en la tabla perimetral:
Nombre de la columna | Descripción |
---|---|
$edge_id |
Identifica de forma única un borde determinado en la base de datos. Es una columna generada y el valor es una combinación de object_id de la tabla perimetral y un valor bigint generado internamente. Sin embargo, cuando se selecciona la $edge_id columna, se muestra un valor calculado en forma de cadena JSON. $edge_id es una pseudocolumba que se asigna a un nombre interno con un sufijo único. Al seleccionar $edge_id en la tabla, el nombre de columna aparece como $edge_id_<unique suffix> . El uso de nombres pseudocolumnados en las consultas es la manera recomendada de consultar la columna interna y usar el nombre interno $edge_id con cadena hexadecimal. |
$from_id |
Almacena el $node_id del nodo, desde donde se origina el borde. |
$to_id |
Almacena el $node_id del nodo, en el que finaliza el borde. |
Los nodos a los que un perímetro determinado puede conectarse se controlan mediante los datos insertados en las $from_id
columnas y $to_id
. En la primera versión, no es posible definir restricciones en la tabla perimetral para impedir que se conecten dos tipos de nodos. Es decir, un perímetro puede conectar dos nodos en el grafo, independientemente de sus tipos.
De forma similar a la $node_id
columna, se recomienda que los usuarios creen un índice o restricción únicos en la $edge_id
columna en el momento de la creación de la tabla perimetral, pero si no se crea uno, se crea automáticamente un índice único y no agrupado predeterminado en esta columna. Sin embargo, cualquier índice de una pseudo columna de grafo se crea en las columnas internas subyacentes. Es decir, un índice creado en la $edge_id
columna aparece en la columna interna graph_id_<unique suffix>
. También se recomienda, para escenarios OLTP, que los usuarios creen un índice en ($from_id
, $to_id
) columnas para búsquedas más rápidas en la dirección del borde.
En el diagrama siguiente se muestra cómo se almacenan las tablas perimetrales y de nodo en la base de datos.
Metadatos
Use estas vistas de metadatos para ver los atributos de un nodo o una tabla perimetral.
sys.tables
Las columnas siguientes bit
de sys.tables se pueden usar para identificar tablas de grafos. Si is_node
se establece en 1, la tabla es una tabla de nodos y, si is_edge
se establece en 1, la tabla es una tabla perimetral.
Nombre de columna | Tipo de datos | Descripción |
---|---|---|
is_node | bit | En el caso de las tablas de nodos, is_node se establece en 1. |
is_edge | bit | En el caso de las tablas perimetrales, is_edge se establece en 1. |
sys.columns
Las graph_type
columnas y graph_type_desc
de la sys.columns
vista son útiles para comprender los distintos tipos de columnas que se usan en las tablas perimetrales y nodo de grafos:
Nombre de columna | Tipo de datos | Descripción |
---|---|---|
graph_type | int | Columna interna con un conjunto de valores. Los valores están comprendidos entre 1 y 8 para las columnas de gráfico y son NULL para otras. |
graph_type_desc | nvarchar(60) | Columna interna con un conjunto de valores. |
En la tabla siguiente se enumeran los valores válidos para la graph_type
columna:
Valor de columna | Descripción |
---|---|
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
también almacena información sobre las columnas implícitas creadas en tablas perimetrales o de nodo. Sin embargo, la siguiente información se puede recuperar de sys.columns; sin embargo, los usuarios no pueden seleccionar estas columnas de una tabla perimetral o de nodo.
Las columnas implícitas de una tabla de nodos son:
Nombre de columna | Tipo de datos | is_hidden | Comentario |
---|---|---|---|
graph_id_\<hex_string> |
bigint | 1 | Valor de id. de grafo interno. |
$node_id_\<hex_string> |
NVARCHAR | 0 | Representación externa de caracteres del identificador del nodo. |
Las columnas implícitas de una tabla perimetral son:
Nombre de columna | Tipo de datos | is_hidden | Comentario |
---|---|---|---|
graph_id_\<hex_string> |
bigint | 1 | Valor de id. de grafo interno. |
$edge_id_\<hex_string> |
NVARCHAR | 0 | Representación de caracteres del identificador de borde. |
from_obj_id_\<hex_string> |
INT | 1 | Valor interno object_id para "from node". |
from_id_\<hex_string> |
bigint | 1 | Valor de id. de grafo interno para "from node". |
$from_id_\<hex_string> |
NVARCHAR | 0 | representación de caracteres de "from node". |
to_obj_id_\<hex_string> |
INT | 1 | Interno object_id para el "a nodo". |
to_id_\<hex_string> |
bigint | 1 | Valor de id. de grafo interno para "to node". |
$to_id_\<hex_string> |
NVARCHAR | 0 | Representación externa de caracteres del "a nodo". |
Funciones del sistema
Puede usar las siguientes funciones integradas para interactuar con las pseudo columnas de las tablas de grafos. Se proporcionan referencias detalladas para cada una de estas funciones en las referencias de función T-SQL respectivas.
Integrada | Descripción |
---|---|
OBJECT_ID_FROM_NODE_ID | Extraiga el identificador de objeto de la tabla de grafos de .node_id |
GRAPH_ID_FROM_NODE_ID | Extraiga el valor del identificador del grafo de .node_id |
NODE_ID_FROM_PARTS | Construya un node_id a partir de un identificador de objeto para la tabla de grafos y un valor de identificador de grafo. |
OBJECT_ID_FROM_EDGE_ID | Extraiga el identificador de objeto de la tabla de grafos de edge_id . |
GRAPH_ID_FROM_EDGE_ID | Extraiga el valor del identificador del grafo de un determinado edge_id . |
EDGE_ID_FROM_PARTS | Construir edge_id a partir del identificador de objeto para la tabla de grafos y el valor del identificador de grafo. |
Referencia de Transact-SQL
Obtenga información sobre las extensiones de Transact-SQL introducidas en SQL Server y Azure SQL Database que permiten crear y consultar objetos de grafo. Las extensiones del lenguaje de consulta ayudan a consultar y recorrer el gráfico mediante la sintaxis de arte ASCII.
Instrucciones del Lenguaje de definición de datos (DDL)
Tarea | Artículo relacionado | Notas |
---|---|---|
CREATE TABLE | CREATE TABLE (Transact-SQL) | CREATE TABLE ahora se amplía para admitir la creación de una tabla AS NODE o AS EDGE. Una tabla perimetral puede tener o no atributos definidos por el usuario. |
ALTER TABLE | ALTER TABLE (Transact-SQL) | Las tablas perimetrales y de nodo se pueden modificar de la misma manera que una tabla relacional, mediante ALTER TABLE . Los usuarios pueden agregar o modificar columnas, índices o restricciones definidos por el usuario. Sin embargo, la modificación de columnas de grafos internas, como $node_id o $edge_id , produce un error. |
CREATE INDEX | CREATE INDEX (Transact-SQL) | Los usuarios pueden crear índices en pseudo columnas y columnas definidas por el usuario en tablas perimetrales y de nodo. Se admiten todos los tipos de índice, incluidos los índices de almacén de columnas agrupados y no agrupados. |
CREATE EDGE CONSTRAINTS | EDGE CONSTRAINTS (Transact-SQL) | Los usuarios ahora pueden crear restricciones perimetrales en tablas perimetrales para aplicar una semántica específica y también mantener la integridad de los datos. |
DROP TABLE | DROP TABLE (Transact-SQL) | Las tablas perimetrales y de nodo se pueden quitar de la misma manera que una tabla relacional, mediante DROP TABLE . Actualmente, no hay mecanismos para evitar la eliminación de nodos, a los que hacen referencia los bordes. No hay compatibilidad con la eliminación en cascada de bordes, tras la eliminación de un nodo (o la eliminación de toda la tabla de nodos). En todos estos casos, los bordes conectados a los nodos eliminados se deben eliminar manualmente para mantener la coherencia del gráfico. |
Instrucciones del Lenguaje de manipulación de datos (DML)
Tarea | Artículo relacionado | Notas |
---|---|---|
INSERT | INSERT (Transact-SQL) | La inserción en una tabla de nodos no es diferente de la inserción en una tabla relacional. Los valores de $node_id la columna se generan automáticamente. Si se intenta insertar un valor en $node_id o $edge_id columna, se produce un error. Los usuarios deben proporcionar valores para $from_id las columnas y $to_id mientras se insertan en una tabla perimetral. $from_id y $to_id son los $node_id valores de los nodos a los que se conecta un perímetro determinado. |
Delete | DELETE (Transact-SQL) | Los datos de las tablas perimetrales o de nodo se pueden eliminar de la misma manera que se eliminan de las tablas relacionales. Sin embargo, en esta versión, no hay restricciones para asegurarse de que ningún borde apunte a un nodo eliminado y la eliminación en cascada de bordes, tras la eliminación de un nodo no se admite. Se recomienda que cada vez que se elimine un nodo, también se eliminan todos los bordes que se conectan a ese nodo. |
UPDATE | UPDATE (Transact-SQL) | Los valores de las columnas definidas por el usuario se pueden actualizar mediante la instrucción UPDATE. No se pueden actualizar las columnas del grafo interno, $node_id , $edge_id $from_id y $to_id . |
MERGE | MERGE (Transact-SQL) | MERGE Se admite la instrucción en un nodo o una tabla perimetral. |
Instrucciones de consulta
Tarea | Artículo relacionado | Notas |
---|---|---|
SELECT | SELECT (Transact-SQL) | Dado que los nodos y bordes se almacenan como tablas, la mayoría de las operaciones de tabla también se admiten en tablas perimetrales y de nodo. |
MATCH | MATCH (Transact-SQL) | Match integrado se introduce para admitir la coincidencia de patrones y el recorrido a través del gráfico. |
Limitaciones
Hay ciertas limitaciones en las tablas perimetrales y de nodo:
- Las tablas temporales locales o globales no pueden ser tablas perimetrales ni de nodo.
- Los tipos de tabla y las variables de tabla no se pueden declarar como un nodo o una tabla perimetral.
- Las tablas perimetrales y de nodo no se pueden crear como tablas temporales con versiones del sistema.
- Las tablas perimetrales y de nodo no pueden ser tablas optimizadas para memoria.
- Los usuarios no pueden actualizar las columnas y
$to_id
de un perímetro mediante la$from_id
instrucción UPDATE. Para actualizar los nodos a los que hace referencia un perímetro, los usuarios tienen que insertar un nuevo borde que apunte a nuevos nodos y eliminar el anterior. - No se admiten consultas entre bases de datos en objetos de grafos.
Consulte también
Pasos siguientes
- Para empezar a trabajar con SQL Graph, consulte SQL Graph Database - Sample