Hi there, I have similar problem and I commented on Repository Save/Find Depth to avoid creating new thread. However I think our best way will be to have "custom" queries. I currently do some stuff by using method which returns Flux and check for result.awaitFirstOrNull() to verify that update has been made (this is Kotlin + Webflux). In query, I return id(n), where n represents newly created something I don't care about but want to have as non-null as a proof of creation.
Example: I have buildings which should be connected to places, and on each new construction event is created, if place is in neo4j I call additional query like
CREATE (place)-[relationship:HAS_PLACE]->(c) RETURN id(relationship). Your way might be non-reactive and Java which could be simple Object as return type or Long or actual creation of some node and not relationship; depending on what you really need. Also this is quite OK for me as I can do it with @Query(..) above interface method.
I still didn't get reply but I'm guessing my way of using the graph database is not so good as point of it is usually (from what I understood from Gerrit in reply above comment shared) to load part of the graph and work with it for some analytics or some other purpose or in other words: usually you want connected nodes and relationships and not just 1 node.
So since this might be the case, I guess you can try what I want to do but can't in Kotlin that easily (because of problems with @Transient on constructor parameter in data class). You can remove relationship annotation, and put @Transient on that field. Then before saving the object you can get all items from the list and persist them separately. That of course has heavy impact on your create/update actions in terms of performance but there's always a way on how to use framework and still achieve your goal if not supported directly in framework. Anyways in my project I have repository, service and a domain model as data class. Copying it is now service process as .copy uses only constructor parameters and since @Transient doesn't work on those, I had to put the member inside class and keep track of it in service. Once data is stored I take old records related objects and put them to DB where I made my own way of "upsert". Once those are in order I join back record from neo4j and list of relationships and convert it all to DTO as user response.