首页 文章

返回不同的组

提问于
浏览
0

鉴于此查询:

match (store)-->(food1)-[:LIKE*]-(food2)<--(store)
return food1 + collect(distinct food2) as group

我得到这样的结果:

group
[orange, apple, banana],
[orange, banana, apple],
[apple, orange, banana],
[apple, banana, orange],
[banana, orange, apple],
[banana, apple, orange],
[melon, watermelon],
[watermelon, melon]

我预计只有2组而不是8组 . 我怎样才能获得不同的组?

1 回答

  • 1

    与Cypher的列表相等包括顺序,因此最简单的方法是对列表进行排序,最好使用APOC过程中的 apoc.coll.sortNodes() ,这允许在集合中进行排序,这将允许DISTINCT提供正确的结果 .

    也就是说,该查询存在一些问题需要解决 .

    首先,您应该使用标签,否则将变为AllNodesScan . :存储和:应该使用食品标签 . 关系通常也很重要,因此如果可能,请在查询中使用关系类型 .

    您还可以通过使用下限为0的可变长度关系来减少所涉及的变量数 .

    此外,为了防止大量重复,因为您似乎不关心查询结果中的商店,最好只在MATCH中有一个商店,订购和收集食品,然后获取计数的列表列表的大小> 1(意味着多个商店与那些相同的食物有关系) .

    MATCH (s:Store)-[:CARRIES]->(:Food)-[:LIKE*0..]-(food:Food)
    WITH s, food
    ORDER BY id(food) DESC
    WITH s, collect(food) as foods
    WITH foods, count(foods) as count
    WHERE count > 1
    RETURN foods
    

相关问题