SET与cypher中的CASE语句结合使用

时间:2014-03-17 16:27:44

标签: neo4j case cypher

我试着为一个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"
  ^

2 个答案:

答案 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;

被解析为可以在语句中使用的值xy,所以

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}中放置条件赋值}}