es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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:

  1. si la relación (node_n)-[r:ES_SIMILAR]-(node_m) existe y [node_n, node_m, nueva_similitud >= 0.5] está en tabla_similitud, actualice solo el valor de r.similitud a nueva_similitud
  2. si la relación (node_n)-[r:ES_SIMILAR]-(node_m) existe y [node_n, node_m, nueva_similitud < 0.5] está en tabla_similitud, elimine r (porque los nodos n y m ya no son similares)
  3. si la relación (node_n)-[r:ES_SIMILAR]-(node_m) no existe y [node_n, node_m, nueva_similitud >= 0.5] está en tabla_similitud, CREA (node_n)-[r:ES_SIMILAR]-(node_m) con SET r.similitud = nueva_similitud
  4. si la relación (node_n)-[r:ES_SIMILAR]-(node_m) no existe y [node_n, node_m, nueva_similitud < 0.5] está en tabla_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?

Tags:  ,

Answer

  1. Avatar for 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:

    CON collect([node_n, node_m, new_similarity]) COMO sim_table
    FOREACH (s EN sim_table |
      // Verifique si la relación ya existe con una similitud >= 0.5
      // Si sí, actualice la propiedad de similitud
      // Si no, verifique si la nueva similitud es >= 0.5, luego cree una relación con la nueva similitud.
      MATCH (n) - [r: IS_SIMILAR] - (m)
      WHERE n = s[0] Y m = s[1]
      SET r.similarity = CASE WHEN s[2] >= 0.5 ENTONCES s[2] ELSE r.similarity END
      REMOVE r CUANDO s[2] < 0.5
      CON s, count(r) COMO rel_count
      FOREACH (x EN CASE WHEN rel_count = 0 Y s[2] >= 0.5 ENTONCES [1] ELSE [] END |
        CREATE (n) - [:IS_SIMILAR {similarity: s[2]}] -> (m)
      )
    )
    

    Explicación:
    – Primero, recopilamos los datos de similitud en una lista sim_table.
    – La cláusula FOREACH itera sobre cada elemento en sim_table, representado por la variable s.
    – Dentro de cada iteración, utilizamos una cláusula MATCH para verificar si ya existe una relación entre s[0] y s[1] con la etiqueta :IS_SIMILAR. Si es así, actualizamos su propiedad similarity con el valor s[2] (si s[2] >= 0.5). Si no, eliminamos la relación (si s[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 si s[2] >= 0.5, usamos una cláusula FOREACH 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 propiedad similarity, y REMOVE para eliminar la relación cuando sea necesario. También usamos la función count() para contar el número de relaciones devueltas de MATCH.

    Esta consulta debería lograr el resultado deseado según sus requisitos.

Comments are closed.