Cypher Neo4J - 使用MERGE进行CASE表达

dee*_*esh 10 merge logic case neo4j cypher

我正在尝试在Cypher中实现逻辑,根据特定条件(CASEStatement),我会创建一些节点和关系; 代码如下

MATCH (g:Game)-[:PLAYER]->(u:User)-[r1:AT]->(b1:Block)-[:NEXT]->(b2:Block) 
WHERE g.game_id='G222' and u.email_id = 'xyz@example.com' and b1.block_id='16' 
SET r1.status='Skipped', r1.enddate=20141225
WITH u, b2,b1, g, r1
SET b1.test = CASE b2.fork 
WHEN 'y' THEN
     MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2     {fork:'fail'}) RETURN 1
ELSE 
     MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2)   RETURN 2
END
WITH u, g
MATCH (u)-[:TIME]->(h:Time)<-[:TIME]-(g)
SET h.after = 0
SET h.before = h.before + 1
Run Code Online (Sandbox Code Playgroud)

在此查询中有一条merge语句WHEN 'y' THEN,此查询会引发错误:

输入']'无效:预期的空格或关系模式(第7行,第82列)"MERGE(u) - [r2:STAGE {startdate:20141225,enddate:'99999999',status:'InProgress'}] - >( b2 {fork:'fail'})返回1"

基本上我正在尝试创建一个基于属性的关系,即MERGE在一个CASE语句中,我尝试了不同的方法让它像返回一样工作,以便返回一些值等但是到目前为止没有任何工作.

这个查询可能有什么问题?

Ste*_*ter 18

要进行条件写操作,您需要使用该FOREACH技巧.使用CASE您返回一个元素数组或空元素数组.FOREACH迭代CASE表达式,因此有条件地执行操作.如果你想要一个ELSE部件,你需要FOREACH使用另一个使用反向条件CASE.作为一个例子,而不是

WHEN 'y' THEN
   MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2     {fork:'fail'}) RETURN 1
ELSE 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2)   RETURN 2
END
Run Code Online (Sandbox Code Playgroud)

使用

FOREACH(ignoreMe IN CASE WHEN 'y' THEN [1] ELSE [] END | 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2 {fork:'fail'})
)
FOREACH(ignoreMe IN CASE WHEN NOT 'y' THEN [1] ELSE [] END | 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2)
)
Run Code Online (Sandbox Code Playgroud)

另见Mark的博客文章.