根据集合的大小执行foreach

时间:2017-05-05 18:59:47

标签: neo4j cypher

只有当集合中至少有两个元素时,才能执行查询。 在我目前的情况下,我根据属性匹配节点,然后我将它们放入集合中,之后我想在集合的大小大于2时执行foreach语句。

这是我想在集合大小超过两个元素时执行的查询片段

WITH COLLECT(items) AS itemsCol
FOREACH(i in RANGE(0, 1)|
  FOREACH(newItem in [productsCol[0]] | 
    FOREACH(oldItem in [productsCol[1]] | 
      CREATE UNIQUE (oldItem)-[:SEEN]->(newItem))))

2 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

WITH
  COLLECT(items) AS itemsCol,
  (CASE WHEN COUNT(items) >= 2 THEN RANGE(0, 1) ELSE NULL END) AS todo
FOREACH(i in todo |
  FOREACH(newItem in [productsCol[0]] | 
    FOREACH(oldItem in [productsCol[1]] | 
      CREATE UNIQUE (oldItem)-[:SEEN]->(newItem))))
如果迭代的集合是FOREACH,则

NULL不执行任何操作。

答案 1 :(得分:0)

APOC Procedures刚刚更新了对条件密码执行的支持。您需要3.1.3.7或更高版本(如果使用Neo4j 3.1.x)或版本3.2.0.3或更高版本(如果使用Neo4j 3.2.x)。

您可以使用apoc.do.when(),因为这是一个写入数据库的查询。

类似的东西:

...
WITH COLLECT(items) AS itemsCol
CALL apoc.do.when(size(itemsCol) >= 2, '
 FOREACH(i in RANGE(0, 1)|
  FOREACH(newItem in [productsCol[0]] | 
    FOREACH(oldItem in [productsCol[1]] | 
      CREATE UNIQUE (oldItem)-[:SEEN]->(newItem))))',
      '', {productsCol:productsCol}) YIELD value
...

在这种情况下,您不需要else cypher块,因此我们可以将其保留,尽管您需要传入参数以便在if查询块中使用。