Hi Ward -
There is a bit of a hack you can use for this sort of conditional logic that involves creating dummy lists using CASE
and then iterating over them. Something like this:
create (s:SOURCE {
name:'dataflow-diagram',
title:'Dataflow Diagram'})
with s
UNWIND {json} AS obj
WITH *,
CASE WHEN obj.type == 'store' THEN [1] ELSE [] END AS stores,
CASE WHEN obj.type == 'rest' THEN [1] ELSE [] END AS rests,
CASE WHEN obj.type == 'queue' THEN [1] ELSE [] END AS queues
FOREACH (_ IN stores |
MERGE (d:DB {name: obj.store})
MERGE (g:PROGRAM {name: obj.from})
MERGE (g)-[:QUERIES {source: s.name}]->(d)
)
FOREACH (_ IN rests |
MERGE (f:PROGRAM {name: obj.from})
MERGE (t:PROGRAM {name: obj.to})
MERGE (f)-[:CALLS {source: s.name}]->(t)
)
FOREACH (_ IN queues |
CREATE (q:QUEUE {name: obj.queue})
MERGE (r:PROGRAM {name: obj.read})
MERGE (r)-[:READS {source: s.name}]->(q)
MERGE (w:PROGRAM {name: obj.write})
MERGE (w)-[:WRITES {source: s.name}]->(q)
)
Also, do you have uniqueness constraints created for any of the properties you are merging on?