Many of the relationships are rather associations than contains-relationships so there the "dangling" node is the intended outcome.
I would create service methods around use-cases where the use-case specifies what has to be deleted and how far into the graph.
Then you can for instance write a single cypher query that returns all the nodes that should be deleted and you can delete them in one loop. (Could even be generified into template.deleteAll(String query) ).
So as there is already repository.delete(Iterable) so there should probably also be a similar method on template.
So it is just a one-liner to implement a cascading delete which is usecase specific and not generic and leads to annotation configuration hell.
One could also imagine having @Query annotated methods on repositories like @Query(...) public long deleteXX()
Michael