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