【问题标题】:A neo4j cypher query with a nullable parameter used for optional creation of a relationship - is this possible?带有可空参数的 neo4j 密码查询用于可选地创建关系 - 这可能吗?
【发布时间】:2014-03-27 10:26:25
【问题描述】:

上下文(解释“应用程序”一词在域模型中的使用):我的软件管理休假申请(以取代旧式的纸质假期申请表)。

有没有办法在一个接受可为空/可选参数“projectManager”的密码查询中处理以下两个类似查询?

//createApplicationForUserWithProjMgr:
     match (u:User), (s:User), (p:User), (l:User)
         where u.username={username}  and
         s.username={substitute} and
         p.username={projectManager} and
         l.username={lineManager}
     create (u)-[ur:APPLIED_FOR]->(a:Application),
         (a)-[sr:SUBSTITUTE]->(s),
         (a)-[pr:PROJECT_MANAGER]->(p),
         (a)-[lr:LINE_MANAGER]->(l)
   set a={application}
   return a, s, l, u, sr, lr, ur, p, pr"""

//createApplicationForUserWithoutProjMgr:
     match (u:User), (s:User), (l:User)
         where u.username={username}  and
         s.username={substitute} and
         l.username={lineManager}
     create (u)-[ur:APPLIED_FOR]->(a:Application),
         (a)-[sr:SUBSTITUTE]->(s),
         (a)-[lr:LINE_MANAGER]->(l)
     set a={application}
     return a, s, l, u, sr, lr, ur"""

【问题讨论】:

    标签: parameters neo4j relationship cypher


    【解决方案1】:

    这在技术上是可行的,但解决方案是一种 hack,您目前的情况会更好,除非这是一个性能瓶颈,为了清楚起见,在两个查询中执行此操作。我相信稍后会添加支持以干净的方式执行此操作,但目前尚未开发。

    hack 是使用 FOREACH 作为分支语句,因此 foreach 项目经理,创建一个,如果没有项目经理作为参数发送,则不会创建。在这种情况下,您需要将 null 转换为空列表,但您可以使用 COALESCE:

    FOREACH( manager IN COALESCE(managers ,[]) | CREATE (pm:ProjectManager))
    

    【讨论】:

    • 这看起来很酷,谢谢!当所有关系(替代、projMgr、lineMgr)都是可选的时,我肯定会更喜欢您的解决方案而不是单独的查询。我最终会得到线性跨度 - 每个空/非空组合一个查询 - 以及决定执行哪个查询的丑陋代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2014-10-05
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多