我有一个基于国际象棋锦标赛的查询。它运行正常,并返回一个值。如果它很丑,我道歉,我知道我可以清理它。但是现在它工作正常,并返回值0.5。
为了快速提供一些背景信息,查询会查看某人对手的对手,并汇总第二级玩家的记录,然后创建排名。
MATCH (n)-[:HAS_RECORD]-(m)-[:PLAYED]-(a)-[:PLAYED]-(b)-[:HAS_RECORD]-(c)-[:HAS_RECORD]-(d)-[:PLAYED]-(e)-[:PLAYED]-(f)-[:HAS_RECORD]-(g)
WHERE n.player_id = '1'
WITH e, f,
CASE WHEN e.player_wins='1' THEN 1 ELSE 0 END AS wins_count
RETURN (toFloat(sum(win_count)) / toFloat(count(e))) * (sum(toInt(f.wins) ) / (sum(toInt(f.wins)) + sum(toInt(f.losses)) +sum(toInt(f.draws)))) AS rank
我希望SET
这个计算的排名回到节点e
中代表的玩家身上。但我不能这样做。
我尝试了这个,但它没有用......我收到了一个错误,wins_count not defined
:
MATCH (n)-[:HAS_RECORD]-(m)-[:PLAYED]-(a)-[:PLAYED]-(b)-[:HAS_RECORD]-(c)-[:HAS_RECORD]-(d)-[:PLAYED]-(e)-[:PLAYED]-(f)-[:HAS_RECORD]-(g)
WHERE n.player_id = '0'
WITH e, f,
CASE WHEN e.player_wins='1' THEN 1 ELSE 0 END AS wins_count,
(toFloat(sum(wins_count)) / toFloat(count(e))) * (sum(toInt(f.wins) ) / (sum(toInt(f.wins)) + sum(toInt(f.losses)) +sum(toInt(f.draws)))) AS rank
SET e.rank = rank
RETURN e
我不知道如果不将其rank
放在CASE
之后,我还能如何计算wins_count
。
我认为因为WITH
没有被定义存在问题,我可能需要进行操作,所以我尝试在CASE
之后添加另一个SET
,但之后失败了...我以某种方式生成了一个排行榜!
然后,我尝试将计算排名的部分直接移动到SET
语句中,但显然你不能在{{1}}语句中进行聚合!!
再次,我为丑陋的代码道歉,并意识到我没有提供一个最小的例子。但是我希望因为这个问题本质上是语法问题,所以对于知道错误的人来说这一点很清楚。感谢。
答案 0 :(得分:1)
当我们在WITH
语句中声明变量时,我们无法在同一WITH
语句中使用它。例如,如果我们尝试运行以下查询:
WITH 2 as K1, K1*3 as K2
RETURN K1, K2
我们收到错误:Variable 'K1' not defined
。
因此,我们可以使用下一个查询:
WITH 2 as K1
RETURN K1, K1*3 as K2
或:
WITH 2 as K1
WITH K1, K1*3 as K2
RETURN K1, K2
,结果将是:
╒═══╤═══╕
│K1 │K2 │
╞═══╪═══╡
│2 │6 │
└───┴───┘