如何在Cypher中根据参数实现条件SET操作?
Neo4j投票积分追踪的Cypher实现方案
你需要在创建投票关系时,同步更新Item节点的总积分、正积分和负积分属性,原代码的问题在于CASE语句的使用不符合Cypher语法规范,以下是两种可行的实现方式:
原错误代码
CREATE (u:User) -[v:VOTES_ON{ points: $points }] ->(i:Item) CASE WHEN $points > 0 SET i.points_up = COALESCE(i.points_up, 0) + $points ELSE SET i.points_down = COALESCE(i.points_down, 0) + $points SET i.points = COALESCE(i.points, 0) + $points RETURN u, v, i
方案一:使用CASE表达式批量SET
通过CASE表达式判断积分正负,直接计算各属性的累加值,在一个SET语句中完成所有更新:
CREATE (u:User)-[v:VOTES_ON{ points: $points }]->(i:Item) SET i.points_up = COALESCE(i.points_up, 0) + CASE WHEN $points > 0 THEN $points ELSE 0 END, i.points_down = COALESCE(i.points_down, 0) + CASE WHEN $points < 0 THEN $points ELSE 0 END, i.points = COALESCE(i.points, 0) + $points RETURN u, v, i
方案二:使用FOREACH实现分支逻辑
利用FOREACH的特性(循环空列表时不执行内部语句),实现条件分支的属性更新:
CREATE (u:User)-[v:VOTES_ON{ points: $points }]->(i:Item) SET i.points = COALESCE(i.points, 0) + $points -- 仅当积分为正时更新正积分 FOREACH(_ IN CASE WHEN $points > 0 THEN [1] ELSE [] END | SET i.points_up = COALESCE(i.points_up, 0) + $points ) -- 仅当积分为负时更新负积分 FOREACH(_ IN CASE WHEN $points < 0 THEN [1] ELSE [] END | SET i.points_down = COALESCE(i.points_down, 0) + $points ) RETURN u, v, i
两种方案都能正确实现需求:当$points为正时,累加至points_up;为负时累加至points_down;同时始终更新总积分points。如果$points为0,则仅更新总积分(数值不变),不修改正负积分属性。
内容的提问来源于stack exchange,提问作者psygo
相关产品推荐
相关产品推荐

