在Neo4j中使用SET和计算值会产生“未定义”错误

时间:2016-05-26 07:53:08

标签: graph neo4j cypher

我有一个基于国际象棋锦标赛的查询。它运行正常,并返回一个值。如果它很丑,我道歉,我知道我可以清理它。但是现在它工作正常,并返回值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}}语句中进行聚合!!

再次,我为丑陋的代码道歉,并意识到我没有提供一个最小的例子。但是我希望因为这个问题本质上是语法问题,所以对于知道错误的人来说这一点很清楚。感谢。

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  │
└───┴───┘