我必须在 CASE 中有条件地执行查询,并为临时变量分配一些值,这有助于解析我的previous question。
这是我的查询,返回语法错误:
MERGE(a {word:'review'})-[r:jsim]->(b{word:"nothing"})
ON CREATE set r.temp = false
ON MATCH set r.temp = true
CASE{r.val}
WHEN {r.temp}
THEN [MATCH (a)-[s]->(b{word:"equal"})
SET r.val = s.val
]
WITH r, r.temp AS result
REMOVE r.temp
RETURN result
我的语法错误是:
Invalid input 'A': expected 'r/R' (line 4, column 2 (offset: 112))
"CASE r.temp "
^
建议后我的更新查询:
MERGE(a {word:'review'})-[r:jsim]->(b{word:"nothing"})
ON CREATE set r.temp = false
ON MATCH set r.temp = true
WITH r, CASE r.val WHEN r.temp THEN [MATCH (a)-[s]->(b {word:"equal"}) RETURN s.val] ELSE [] END as toDo
UNWIND toDo as val
SET r.val = head(val)
WITH r, r.temp AS result,s
REMOVE r.temp
RETURN result
请帮我调试一下。
答案 0 :(得分:1)
您的CASE陈述错误:
CASE {var}
WHEN {value} THEN [something]
WHEN {value2} THEN [something]
ELSE [something]
END
而且,我无法理解你案件的意思,只有一个条件。
答案 1 :(得分:1)
这里有很多东西:
a)在实体(node / rel)上设置多个值时,需要使用逗号,
来分隔它们。所以在set r.temp = true
b)正如logisima所述,案例的工作流程是
CASE
WHEN ..
THEN ..
ELSE ..
END
但是,{}
仅供参考,您不需要将变量括在{}
c)您无法在CASE步骤中执行查询,解决方法是为其构建虚拟集合。我认为对于你的用例,这应该可以解决问题:
MERGE(a {word:'review'})-[r:jsim]->(b{word:"nothing"})
ON CREATE set r.temp = false
ON MATCH set r.temp = true
WITH r, CASE r.val WHEN r.temp THEN [a] ELSE [] END as toDo
UNWIND toDo as a
MATCH (a)-[s]->(b {word:"equal"})
SET r.val = s.val
WITH r, r.temp AS result
REMOVE r.temp
RETURN result
所以,这里的成就是,当CASE条件为真时,你将拥有一个包含节点a
的集合,当为false时为空集合。这意味着空将仅适用于非空集合。
答案 2 :(得分:0)
此查询是否适用于您的用例?
OPTIONAL MATCH (a { word:'review' })-[r:jsim]->(b { word:"nothing" })
WITH a, r, b, (r IS NOT NULL) AS result
OPTIONAL MATCH (a)-[s]->({ word:"equal" })
FOREACH (x IN CASE
WHEN r IS NULL THEN [1]
ELSE [] END |
CREATE ({ word:'review' })-[:jsim]->({ word:"nothing" }))
FOREACH (y IN CASE
WHEN s IS NOT NULL THEN [1]
ELSE [] END |
SET r.val = s.val)
RETURN result;
如果第一个OPTIONAL MATCH
找不到匹配项,则第二个OPTIONAL MATCH
不应该点击数据库,因为a
将是NULL
。
如果第一个FOREACH
失败,则第一个CREATE
只会执行OPTIONAL MATCH
。这模仿MERGE
行为。
如果两个FOREACH
子句找到匹配项,则第二个r.val
只会设置OPTIONAL MATCH
值。