Neo4j 根据集合的大小执行foreach

Neo4j 根据集合的大小执行foreach,neo4j,cypher,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]]

只有当集合中至少有两个元素时,才有方法执行查询。 在我目前的情况下,我根据节点的属性匹配节点,然后将它们放入集合中,之后我希望在集合的大小大于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))))

像这样的方法应该会奏效:

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

刚刚更新并支持条件密码执行,则该集合不会执行任何操作。您需要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查询块中传递参数以供使用。

请注意接下来几周的APOC过程的下一个版本,应该有一个新的过程可以有条件地执行像if/else一样的cypher代码。