首页 > 解决方案 > Neo4j:为多种情况更新节点

问题描述

我正在设计一个查询,可以处理更新我的节点以应对多种情况。但是,我似乎无法实现一种特殊情况。

数据模型:

个人车主在线销售汽车的平台 用户可以购买汽车,并在购买时创建一个带有时间戳的日历节点作为属性(即 start_ts)。如果用户决定在以后出售汽车,则将另一个时间戳作为属性添加到日历节点(即 end_ts)。

案子:

我的问题是当用户卖掉了他的车,但是如果用户想买回他卖的车,一个新的节点(日历)就不会创建。

注意:对于我只想更新用户 da 的情况,我使用 MERGE 而不是 CREATE

询问:

UNWIND $userdata AS user
MATCH (u:User {ID:user.ID})
// Updating properties
SET u += user
WITH u, user

// Check if car is already assigned to another user
OPTIONAL MATCH (cr:Car)<-[:ON]-(cal:Calendar)<-[:BOUGHT]-(us:User)
WHERE NOT EXISTS(cal.end_ts) AND NOT us.ID = user.ID AND cr.ID IN $cars
SET cal.end_ts=datetime()
WITH u

// Check if car is removed
OPTIONAL MATCH (cr:Car)<-[:ON]-(cal:Calendar)<-[:BOUGHT]-(u)
WHERE NOT EXISTS(cal.end_ts) AND NOT cr.ID IN $cars 
SET cal.end_ts=datetime()
WITH u

// Attach car to user
OPTIONAL MATCH (c:Car)
WHERE c.ID IN $cars
FOREACH (ignoreMe IN CASE WHEN c IS NULL THEN [] ELSE [1] END  | MERGE (c)<-[:ON]-(cal:Calendar)<-[:BOUGHT]-(u)
ON CREATE SET cal.start_ts=datetime())
RETURN DISTINCT u AS data

我不知道如何解决这个问题。提前致谢

标签: neo4jcypher

解决方案


推荐阅读