【问题标题】:If statement for deleting in neo4j cypher在 neo4j 密码中删除的 if 语句
【发布时间】:2019-08-08 04:32:29
【问题描述】:

我试图仅基于包含相同值的两个节点执行分离删除,并且这两个节点接收参数化值。一旦这个条件为真,它应该运行附加子句。

我浏览了 Neo4j 社区页面并尝试了 FOREACH 方法 (https://community.neo4j.com/t/how-to-check-if-else-in-query/1533)。但是,根据我的研究,您似乎只限于只写子句。下面的代码解释了我想要实现的目标,如果两个用户节点相同,我只想执行删除操作。我还尝试了可选匹配,例如

OPTIONAL MATCH (user: User)-[:CREATED]->(moment:Moment{GUID: $guid }) WHERE user.GUID = $userId

但是,我不知何故最终删除了一系列节点并最终撤消了更改。

MATCH (user: User)-[:CREATED]->(moment:Moment{GUID: $guid })
MATCH (authUser: User{ GUID: $userId }) 

IF user.GUID == authUser.GUID:
  OPTIONAL MATCH (image:Image)-[:IS_ABOUT]->(moment)
  WITH image, moment, moment.GUID AS momentGuid, image.url AS url, image.GUID AS guid, image.filename AS filename
  DETACH DELETE moment, image

  RETURN COLLECT({
    moment: momentGuid,
    url: url,
    guid: guid,
    filename: filename
  }) AS data

理想情况下,if 语句下的代码应仅在满足条件后执行。任何建议将不胜感激,

谢谢!

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    如果MATCH 子句与其WHERE 子句(如果有)不匹配,则整个查询被中止。

    所以,你可以替换这个:

    MATCH (user: User)-[:CREATED]->(moment:Moment{GUID: $guid })
    MATCH (authUser: User{ GUID: $userId }) 
    
    IF user.GUID == authUser.GUID:
    ...
    

    用这个(简化的)sn-p:

    MATCH
      (user:User {GUID: $userId})-[:CREATED]->(moment:Moment {GUID: $guid}),
      (authUser:User {GUID: $userId})
    ...
    

    不清楚您查询的其余部分试图做什么,所以我不对此发表评论。

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多