Saltar al contenido

Cypher Neo4J – Expresión CASE con MERGE

Este dilema se puede solucionar de variadas formas, pero te dejamos la que en nuestra opinión es la respuesta más completa.

Solución:

Para hacer operaciones de escritura condicional necesitas usar el FOREACH truco. Usando CASE o devuelves un elemento array o uno vacío. FOREACH itera sobre el CASE expresión y, por lo tanto, ejecuta condicionalmente la acción. si quieres un ELSE parte también necesitas tener otra FOREACH utilizando la condición inversa en el CASE. Como ejemplo, en lugar de

WHEN 'y' THEN
   MERGE (u)-[r2:STAGE startdate:20141225, enddate:'99999999', status:'InProgress']->(b2     fork:'fail') RETURN 1
ELSE 
    MERGE (u)-[r2:STAGE startdate:20141225, enddate:'99999999', status:'InProgress']->(b2)   RETURN 2
END

usar

FOREACH(ignoreMe IN CASE WHEN 'y' THEN [1] ELSE [] END | 
    MERGE (u)-[r2:STAGE startdate:20141225, enddate:'99999999', status:'InProgress']->(b2 fork:'fail')
)
FOREACH(ignoreMe IN CASE WHEN NOT 'y' THEN [1] ELSE [] END | 
    MERGE (u)-[r2:STAGE startdate:20141225, enddate:'99999999', status:'InProgress']->(b2)
)

Vea también la publicación de blog de Mark sobre esto.

Se solucionó el problema de la siguiente manera

WITH u, b2,b1, g, r1, CASE  WHEN (b1.fork='y' and b2.fork='success') or (b1.fork='n') or   (b1.fork='success') THEN ['ok'] ELSE [] END as array1
FOREACH (el1 in array1 | MERGE (u)-[r2:STAGE startdate:20141225, enddate:99999999, status:'InProgress']->(b2))

es decir, usó CASE WHEN para crear un dummy array que de alguna manera tiene elementos ficticios que coinciden con el recuento de coincidencias y luego usa FOREACH para iterar a través del resultado.

De nuevo, gracias Stefan por la idea…

profundo

Aquí tienes las reseñas y puntuaciones

Puedes respaldar nuestra publicación mostrando un comentario y dejando una puntuación te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *