首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Neo4j密码-匹配时的条件写入

Neo4j密码-匹配时的条件写入
EN

Stack Overflow用户
提问于 2018-12-11 02:32:11
回答 2查看 88关注 0票数 0

我有一个数据库,其中包含用户(u:User {id: 1})、用户状态(us:UserStatus {status: 'pending'})以及它们之间的关系(u)-[hs:HAS_STATUS {from: 1541030400, to: 4102444800}]->(us)

其中,用户状态可以是"pending""active""suspended"。而2100-01-01是将来的某个日期,这意味着用户仍然具有此状态。

我正在尝试运行一个查询,该查询通过创建具有新状态的新关系来更新用户的状态,并通过将to属性设置为当前日期来存档旧关系。

这是我尝试过的:

代码语言:javascript
复制
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行。无论合并如何,我如何确保它们都被执行?

编辑:原始查询有一些拼写错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-12 03:35:30

这将回答您更新后的问题

如果匹配失败,MATCH (不带OPTIONAL限定符)将中止查询的其余部分。

此查询显示了一种匹配模式的方法,如果匹配成功,则可以选择执行写操作,如果匹配失败,则不会中止查询的其余部分:

代码语言:javascript
复制
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生成。即使列表为空,查询的其余部分仍会执行。

票数 1
EN

Stack Overflow用户

发布于 2018-12-11 02:49:29

编辑:之前的答案片段被删除了,因为你说你在查询中使用的“日期”实际上是纪元秒的替身。

如果没有更改任何行,则会发生以下两种情况之一。

  1. 您的匹配(使用关联的WHERE)找不到任何匹配的模式。你应该试着只运行匹配,看看它在哪里返回任何行。
  2. 你试图合并的关系已经存在。您可能希望尝试匹配这两个节点之间的关系(具有这些属性),并查看它是否已经存在。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53711625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档