使用Neo4j [子查询?],如何获得所有相关节点只有它们在某种程度上是唯一的?

时间:2015-03-08 14:37:38

标签: neo4j subquery max

我有供应商生产某类别的产品。我想知道分类产品对提供商(简单)的价格最高的频率,并且该提供商没有其他类别的其他产品具有相同的价格(困难)。换句话说,对于每个类别,有多少提供商提供此类别的产品的价格高于他们必须提供的不同类别的每个其他产品。

这似乎需要一个子查询,所以我想出了这个:

MATCH (price:Price)-[:COSTS]-(product:Product)-[:IS_BY]->(provider:Provider)
WITH max(price.amount) as max, min(price.amount) as min, provider
MATCH (product:Product)-[:IS_BY]->(provider)
MATCH (product)-[:IS_OF_CATEGORY]->(category:Category)
MATCH (price2:Price)-[:COSTS]-(product:Product)
WHERE price2.amount = max AND price2.amount > min
RETURN count(category.name) as count, category.name ORDER BY count DESC

这告诉我每个类别对于提供商来说是最昂贵的一次,并且该提供商还有来自其他类别的更便宜的其他产品。 换句话说,其他类别的其他产品中的一些产品更便宜,但并非所有其他产品的产品都更便宜 ......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定我完全理解,但我会试一试!

我想您是这样说的:对于每个类别,查找/统计所有提供该类别的生产商作为其最高价格类别。

这应该为您提供每种产品和类别的最高价格明细:

MATCH
  (price:Price)-[:COSTS]-(product:Product)-[:IS_BY]->(provider:Provider),
  (product)-[:IS_OF_CATEGORY]->(category:Category)
RETURN category, provider, max(amount) AS max_amount

要找出哪个类别是每个提供商的最高价格类别:

MATCH
  (price:Price)-[:COSTS]-(product:Product)-[:IS_BY]->(provider:Provider),
  (product)-[:IS_OF_CATEGORY]->(category:Category)
WITH provider, category, max(amount) AS max_amount
ORDER BY max(amount) DESC
RETURN provider, collect(category)[0] AS highest_priced_category

要查找将该类别作为其最高价格类别的每个类别的提供商数量:

MATCH
  (price:Price)-[:COSTS]-(product:Product)-[:IS_BY]->(provider:Provider),
  (product)-[:IS_OF_CATEGORY]->(category:Category)
WITH provider, category, max(amount) AS max_amount
ORDER BY max(amount) DESC
WITH provider, collect(category)[0] AS highest_priced_category
RETURN highest_priced_category, count(provider)

这有用吗?

编辑:根据您的评论进行另一次尝试:

MATCH
  (price:Price)-[:COSTS]-(product:Product)-[:IS_BY]->(provider:Provider),
WITH provider, product ORDER BY price.amount DESC
WITH provider, collect(product)[0]
  (product)-[:IS_OF_CATEGORY]->(category:Category)
RETURN category, count(provider)

这可以找到提供商和每个提供商的所有产品/价格,从而获得价格最高的产品。然后匹配以查找该产品的类别并返回每个类别的提供者数量