1
votes

I would like to get a node, delete all outgoing relationships of a certain type and then add back relationships.

The problem I have is that once I grab the node, it still maintains it's previous relationships even after delete so instead of having 1 it keeps doubling whatever it has. 1->2->4->8 etc

Sample graph:

CREATE (a:Basic {name:'a'})
CREATE (b:Basic {name:'b'})
CREATE (c:Basic {name:'c'})
CREATE (a)-[:TO]->(b)
CREATE (a)-[:SO]->(c)

The query to delete the previous relationships and then add in the new relationships. (this is just a brief sample where in reality it wouldn't add back the same relationships, but more then likely point it to a different node).

MATCH (a:Basic {name:'a'})

WITH a
OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r

WITH a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)

WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c) 

If I change the CREATE to MERGE then it solves the problem, but it feels odd to have to merge when I know that I just deleted all the relationships. Is there a way to update "a" midway through the query so it reflects the changes? I would like to keep it in one query

1

1 Answers

1
votes

The behavior you observed is due the subtle fact that the OPTIONAL MATCH clause generated 2 rows of data, which caused all subsequent operations to be done twice.

To force there to be only a single row of data after the DELETE clause, you can use WITH DISTINCT a (instead of WITH a) right after the DELETE clause, like this:

MATCH (a:Basic {name:'a'})

OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r

WITH DISTINCT a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)

WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c)