Neo4j - 如何执行嵌套查询

时间:2015-10-27 13:57:42

标签: neo4j cypher

我必须在 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

请帮我调试一下。

3 个答案:

答案 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值。