neo4j - 如何在 Neo4j Cypher 的 CASE WHEN THEN 子句中执行密码查询
问题描述
我有一个用例,我试图通过使用 Cypher 中的 RETURN CASE WHEN THEN 子句根据 WHEN 结果运行不同的查询来优化我的 Neo4j 数据库调用和代码。这是我的例子:
MATCH (n {email: 'abc123@abc.com'})
RETURN
CASE WHEN n.category='Owner' THEN MATCH '(n)-[r:OWNS]->(m)'
WHEN n.category='Dealer' THEN MATCH (n)-[r:SUPPLY_PARTS_FOR]->(m)
WHEN n.category='Mechanic' THEN MATCH (n)-[r:SERVICE]-(m) END
AS result;
我不确定这是否合法,但这是我想要实现的。我收到语法错误,例如无效输入“>”。我怎样才能以最好的方式实现这一目标?编辑可能的 APOC 解决方案:这是我在发现 FOREACH 的局限性之前的计划......
MATCH (user:Person {email:{paramEmail}})
FOREACH (_ IN case when 'Owner' = {paramCategory} then [1] else [] end|
SET user:Owner, user += queryObj
WITH user, {paramVehicles} AS coll
UNWIND coll AS vehicle
MATCH(v:Vehicles {name:vehicle})
CREATE UNIQUE (user)-[r:OWNS {since: timestamp()}]->(v)
SET r += paramVehicleProps
)
FOREACH (_ IN case when 'Mechanic' = {Category} then [1] else [] end|
SET user:Owner, user += queryObj
WITH user, {paramVehicles} AS coll
….
)
FOREACH (_ IN case when 'Dealer' = {paramCategory} then [1] else [] end|
SET user:Owner, user += queryObj
WITH user, {paramVehicles} AS coll
…...
)
RETURN user,
CASE {paramCategory}
WHEN 'Owner' THEN [(n)-[r:OWNS]->(m) | m and r]
WHEN 'Dealer' THEN [(n)-[r:SUPPLY_PARTS_FOR]->(m) | m]
WHEN 'Mechanic' THEN [(n)-[r:SERVICE]-(m) | m]
END AS result`,{
paramQueryObj: queryObj,
paramVehicles: makeVehicleArray,
paramVehicleProps: vehiclePropsArray,
paramSalesAgent: dealerSalesAgentObjarray,
paramWarehouseAgent: dealerWarehouseAgentObjarray
}).....
有谁知道使用 apoc.do.when() 进行转换?请注意,我在第一个 THEN 中需要 'm' 和 'r'。
解决方案
您仍然应该在第一次匹配中使用标签,否则您将获得完整的数据库扫描,而不是通过电子邮件进行索引查找!
对于您的查询,您可以使用模式理解:
MATCH (n:Person {email: 'abc123@abc.com'})
RETURN
CASE n.category
WHEN 'Owner' THEN [(n)-[r:OWNS]->(m) | m]
WHEN 'Dealer' THEN [(n)-[r:SUPPLY_PARTS_FOR]->(m) | m]
WHEN 'Mechanic' THEN [(n)-[r:SERVICE]-(m) | m] END
AS result;
推荐阅读
- activerecord - Ruby 错误:未定义的局部变量或方法“c”
- authentication - 如何进行基本的 http 身份验证(登录和注册)并存储令牌
- python-3.x - 我无法从 python 代码中理解这个形状
- angular - 身份验证服务 - 无法实现
- html - 删除表单内进度元素周围的空格
- reactjs - 使用 React Router 重新加载 Webpack HotModule 渲染与组件
- javascript - 使用 wave 示例的相机位置和设备控制
- python - ubuntu 在哪里找到 python 3.6.8 而不是 2.7?我应该参考哪些信息来理解原理?
- java - 如何在 Spring Boot 中以常规的 intravels 动态填充来自 JSON 文件的数据的列表。[@日程]
- google-apps-script - 在 Pixelbook clasp 登录过程中无法登录 localhost