【问题标题】:How to execute cypher query within a CASE WHEN THEN clause in Neo4j Cypher如何在 Neo4j Cypher 的 CASE WHEN THEN 子句中执行密码查询
【发布时间】:2018-11-21 00:28:10
【问题描述】:

我有一个用例,我试图通过使用 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'。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您仍应在第一次匹配中使用标签,否则您将获得完整的数据库扫描,而不是通过电子邮件进行索引查找!

    对于您的查询,您可以使用模式理解:

    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;
    

    【讨论】:

    • 在 then 块中可以使用的查询类型是否有限制?我想在 then 块中 UNWIND 参数和 CREATE 节点等......另外,是否有比开发人员文档更深入的文档?
    • 您不能在 CASE 语句中使用子句(例如 UNWIND 和 CREATE 等)。 Michael 的方法之所以有效,是因为模式推导(从模式中提取结果列表)是表达式。这是我们社区网站上的一个答案,它提供了conditional cypher execution 的选项。
    • 好的...所以我打算使用 FOREACH 和 CASE WHEN 的组合,但@InverseFalcon 用 FOREACH 不允许 MATCH、WITH 等事实来打破这个想法。所以现在建议是 apoc.do.when()...我已经编辑了问题以显示我的意图...我如何使用 apoc.do.when 来实现这一点。
    • 在 2020 年仍然非常有用,neo4j 3.5。
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多