Запрос шифрования neo4j с параметром NULL, используемым для необязательного создания отношения - возможно ли это?

Контекст (чтобы объяснить использование слова "приложение" в модели предметной области): Мое программное обеспечение управляет заявлениями об отпуске (для замены бланков заявлений на школьные каникулы на бумаге).

Есть ли способ обработать два аналогичных запроса ниже в одном запросе шифра, который принимает необязательный / необязательный параметр "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 ответ

Это технически возможно, но решение - это взлом, и вам лучше, если только это не является узким местом в производительности, сделать это в двух запросах для ясности. Я верю, что позже будет добавлена ​​поддержка, чтобы сделать это чисто, но в настоящее время она не находится в разработке.

Хак - это использовать FOREACH в качестве оператора ветвления, поэтому для каждого менеджера проекта создайте его, который не будет создан, если в качестве параметра не был отправлен менеджер проекта. В этом случае вам нужно будет преобразовать ноль в пустой список, но вы можете использовать COALESCE для этого:

FOREACH( manager IN COALESCE(managers ,[]) | CREATE (pm:ProjectManager))
Другие вопросы по тегам