Gremlin创建顶点时如何避免生成重复属性值的顶点?
问题根因
原有查询逻辑未做幂等校验,每遍历到1条customer_entity或membership_card记录就会无条件新建1个phone_CDP顶点,即便对应id的phone_CDP顶点已经存在,因此出现重复顶点。
修改方案
使用Gremlin的coalesce步骤实现「存在则复用、不存在则创建」的幂等逻辑,同时提前对号码值做去重处理,避免同批次遍历出现重复创建动作,修改后的查询如下:
// 处理customer_entity对应的phone_CDP创建 g.V().hasLabel('customer_entity').as('source') .values('telephone').as('phone_id') .dedup('phone_id') // 先对当前批次的telephone去重 .coalesce( V().hasLabel('phone_CDP').has('id', select('phone_id')), // 先查是否已存在对应顶点 addV('phone_CDP').property('id', select('phone_id')) // 不存在才新建 ).as('cdp_node') .addE('alias').to('source') // 建立alias边 // 处理membership_card对应的phone_CDP创建 g.V().hasLabel('membership_card').as('source') .values('Card_No_').as('phone_id') .dedup('phone_id') // 先对当前批次的Card_No_去重 .coalesce( V().hasLabel('phone_CDP').has('id', select('phone_id')), addV('phone_CDP').property('id', select('phone_id')) ).as('cdp_node') .addE('alias').to('source')
逻辑说明
dedup步骤会先对当前查询批次内的重复号码做去重,避免同一个批次内多次触发同一个id的顶点创建逻辑coalesce步骤会优先匹配已存在的同id的phone_CDP顶点,匹配到就直接复用该顶点,匹配不到才执行新建操作,从根本上避免重复顶点生成- 原有alias边的关联逻辑不受影响,每个源顶点都会和对应的
phone_CDP顶点建立关联
如果需要进一步避免重复的alias边生成,可以在addE前增加边存在性的判断逻辑即可。
内容的提问来源于stack exchange,提问作者Tien Vu
相关产品推荐
相关产品推荐

