Antes del inicio del curso
Las bases de datos de grafos son una tecnología importante para los profesionales de las bases de datos. Trato de seguir las innovaciones y las nuevas tecnologías en esta área y después de trabajar con bases de datos relacionales y NoSQL, veo que el papel de las bases de datos gráficas es cada vez más importante. Cuando se trabaja con datos jerárquicos complejos, no solo las bases de datos tradicionales, sino también NoSQL, son ineficaces. A menudo, con un aumento en el número de niveles de enlace y el tamaño de la base de datos, hay una disminución en el rendimiento. Y a medida que las relaciones se vuelven más complejas, el número de JOIN también aumenta.
Por supuesto, en el modelo relacional hay soluciones para trabajar con jerarquías (por ejemplo, usando CTE recursivos), pero aún son soluciones alternativas. Al mismo tiempo, la funcionalidad de las bases de datos de gráficos de SQL Server facilita el manejo de múltiples niveles de jerarquía. Tanto el modelo de datos como las consultas se simplifican, por lo que se incrementa su eficiencia. Reduce significativamente la cantidad de código.
Las bases de datos de gráficos son un lenguaje expresivo para representar sistemas complejos. Esta tecnología ya se usa bastante en la industria de TI en áreas como redes sociales, sistemas antifraude, análisis de redes de TI, recomendaciones sociales, recomendaciones de productos y contenido.
La funcionalidad de la base de datos de gráficos en SQL Server es adecuada para escenarios donde los datos están altamente interconectados y tienen relaciones bien definidas.
modelo de datos gráfico
Un gráfico es un conjunto de vértices (nodos, nodo) y aristas (relaciones, arista). Los vértices representan entidades y los bordes representan enlaces cuyos atributos pueden contener información.
Una base de datos de grafos modela entidades como un gráfico como se define en la teoría de grafos. Las estructuras de datos son vértices y aristas. Los atributos son propiedades de vértices y aristas. Una conexión es una conexión de vértices.
A diferencia de otros modelos de datos, las bases de datos de gráficos priorizan las relaciones entre entidades. Por lo tanto, no hay necesidad de calcular las relaciones usando claves foráneas o de alguna otra forma. Es posible crear modelos de datos complejos usando solo abstracciones de vértices y bordes.
En el mundo actual, modelar relaciones requiere técnicas cada vez más sofisticadas. Para modelar relaciones, SQL Server 2017 ofrece capacidades de base de datos de gráficos. Los vértices y aristas del gráfico se representan como nuevos tipos de tablas: NODO y BORDE. Las consultas de gráficos usan una nueva función T-SQL llamada MATCH(). Dado que esta funcionalidad está integrada en SQL Server 2017, se puede usar en sus bases de datos existentes sin necesidad de ninguna conversión de base de datos.
Beneficios del modelo gráfico
Hoy en día, las empresas y los usuarios demandan aplicaciones que trabajen con más y más datos, esperando un alto rendimiento y confiabilidad. La representación gráfica de datos ofrece un medio conveniente para manejar relaciones complejas. Este enfoque resuelve muchos problemas y ayuda a obtener resultados dentro de un contexto dado.
Parece que muchas aplicaciones se beneficiarán de las bases de datos de gráficos en el futuro.
Modelado de datos: del modelado relacional al gráfico
ejemplo
Veamos un ejemplo de una estructura organizacional con una jerarquía de empleados: un empleado informa a un gerente, un gerente informa a un gerente senior, y así sucesivamente. Dependiendo de la empresa específica, puede haber cualquier número de niveles en esta jerarquía. Pero a medida que aumenta el número de niveles, calcular las relaciones en una base de datos relacional se vuelve cada vez más difícil. Es bastante difícil imaginar la jerarquía de los empleados, la jerarquía en el marketing o las conexiones en las redes sociales. Veamos cómo SQL Graph puede resolver el problema de manejar diferentes niveles de jerarquía.
Para este ejemplo, hagamos un modelo de datos simple. Crear una tabla de empleados EMP con identificación EMPNO y columna MGRA que apunta al ID del jefe (gerente) del empleado. Toda la información sobre la jerarquía se almacena en esta tabla y se puede consultar mediante columnas EMPNO и MGR.
El siguiente diagrama también muestra el mismo modelo de organigrama con cuatro niveles de anidamiento en una forma más familiar. Los empleados son los vértices del gráfico de la tabla. EMP. La entidad "empleado" está vinculada a sí misma por la relación "envía" (ReportsTo). En términos gráficos, un enlace es un borde (BORDE) que conecta nodos (NODOS) de empleados.
Vamos a crear una tabla regular EMP y agregue valores allí de acuerdo con el diagrama anterior.
CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)
La siguiente figura muestra a los empleados:
- empleado con EMPNO 7369 está subordinado a 7902;
- empleado con EMPNO 7902 subordinado a 7566
- empleado con EMPNO 7566 subordinado a 7839
Ahora veamos la representación de los mismos datos en forma de gráfico. El nodo EMPLEADO tiene varios atributos y está vinculado a sí mismo por una relación de "envíos" (EmplReportsTo). EmplReportsTo es el nombre de la relación.
La tabla perimetral (EDGE) también puede tener atributos.
Crear una tabla de nodos EmpNode
La sintaxis para crear un nodo es bastante simple: a la expresión Crear mesa añadido al final COMO NODO.
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Ahora vamos a convertir los datos de una tabla regular a una gráfica. Próximo INSERT inserta datos de una tabla relacional EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
En la tabla de nodos en una columna especial $node_id_*
el ID de host se almacena como JSON. Las columnas restantes de esta tabla contienen los atributos del nodo.
Crear bordes (EDGE)
Crear una tabla perimetral es muy similar a crear una tabla de nodos, excepto que la palabra clave COMO BORDE.
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Ahora definamos relaciones entre empleados usando columnas EMPNO и MGR. El organigrama muestra claramente cómo escribir INSERT.
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
(SELECT $node_id FROM EmpNode WHERE id = 7),30);
La tabla perimetral tiene tres columnas por defecto. Primero, $edge_id
— identificador de borde en forma de JSON. Los otros dos ($from_id
и $to_id
) representan la relación entre nodos. Además, los bordes pueden tener propiedades adicionales. En nuestro caso, este depto.
Vistas del sistema
En la vista del sistema sys.tables
Hay dos nuevas columnas:
- es_borde
- es_nodo
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
SSMS
Los objetos relacionados con los gráficos se encuentran en la carpeta Tablas de gráficos. El icono de la tabla de nodos está marcado con un punto y el icono de la tabla de bordes está marcado con dos círculos conectados (que se parece un poco a unas gafas).
expresión COINCIDIR
Expresión PARTIDO tomado de CQL (Cypher Query Language). Esta es una forma eficiente de consultar las propiedades de un gráfico. CQL comienza con una expresión PARTIDO.
sintaxis
MATCH (<graph_search_pattern>)
<graph_search_pattern>::=
{<node_alias> {
{ <-( <edge_alias> )- }
| { -( <edge_alias> )-> }
<node_alias>
}
}
[ { AND } { ( <graph_search_pattern> ) } ]
[ ,...n ]
<node_alias> ::=
node_table_name | node_alias
<edge_alias> ::=
edge_table_name | edge_alias
Примеры
Veamos algunos ejemplos.
La consulta a continuación muestra los empleados a los que reportan Smith y su gerente.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
empnode e, empnode e1, empReportsTo m
WHERE
MATCH(e-(m)->e1)
and e.ENAME='SMITH'
La siguiente consulta es para encontrar empleados y gerentes de segundo nivel para Smith. Si quitas la oferta ¿Dónde?, entonces todos los empleados se mostrarán como resultado.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'
Y finalmente, una solicitud para empleados y gerentes de tercer nivel.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'
Ahora cambiemos de dirección para atrapar a los jefes de Smith.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)
Conclusión
SQL Server 2017 se ha establecido como una solución empresarial completa para una variedad de necesidades de TI comerciales. La primera versión de SQL Graph es muy prometedora. Incluso a pesar de algunas limitaciones, ya existe suficiente funcionalidad para explorar las posibilidades de los gráficos.
La funcionalidad de SQL Graph está totalmente integrada en SQL Engine. Sin embargo, como ya se mencionó, SQL Server 2017 tiene las siguientes limitaciones:
No hay soporte para polimorfismo.
- Solo se admiten enlaces unidireccionales.
- Los bordes no pueden actualizar sus columnas $from_id y $to_id a través de ACTUALIZAR.
- No se admiten los cierres transitivos, pero se pueden obtener mediante CTE.
- Soporte limitado para objetos OLTP en memoria.
- Las tablas temporales (tabla temporal con versión del sistema), las tablas temporales locales y globales no son compatibles.
- Los tipos de tabla y las variables de tabla no se pueden declarar como NODE o EDGE.
- No se admiten consultas entre bases de datos.
- No existe una forma directa o algún tipo de asistente (asistente) para convertir tablas regulares en tablas gráficas.
- No hay GUI para mostrar gráficos, pero se puede usar Power BI.
Lee mas:
Fuente: habr.com