如何基于顶点属性去重分组并输出顶点全属性?Cypher实现
基于顶点属性分组去重并返回完整顶点的Cypher实现
要实现按商品分类分组,每个分类下随机返回一个符合条件的完整商品顶点,有两种常用的Cypher实现方式:
方式一:使用APOC工具库(推荐,更简洁)
APOC提供了直接从集合中随机选取元素的函数,适合快速实现需求:
MATCH (s:Shop)-[:SELL]->(p:Product) WHERE s.org_id = 'shop1' WITH p.product_Category AS category, COLLECT(p) AS products RETURN apoc.coll.randomItem(products) AS random_product ORDER BY random_product.published_at DESC LIMIT 10
逻辑说明:
WITH子句按product_Category分组,将每个分类下所有符合条件的商品收集为一个列表apoc.coll.randomItem(products)从每个分类的商品列表中随机选取一个- 最后按选中商品的发布时间排序,限制返回10条结果
方式二:不依赖APOC工具库
如果无法使用APOC,可以通过随机排序+取首元素的方式实现:
MATCH (s:Shop)-[:SELL]->(p:Product) WHERE s.org_id = 'shop1' WITH p.product_Category AS category, p ORDER BY category, rand() WITH category, HEAD(COLLECT(p)) AS random_product RETURN random_product ORDER BY random_product.published_at DESC LIMIT 10
逻辑说明:
- 先按分类分组,同时用
rand()给每个分类下的商品随机排序 - 再用
HEAD(COLLECT(p))取每个分类排序后的第一个商品,达到随机选取的效果 - 同样支持按发布时间排序和结果数量限制
内容的提问来源于stack exchange,提问作者Juliette Gia
相关产品推荐
相关产品推荐

