如何在Cypher中使用两个查询的结果集作为第三个查询的参数?
解决Cypher中同时使用两个查询结果作为参数的问题
看起来你遇到的核心问题是WITH子句的上下文传递问题——原来的查询中,第二个WITH只保留了第二个查询的结果,丢失了第一个查询的变量,导致第三个查询无法同时访问两个结果集。另外,你原来的写法会把第一个查询的结果拆分成单行值,而不是作为一个完整的集合来使用,这也会导致过滤逻辑不符合预期。
修复思路
- 把前两个查询的结果分别收集成集合,而不是拆分成单行值;
- 使用
WITH同时传递两个集合到第三个查询的上下文中; - 在第三个查询中,用
IN和NOT IN来匹配集合中的值(因为你需要匹配所有符合第一个查询的结果,同时排除第二个查询的结果)。
修改后的完整查询
// External Parameter :params {extParam:'1.1.1'} // 第一个查询:收集DerivTree路径中所有唯一的dbvid MATCH p=(startnode:DerivTree)-[:IsDerivedFrom*0..]->(endnode:DerivTree) WHERE startnode.dbvid=$extParam WITH COLLECT(DISTINCT nodes(p).dbvid) AS query1_results // 第二个查询:收集符合条件的已删除Resource的dbvid MATCH (d:Resource {deleted:true}) WHERE d.dbvid=$extParam WITH query1_results, COLLECT(d.dbvid) AS query2_results // 第三个查询:同时使用两个结果集过滤Resource MATCH (n:Resource) WHERE n.prop1 IN query1_results AND n.prop2 NOT IN query2_results AND EXISTS(n.prop3) RETURN n
关键说明
- 集合收集:用
COLLECT(DISTINCT ...)把第一个查询的所有结果打包成一个集合query1_results,第二个查询同理得到query2_results; - 上下文传递:第二个
WITH同时保留了query1_results和query2_results,这样第三个查询就能同时访问两个变量; - 过滤逻辑:用
IN匹配第一个集合中的任意值,用NOT IN排除第二个集合中的所有值,这符合你同时使用两个结果集过滤的需求。
如果你的第一个查询确实需要处理单行值(而不是集合),可以调整为笛卡尔积的方式,但根据你的描述,上面的写法应该是最符合需求的解决方案。
内容的提问来源于stack exchange,提问作者Ricardo Rezende
相关产品推荐
相关产品推荐

