【问题标题】:Execute multiple query based on multiple condition in cypher / apoc根据 cypher / apoc 中的多个条件执行多个查询
【发布时间】:2018-02-15 22:49:27
【问题描述】:

在 cypher 或 APOC 中,有没有办法根据多个条件执行多个查询。 我需要类似这个 APOC 的东西

CALL apoc.do.case([condition, query, condition, query, …​], elseQuery:'', 
params:{}) yield value

但是在这里,一旦我们遇到第一个真实条件,它就会跳过所有进一步的条件和查询。我想在我的条件为真的情况下执行所有那些查询。

简单来说,我正在寻找类似于 java case 语句的东西(不带中断;在 case 之间)

更新

我运行了以下查询以使用多个 apoc.do.when,但似乎只有我的第二个 apoc.do.when 没有执行:

CREATE (y:EVENT { _id: 1, localComponentID:'l1', externalComponentID:'e1'}) with y 

call apoc.do.when(exists(y.localComponentID),"MATCH(e:EVENT) where 
e.localComponentID = lcl and e._id <> y._id with  y,e limit 1 create (y)-
[r:LOCAL_LINK]->(e)",'',{y:y,lcl:y.localComponentID}) YIELD value WITH value AS ignored, y

call apoc.do.when(exists(y.externalComponentID),"MATCH(e:EVENT) where 
e.externalComponentID = ext and e._id <> y._id with  y,e limit 1 create (y)-
[r:EXTERNAL_LINK]->(e)",'',{y:y, ext:y.externalComponentID}) YIELD value 
WITH value AS ignored return ignored

如果我在第一次运行时使用 _id = 1 并在第二次运行时使用 _id=2 运行上述查询两次,我预计两个 EVENT 与 LOCAL_LINK 和 EXTERNAL_LINK 连接。但我只在他们之间获得 LOCAL_LINK,而不是 EXTERNAL_LINK。我不确定我做错了什么。

注意:我使用的是限制 1,因为在多个匹配的情况下,我只想用一个节点创建 LINK。

更新 2

得到它的工作,在我的示例查询中,我没有从第一个 apoc.do.when

返回 y

这是更新后的有效查询:

CREATE (y:EVENT { _id: 1, localComponentID:'l1', externalComponentID:'e1'}) with y 

call apoc.do.when(exists(y.localComponentID),"MATCH(e:EVENT) where 
e.localComponentID = lcl and e._id <> y._id with  y,e limit 1 
create (y)-[r:LOCAL_LINK]->(e) RETURN y",'',
{y:y,lcl:y.localComponentID}) YIELD value WITH value AS ignored, y

call apoc.do.when(exists(y.externalComponentID),"MATCH(e:EVENT) where 
e.externalComponentID = ext and e._id <> y._id with  y,e limit 1 
create (y)-[r:EXTERNAL_LINK]->(e)",'',{y:y, ext:y.externalComponentID}) 
YIELD value 
WITH value AS ignored return ignored

【问题讨论】:

  • 听起来很有用,但也有一些复杂性。我们可以轻松地从此过程返回结果,因为结果只会执行一个查询。为了支持执行多个查询,我们可能必须将所有查询限制为只写。
  • 是的,我同意。在我的特殊情况下,所有查询都是只写查询。
  • 这可行。您可以将此请求的问题添加到 APOC GitHub 吗?

标签: neo4j cypher neo4j-apoc


【解决方案1】:

您可以为每个条件/查询对调用 APOC 函数 apoc.do.when(使用空字符串作为 else 参数)。

例如:

CALL apoc.do.when(<condition1>, <query1>, '', {}) YIELD value
WITH value AS ignored
CALL apoc.do.when(<condition2>, <query2>, '', {}) YIELD value
WITH value AS ignored
.
.
.

由于您的 cmets 表明您的查询都是只写的,因此上面的示例将返回 values 分配给 ignored 变量(您可以忽略)。

【讨论】:

  • 这可行!如果查询/条件是在列表中提供的,您可以匹配所需的任何节点,展开列表,并使用单个 apoc.do.when() 执行所有这些操作
  • @InverseFalcon 添加了带有多个 apoc.do.when 调用的示例查询,但我仍然无法使其工作。
  • @cybersam 不幸的是没有,我发现在(更新 2)中,如果第一个 apoc.do.when 找不到匹配以创建关系,那么第二个条件也不起作用。不知道我错过了什么。
  • 不工作。返回错误 ``` 变量 line 未定义(第 24 行,第 24 列(偏移量:934))“调用 apoc.do.when(trim(line["4Z"])="1","merge (c) -[:USES_PRODUCT{date:line.CreateDt}]->(p4Z)",'',{line:line, c:c, p4Z:p4Z}) YIELD value WITH value AS ignored2" ```
  • @umamahesh 这是您的全部查询吗?正如错误所述,该查询没有在任何地方定义 line 变量。如果您需要更多帮助,请提交另一个包含完整详细信息的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2019-06-11
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多