【问题标题】:SET in combination with CASE statement in cypherSET 与密码中的 CASE 语句相结合
【发布时间】:2014-03-17 16:27:44
【问题描述】:

我正在尝试将两个不同的关系属性设置为一个计数,其中一个案例构造取决于另一个关系属性的值。 http://console.neo4j.org/?id=rt1ld5有一个控制台

cnt 列包含 r.value 出现的次数。控制台中初始查询的前两行表明术语“汽车”链接到一个被认为相关的文档,以及两个被认为不相关的文档。

我想用两个属性在 (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"
  ^

【问题讨论】:

  • 对于任何好奇的人,若要解决上述错误,请在“cnt”后加逗号。查询中还有其他错误,但希望这会让您更接近解决其他错误。

标签: neo4j case cypher


【解决方案1】:

做到了!另请参阅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

【讨论】:

  • 按照这个语法,我正在编写一个类似这样的查询: match (node) where node.label="ParameterSetter" or node.label="Parameter" with node order by node。 thread_id,node.event_seq_no with node,head(node) as firstNode,sum(case when firstNode.label="ParameterSetter" then 0 else 1) as firstIndex 它给我错误消息 mismatched input 'when ' 期待 ';' 在 case 子句中。我错过了什么吗?
  • 这有效:匹配(节点),其中 node.label="ParameterSetter" 或 node.label="Parameter" 与 node.thread_id 的节点顺序,node.event_seq_no 与 head(collect(node)) AS firstNode with sum(case when firstNode.label="ParameterSetter" then 0 else 1 end) as firstIndex return *
【解决方案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 使用的值,而不是在CASE 中放置条件赋值。

【讨论】:

  • 我花了一些时间才理解 CASE 在密码中的使用方式,所以感谢您的额外解释。而且,是的,将它们分开很重要,因为目前尚不清楚如何进一步处理结果。仅使用总和将隐藏 pos:50 / neg:49 和 pos:2/neg: 1 之间的差异
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2013-04-23
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多