我有一个数据库,其中包含用户(u:User {id: 1})
、用户状态(us:UserStatus {status: 'pending'})
以及它们之间的关系(u)-[hs:HAS_STATUS {from: 1541030400, to: 4102444800}]->(us)
。
其中,用户状态可以是"pending"
、"active"
或"suspended"
。而2100-01-01
是将来的某个日期,这意味着用户仍然具有此状态。
我正在尝试运行一个查询,该查询通过创建具有新状态的新关系来更新用户的状态,并通过将to
属性设置为当前日期来存档旧关系。
这是我尝试过的:
MERGE (u:User { id: 1 })
WITH u
MATCH (u)-[hs1:HAS_STATUS]->(us1:UserStatus)
WHERE us1.status <> 'active' AND hs1.to > 1544400000
SET hs1.to = 1544400000
MERGE (us2:UserStatus {status: 'active'})
MERGE (u)-[hs2:HAS_STATUS {from: 1544400000, to: 4102444800}]->(us2)
如果用户已经具有满足WHERE
子句的状态,则将其存档并创建新的状态关系。但是,如果用户还没有状态,则会跳过SET
子句(如预期的那样),但是也会跳过两个MERGE
行。无论合并如何,我如何确保它们都被执行?
编辑:原始查询有一些拼写错误。
发布于 2018-12-12 03:35:30
这将回答您更新后的问题
如果匹配失败,MATCH
(不带OPTIONAL
限定符)将中止查询的其余部分。
此查询显示了一种匹配模式的方法,如果匹配成功,则可以选择执行写操作,如果匹配失败,则不会中止查询的其余部分:
MERGE (u:User { id: 1 })
FOREACH(hs IN
[(u)-[hs1:HAS_STATUS]->(us1:UserStatus)
WHERE us1.status <> 'active' AND hs1.to > 1544400000 | hs1] |
SET hs.to = 1544400000)
MERGE (us2:UserStatus {status: 'active'})
MERGE (u)-[hs2:HAS_STATUS {from: 1544400000, to: 4102444800}]->(us2);
此查询使用FOREACH子句迭代匹配hs1
值的列表(在本例中,大小为0或1 ),将每个值的to
值设置为1544400000
。该列表由pattern comprehension生成。即使列表为空,查询的其余部分仍会执行。
发布于 2018-12-11 02:49:29
编辑:之前的答案片段被删除了,因为你说你在查询中使用的“日期”实际上是纪元秒的替身。
如果没有更改任何行,则会发生以下两种情况之一。
https://stackoverflow.com/questions/53711625
复制相似问题