Cypher查询中WHERE前保留变量状态,如何高效返回全部原始条目?
解决Cypher查询返回所有原始条目ID的问题
原查询里的WHERE NOT experiment IS NULL会过滤掉无experiment属性的条目,导致仅返回a。要高效返回原始列表中所有条目ID(a和b),且无需额外MERGE/MATCH查询或再次UNWIND原始列表,可以用FOREACH替代WHERE过滤,避免截断数据流:
# items=[{id: 'a', experiment: 1}, {id: 'b'}] UNWIND $items AS item MERGE (x:Item { id: item.id }) SET x = item, x.experiment = null WITH x, item.experiment as experiment FOREACH(_ IN CASE WHEN NOT experiment IS NULL THEN [1] ELSE [] END | MERGE (x)-[:IN_EXPERIMENT]->(e:Experiment { name: experiment }) ) RETURN x.id
原理说明
CASE语句根据experiment是否非空返回不同列表:非空时返回含单个元素的列表,空时返回空列表FOREACH仅当列表非空时执行内部的MERGE操作,不会过滤任何行,保证所有原始条目都能走到RETURN步骤- 全程无需额外查询或重复处理原始列表,保持查询效率
内容的提问来源于stack exchange,提问作者BorjaEst
相关产品推荐
相关产品推荐

