带有可空参数的neo4j cypher查询用于可选的关系创建 - 这可能吗?

时间:2014-03-27 10:26:26

标签: parameters neo4j relationship cypher

上下文(用于解释在域模型中使用“#34;应用程序"”一词):我的软件管理休假申请(用纸上替换旧式度假申请表)。

有没有办法在一个cypher查询中处理下面两个类似的查询,这个查询接受一个可空/可选参数" 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"""

1 个答案:

答案 0 :(得分:3)

这在技术上是可行的,但是解决方案是一个黑客攻击,除非这是一个性能瓶颈,否则你现在更好,为了清晰起见,在两个查询中执行此操作。我相信稍后会以干净的方式增加支持,但目前还没有开发。

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

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