UNWIND $rows AS row WITH row MERGE (a:YoutubeAsset:YouTube {assetId: row.ASSETID}) ON CREATE SET a.id = randomUUID(), a.isrc = CASE WHEN row.ISRC IS NOT NULL THEN row.ISRC ELSE row.VIDEO_ISRC END, a.name = row.TRACKNAME, a.createdAt = datetime(), a.modifiedAt = datetime() ON MATCH SET a.isrc = CASE WHEN row.ISRC IS NOT NULL THEN row.ISRC ELSE row.VIDEO_ISRC END, a.name = row.TRACKNAME, a.modifiedAt = datetime() WITH row, a MATCH (v:Video:YouTube {videoId: row.VIDEOID}) //soundrecording asset FOREACH (_ IN CASE WHEN row.ISRC <> row.VIDEO_ISRC THEN [1] ELSE [] END | MERGE (a)-[:APPEARS_IN_VIDEO]->(v) ) //video asset FOREACH (_ IN CASE WHEN row.ISRC = row.VIDEO_ISRC THEN [1] WHEN row.ISRC IS NULL and v.isrc = row.VIDEO_ISRC THEN [1] ELSE [] END | MERGE (a)-[:IS]->(v) ) //create connection with gsr WITH v OPTIONAL MATCH (v)<-[:IS]-(:YoutubeAsset)<-[:REPRESENTS]-(gsr_represents_youtube_asset_which_is_video:GlobalSoundRecording) OPTIONAL MATCH (v)<-[:APPEARS_IN_VIDEO]-(:YoutubeAsset)<-[:REPRESENTS]-(related_gsr:GlobalSoundRecording) FOREACH(_ IN CASE WHEN gsr_represents_youtube_asset_which_is_video IS NOT NULL AND gsr_represents_youtube_asset_which_is_video.isrc = v.isrc THEN [1] ELSE [] END | MERGE (v)<-[:REPRESENTS_VIDEO]-(gsr_represents_youtube_asset_which_is_video) ) FOREACH(_ IN CASE WHEN related_gsr IS NOT NULL THEN [1] ELSE [] END | MERGE (v)<-[:RELATED_TO_VIDEO]-(related_gsr) )