我试着为一个count设置两个不同的关系属性,case结构取决于另一个关系属性的值。 http://console.neo4j.org/?id=rt1ld5
有一个控制台cnt列包含r.value发生的次数。控制台中初始查询的前两行表示术语" Car"链接到1个被认为相关的文档,以及两个被认为不相关的文档。
我想在(user)和(term)之间的[:INTEREST]关系上设置一个属性,该属性有两个属性,表示兴趣被链接到被认为是否相关的文档的次数。所以对于(John) - [r:INTEREST] - >(Car)我想要r.poscnt = 1和r.negcnt = 2
我正在与CASE结构斗争。我尝试了各种方法,这是我得到的最接近的方式。
MATCH (u:user)-[int:INTEREST]->(t:term)<-[:ISABOUT]-(d:doc)<- [r:RELEVANCE]-(u)
WITH int, t.name, r.value, count(*) AS cnt
CASE
WHEN r.value=1 THEN SET int.poscnt=cnt
WHEN r.value=-1 THEN SET int.negcnt=cnt
END
但是它返回了一个错误
Error: Invalid input 'A': expected 'r/R' (line 3, column 2)
"CASE"
^
答案 0 :(得分:5)
这样做了!另请参阅http://console.neo4j.org/?id=rq2i7j
处的控制台MATCH (u:user)-[int:INTEREST]->(t:term)<-[:ISABOUT]-(d:doc)<-[r:RELEVANCE]-(u)
WITH int, t,
SUM(CASE WHEN r.value= 1 THEN 1 ELSE 0 END ) AS poscnt,
SUM(CASE WHEN r.value= -1 THEN 1 ELSE 0 END ) AS negcnt
SET int.pos=poscnt,int.neg=negcnt
RETURN t.name,int.pos,int.neg
答案 1 :(得分:2)
将阳性和阴性计数分开是否重要?看起来你可以有一个score
属性,将正值和负值相加。
MATCH (u:user)-[int:INTEREST]->()<-[:ISABOUT]-()<-[r:RELEVANCE]-(u)
SET int.score = SUM(r.value)
RETURN t.name, int.score
您似乎已经找到了可行的解决方案,但我会根据我的理解添加关于CASE
的说明。虽然CASE
提供了分支,但我认为这是表达而不是声明是正确的。它比条件语句更像三元运算符。
作为表达式
a > b ? x : y;
被解析为可以在语句中使用的值x
或y
,所以
CASE WHEN a > b THEN x ELSE y END
解析为某个值。然后,您可以指定此值
result = CASE WHEN a > b THEN x ELSE y END
您的原始查询使用CASE
表达式,如条件语句
CASE WHEN a > b THEN result = x ELSE result = y END
类似于if-else
if a > b { result = x; } else { result = y; }
有人可能想要更正术语,关键是在您的工作查询中,您正确地让CASE
解析为SUM
使用的值,而不是在{{1}中放置条件赋值}}