¿Cómo crear, actualizar o eliminar según los valores en una colección en Neo4j?
En neo4j, tengo la relación ES_SIMILAR
con la propiedad similitud
en la base de datos, y tengo una colección collect([node_n, node_m, nueva_similitud]) AS tabla_similitud
que contiene nueva información. Quiero:
- si la relación
(node_n)-[r:ES_SIMILAR]-(node_m)
existe y[node_n, node_m, nueva_similitud >= 0.5]
está entabla_similitud
, actualice solo el valor der.similitud
anueva_similitud
- si la relación
(node_n)-[r:ES_SIMILAR]-(node_m)
existe y[node_n, node_m, nueva_similitud < 0.5]
está entabla_similitud
, eliminer
(porque los nodos n y m ya no son similares) - si la relación
(node_n)-[r:ES_SIMILAR]-(node_m)
no existe y[node_n, node_m, nueva_similitud >= 0.5]
está entabla_similitud
, CREA(node_n)-[r:ES_SIMILAR]-(node_m)
conSET r.similitud = nueva_similitud
- si la relación
(node_n)-[r:ES_SIMILAR]-(node_m)
no existe y[node_n, node_m, nueva_similitud < 0.5]
está entabla_similitud
, no hagas nada
Con MERGE
puedo manejar 1+3+4 (solo procesando la parte nueva_similitud >= 0.5
):
... # calcular similitud y construir lista n, m, nueva_similitud
WITH collect([node_n, node_m, nueva_similitud]) AS tabla_similitud
WITH [val IN tabla_similitud WHERE val[2] >= 0.5] AS similarity_table
UNWIND similarity_table AS s
WITH s[0] AS n, s[1] AS m, s[2] AS sim
MERGE (n)-[r:ES_SIMILAR_A]->(m)
SET r.similitud = sim
Pero ¿puedo combinar todas estas acciones condicionales (CREAR, ACTUALIZAR, ELIMINAR) en un solo Cypher?
davy.ai
Sí, se puede utilizar la cláusula
FOREACH
para ejecutar de manera condicional declaraciones Cypher basadas en sus condiciones. Aquí hay un ejemplo de consulta Cypher que combina todas las acciones condicionales:Explicación:
– Primero, recopilamos los datos de similitud en una lista
sim_table
.– La cláusula
FOREACH
itera sobre cada elemento ensim_table
, representado por la variables
.– Dentro de cada iteración, utilizamos una cláusula
MATCH
para verificar si ya existe una relación entres[0]
ys[1]
con la etiqueta:IS_SIMILAR
. Si es así, actualizamos su propiedadsimilarity
con el valors[2]
(sis[2] >= 0.5
). Si no, eliminamos la relación (sis[2] < 0.5
) y procedemos al siguiente paso.– Usando la variable
rel_count
, verificamos si se encontró una relación:IS_SIMILAR
en el paso anterior. Si no, y sis[2] >= 0.5
, usamos una cláusulaFOREACH
para crear una nueva relación:IS_SIMILAR
con las propiedades requeridas.– Tenga en cuenta que utilizamos declaraciones
CASE
para establecer/actualizar de manera condicional la propiedadsimilarity
, yREMOVE
para eliminar la relación cuando sea necesario. También usamos la funcióncount()
para contar el número de relaciones devueltas deMATCH
.Esta consulta debería lograr el resultado deseado según sus requisitos.