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.

Diagrama que 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.

Diagrama que muestra la representación de la tabla perimetral y el nodo.

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