给定一个节点列表,如何在Neo4j中查找连接到列表中每个节点的节点

给定一个节点列表,如何在Neo4j中查找连接到列表中每个节点的节点,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我与(供应商)——[supplies]——(产品)有类似的关系。 给定一个产品列表,我如何找到提供列表中所有产品的供应商 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

我与(供应商)——[supplies]——(产品)有类似的关系。 给定一个产品列表,我如何找到提供列表中所有产品的供应商

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
将自动删除行中的重复数据,则也可以删除字符串

试图保留两个单独的列表要困难得多,以任何有意义的方式汇总结果也是如此。但是,这与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
将自动消除行中的重复数据。

Tore的答案是一个很好的通用方法,只要性能良好,就应该受到青睐

但是如果有大量的供应商,这个查询可能会遇到性能问题,因为它必须对数据库中的每个供应商进行WHERE-ALL测试

我们可以通过找到列表中某一产品的所有供应商来补偿,并将其作为供应商进行评估,而不是每个供应商

WITH listOfProducts, HEAD(listOfProducts) as prod1
MATCH (supplier:Supplier)-[:supplies]->(prod1)
WHERE ALL(product IN list_of_products WHERE (supplier) - [:supplies] - (product) )
RETURN supplier

Tore的答案是一个很好的通用方法,只要它表现良好,就应该受到青睐

但是如果有大量的供应商,这个查询可能会遇到性能问题,因为它必须对数据库中的每个供应商进行WHERE-ALL测试

我们可以通过找到列表中某一产品的所有供应商来补偿,并将其作为供应商进行评估,而不是每个供应商

WITH listOfProducts, HEAD(listOfProducts) as prod1
MATCH (supplier:Supplier)-[:supplies]->(prod1)
WHERE ALL(product IN list_of_products WHERE (supplier) - [:supplies] - (product) )
RETURN supplier

如果结果中有多个供应商,该怎么办?您是否试图将每个产品与其各自的供应商一起输出?或者您是否试图找到一个提供所有给定产品的通用供应商?@rpax如果有多个供应商提供列表中的每个产品,我们需要找出所有的供应商。@InverseFalcon我试图找到一个提供所有给定产品的通用供应商。一个好的递归函数可以解决这个问题。如果结果中有多个供应商,该怎么办?您是否试图将每个产品与其各自的供应商一起输出?或者您是否试图找到一个提供所有给定产品的通用供应商?@rpax如果有多个供应商提供列表中的每个产品,“我们需要找出所有的产品。”InverseFalcon我正试图找到一个提供所有给定产品的通用供应商。一个好的递归函数可以解决这个问题。这是一个很好的观点。过滤总是比寻路慢,所以尽可能先通过寻路来缩小范围。这是一个很好的观点。过滤总是比寻路慢,所以尽可能先通过寻路来缩小范围。除此之外,我很抱歉。假设我们有两类产品。比方说A和B。每个类别都有许多不同种类的产品。如何找到提供A或B的供应商?如何找到供应A和B的供应商?供应商不需要提供A或B中的所有产品,只要他们提供其中一种。好的,现在请参阅更新。这基本上是一个全新的问题。除此之外,我很抱歉。假设我们有两类产品。比方说A和B。每个类别都有许多不同种类的产品。如何找到提供A或B的供应商?如何找到供应A和B的供应商?供应商不需要提供A或B中的所有产品,只要他们提供其中一种。好的,现在请参阅更新。但这基本上是一个全新的问题。