How to do merge nodes multiple times?

Hi all,

Assume you have following situation:

merge (c:Container {name:"Container"})-[:CONTAINS]->(i11:Item {name:"11"})<-[:BELONGS_TO]-(ba:Bag {name: "A"})
with c, ba
merge (c)-[:CONTAINS]->(i12:Item {name:"12"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i13:Item {name:"13"})<-[:BELONGS_TO]-(ba)
with c, ba, i13
merge (c)-[:CONTAINS]->(i14:Item {name:"14"})<-[:BELONGS_TO]-(ba)
with c, ba, i13, i14
merge (bb:Bag {name: "B"})
with c, ba, bb, i13, i14
merge (i13)<-[:BELONGS_TO]-(bb)
with c, ba, bb, i13, i14
merge (i14)<-[:BELONGS_TO]-(bb)
with c, ba, bb
merge (c)-[:CONTAINS]->(i15: Item {name:"15"})<-[:BELONGS_TO]-(bb)
with c, ba, bb
merge (bc:Bag {name: "C"})
with c, ba, bb, bc
merge (c)-[:CONTAINS]->(i16:Item {name:"16"})<-[:BELONGS_TO]-(bc)
with c, ba, bb, bc
merge (c)-[:CONTAINS]->(i17:Item {name:"17"})<-[:BELONGS_TO]-(bc)
with c, ba, bb, bc
merge (c)-[:CONTAINS]->(i18:Item {name:"18"})<-[:BELONGS_TO]-(bc)
with c, ba, bb, bc, i18
merge (c)-[:CONTAINS]->(i19:Item {name:"19"})<-[:BELONGS_TO]-(bc)
with c, ba, bb, bc, i18, i19
merge (i18)<-[:BELONGS_TO]-(bb)
with c, ba, bb, bc, i18, i19
merge (i19)<-[:BELONGS_TO]-(bb)
with c, ba, bb, bc
merge (c)-[:CONTAINS]->(i20:Item {name:"20"})<-[:BELONGS_TO]-(bd:Bag {name:"D"})
with c, ba, bb, bc, bd
merge (c)-[:CONTAINS]->(i21:Item {name:"21"})<-[:BELONGS_TO]-(bd)

You can best see the situation with:

MATCH (c:Container)-[:CONTAINS]->(i:Item)<-[:BELONGS_TO]-(b:Bag) 
RETURN *

I want to merge "Bag"-nodes that belongs to at least on common "Item"-node. As result I expect the following:

merge (c:Container {name:"Container"})-[:CONTAINS]->(i11:Item {name:"11"})<-[:BELONGS_TO]-(ba:Bag {name: "A, B, C"})
with c, ba
merge (c)-[:CONTAINS]->(i12:Item {name:"12"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i13:Item {name:"13"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i14:Item {name:"14"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i15:Item {name:"15"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i16:Item {name:"16"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i17:Item {name:"17"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i18:Item {name:"18"})<-[:BELONGS_TO]-(ba)
with c, ba
merge (c)-[:CONTAINS]->(i19:Item {name:"19"})<-[:BELONGS_TO]-(ba)
with c
merge (c)-[:CONTAINS]->(i20:Item {name:"20"})<-[:BELONGS_TO]-(bd:Bag {name:"D"})
with c, bd
merge (c)-[:CONTAINS]->(i21:Item {name:"21"})<-[:BELONGS_TO]-(bd)

Can you help me to develop a suitable cypher statement?

Just use an UNWIND or FOREACH loop for your merges.
the items list is a list of strings, should be a parameter.

also do you really want i12 etc, be only merged in the context of ba and c?
or globally?

MERGE (c:Container {name:"Container"})
MERGE (ba:Bag {name: "A, B, C"})
UNWIND $items as itemName
MERGE (item:Item {name:itemName})
MERGE (c)-[:CONTAINS]->(item)
MERGE (item)<-[:BELONGS_TO]-(ba)