Merge en Graph Tables

Usando Merge en Graph Tables SQL Server

Una base de datos gráfica es una colección de nodos (o vértices) y bordes (o relaciones). Un nodo representa una entidad (por ejemplo, una persona o una organización) y un borde representa una relación entre los dos nodos que conecta (por ejemplo, grupos o amigos). Tanto los nodos como los bordes pueden tener propiedades asociadas a ellos.

En este artículo se explica como usar la instrucción MERGE para hacer una inserción o actualización en una tabla Edge de destino desde una base de datos de gráficos.

Para mayor información ver
Merge en SQL Server
Merge con un Select
Graph Tables en SQL Server
Insertar registros
Actualizar registros
Procedimientos almacenados
Creación de tablas

Ejercicio

Usando la base de datos Northwind
use Northwind
go

Para explicar el uso de Merge en el uso de Grap Tables se va a crear las tablas Node Persona y Ciudad y una tabla Edge ViveEn. Se utilizará la instrucción MERGE en la tabla Edge ViveEn para inserta un nuevo registro si este no existe, si ya existe en la tabla Edge las combinaciones de Persona y Ciudad se actualizará su Dirección.

Tablas Node, Persona y Ciudad

Create table Persona
(
PersonaCodigo nchar(5),
PersonaPaterno nvarchar(30),
PersonaMaterno nvarchar(30),
PersonaNombres nvarchar(30),
PersonaFechaNacimiento Date,
constraint PersonaPK Primary key (PersonaCodigo)
)
As Node
go

Create table Ciudad
(
CiudadCodigo nchar(3),
CiudadNombre nvarchar(30),
CiudadEstado nchar(1),
constraint CiudadPK Primary key (CiudadCodigo)
)
As Node
go

La tabla Edge que tiene las ciudades donde viven las personas

Create Table ViveEn
(
ViveEnDireccion nvarchar(100)
)
As Edge
go

Insertar registros en las tablas Node y la tabla Edge

set dateformat dmy
go
Insert Into Persona
VALUES (‘P1325’, ‘Luque’,’Sánchez’,’Fernando’,’23/07/1966′),
(‘P1085’, ‘Luque’,’Villacorta’,’Fernando’,’16/11/1996′),
(‘P0324’, ‘Luque’,’Villacorta’,’María Fernanda’,’01/10/2000′),
(‘P0278’, ‘Villacorta’,’Acosta’,’Carolina’,’21/11/1966′),
(‘P1963’, ‘Wong’,’Huamán’,’Alberto’,’24/02/1996′),
(‘P0789’, ‘Salas’,’Valderrama’,’Alberto’,’30/09/1999′)
go

Insert into Ciudad
VALUES (‘001’, ‘Trujillo’, ‘A’), (‘002’, ‘Lima’, ‘A’),
(‘003’, ‘Piura’, ‘A’),(‘004’, ‘Cajamarca’, ‘A’),
(‘005’, ‘Cusco’, ‘A’),(‘006’, ‘Huaraz’, ‘A’)
go

Insertar los registros en el Edge.

Insert ViveEn
SELECT
P.$node_id, C.$node_id, c
From Persona As P, Ciudad As C,
(values
(‘P1325′,’001’, ‘Ciro Alegría 575’),
(‘P1085′,’002’, ‘Av. Atahualpa 633’),
(‘P0324′,’004’, ‘Av. Brasil 4994’),
(‘P0278′,’006’, ‘Av. Valderrama 499’),
(‘P1963′,’003’, ‘Av. Los Paujiles 6890’),
(‘P0789′,’005’, ‘Av. San Blas 599’)
)
v(a,b,c)
WHERE P.PersonaCodigo = a and C.CiudadCodigo = b
go

Listado de los registros de la tabla ViveEn.
SELECT
P.PersonaCodigo,
P.PersonaPaterno,
P.PersonaMaterno,
P.PersonaNombres,
P.PersonaFechaNacimiento,
C.CiudadNombre , V.ViveEnDireccion
FROM Persona As P, Ciudad As C, ViveEn As V
WHERE MATCH(P-(V)->C)
go
El resultado se muestra en la siguiente imagen.

