WITH prods_a, prods_b, HEAD(prods_a) AS prod1
MATCH (supplier1:Supplier) - [:supplies] - (prod1)
WHERE ALL(prod_a IN prods_a WHERE (supplier1) - [:supplies] - (prod_a) )
WITH DISTINCT prods_b, HEAD(prods_b) AS prod2, COLLECT(supplier1) AS supplies_a
MATCH (supplier2:Supplier) - [:supplies] -(prod2)
WHERE ALL(prod_b IN prods_b WHERE (supplier2) - [:supplies] - (prod_b) )
WITH supplies_a, COLLECT(supplier2) AS supplies_b
WITH [x IN supplies_a | {supplier: x, supplies: 'products_a'}] + [y IN supplies_b | {supplier: y, supplies: 'products_b'}] AS result_dicts
UNWIND result_dicts AS result_dict
WITH result_dict.supplier AS supplier, result_dict.supplies AS supplies
RETURN supplier, COLLECT(DISTINCT supplies)
尝试保留两个单独的列表要困难得多,以任何有意义的方式汇总结果也是如此。但是,这遵循与 InverseFalcon 的优化查询相同的基本匹配和过滤器结构。但是,将两者结合起来并分析以找到交叉点是有严重的恶作剧的。
附:严格的答案是执行UNION 查询,但这需要在 Cypher 之外进行分析。
WITH listOfProductsA, HEAD(listOfProductsA) as prod1
MATCH (supplier:Supplier)-[:supplies]->(prod1)
WHERE ALL(product IN list_of_products WHERE (supplier) - [:supplies] - (product) )
RETURN supplier, 'supplies_a'
UNION
WITH listOfProductsb, HEAD(listOfProductsb) as prod1
MATCH (supplier:Supplier)-[:supplies]->(prod1)
WHERE ALL(product IN list_of_products WHERE (supplier) - [:supplies] - (product) )
RETURN supplier, 'supplies_b'
当然,在UNION 的开头和之后插入匹配逻辑。如果您真的只需要提供至少一个且不提供其他上下文的供应商列表,您也可以删除字符串,UNION 将自动删除重复行。