Usando Merge para insertar o actualizar la dirección

Create or alter procedure spPersonaDireccionInsertaActualiza
(
@PersonaCodigo nchar(5),
@CiudadCodigo nchar(3),
@Direccion nvarchar(100)
)
As
Begin
MERGE ViveEn
USING
(
(SELECT @PersonaCodigo, @CiudadCodigo, @Direccion) As Destino
(PersonaCodigo, CiudadCodigo, ViveEnDireccion)
JOIN Persona on Destino.PersonaCodigo = Persona.PersonaCodigo
JOIN Ciudad on Destino.CiudadCodigo = Ciudad.CiudadCodigo
)
ON MATCH (Persona-(ViveEn)->Ciudad)
WHEN MATCHED THEN
UPDATE Set ViveEnDireccion = @Direccion
WHEN NOT MATCHED THEN
INSERT ($from_id, $to_id, ViveEnDireccion)
Values (Persona.$node_id, Ciudad.$node_id, @Direccion);
End
go

Insertar una persona y una ciudad nuevas.

Insert into Persona
values (‘P1951’, ‘Mantilla’,’Terranova’,’Carlos’,’12/06/1988′)
go
Listado de las personas
Select * from persona
go
El listado se muestra en la siguiente imagen.
Note que está el registro insertado.

Insert into Ciudad
values (‘007’, ‘Loreto’,’A’)
go
Listado de las ciudades
Select * from Ciudad
go
El listado se muestra en la siguiente imagen
Note la ciudad de Loreto.

Antes de ejecutar el procedimiento vamos a lista nuevamente los registros de la tabla ViveEn
Listado de los registros de la tabla ViveEn.

SELECT
P.PersonaCodigo,
P.PersonaPaterno,
P.PersonaMaterno,
P.PersonaNombres,
P.PersonaFechaNacimiento,
C.CiudadNombre , V.ViveEnDireccion
FROM Persona As P, Ciudad As C, ViveEn As V
WHERE MATCH(P-(V)->C)
go
El resultado se muestra en la siguiente imagen.
Note que no existe el registro de Carlos Mantilla Terranova.

Considerar que Carlos Mantilla Terranova vive en la ciudad de Loreto en la calle «Los Manglares 3005».
Usamos el procedimiento almacenado creado para insertar el registro en la tabla ViveEn, el código de Carlos Mantilla Terranova es «P1951» y el código de la ciudad de Loreto es «007»

Execute spPersonaDireccionInsertaActualiza ‘P1951’, ‘007’, ‘Los Manglares 3005’
go

Listado de los registros de la tabla ViveEn.
SELECT
P.PersonaCodigo,
P.PersonaPaterno,
P.PersonaMaterno,
P.PersonaNombres,
P.PersonaFechaNacimiento,
C.CiudadNombre , V.ViveEnDireccion
FROM Persona As P, Ciudad As C, ViveEn As V
WHERE MATCH(P-(V)->C)
go
El resultado se muestra en la siguiente imagen.
Note que se muestra el registro de Carlos Mantilla Terranova.

Se va a ejecutar el procedimiento almacenado con los datos de Carlos Mantilla Terranova, en la misma ciudad de Loreto pero su nueva dirección es: «Av. Amazonía Verde 3999»

Execute spPersonaDireccionInsertaActualiza ‘P1951’, ‘007’, ‘Av. Amazonía Verde 3999’
go

Listado de los registros.
SELECT
P.PersonaCodigo,
P.PersonaPaterno,
P.PersonaMaterno,
P.PersonaNombres,
P.PersonaFechaNacimiento,
C.CiudadNombre , V.ViveEnDireccion
FROM Persona As P, Ciudad As C, ViveEn As V
WHERE MATCH(P-(V)->C)
go
El resultado se muestra en la siguiente imagen.
Note que se muestra el registro de Carlos Mantilla Terranova con su dirección actualizada