【问题标题】:How to get the most frequent value of a property of nodes in neo4j如何获取neo4j中节点属性的最频繁值
【发布时间】:2018-12-20 19:32:15
【问题描述】:

我有一个关于使用 neo4j 数据库进行 Cypher 查询的问题。假设我有许多节点,例如 (node:student{name:"Alice"})。 如何使用密码查询获得最常出现的名称?

我有一个简单的解决方案,例如:

MATCH (n:student)
RETURN n.name,count(*) as times
ORDER BY times DESC
LIMIT 1;

是否有其他方法可以在不使用 ORDER BY 和 LIMIT 子句的情况下获得相同的结果?比如任何内置函数,比如 MAX(),..etc

【问题讨论】:

    标签: database neo4j cypher


    【解决方案1】:

    max() 用于查找所有行的最大值,但您实际上并不是单独查找此值,您希望使用它来匹配具有该最大值的相关行。

    要获得max(),您需要聚合行,以便考虑所有行的最大值(非聚合变量成为分组键,如果所有变量都是聚合,则考虑完整集)。此时,您可以过滤聚合行,只筛选出具有最大值的行,然后将它们 UNWIND 重新组合成行并返回它们。

    MATCH (n:student)
    WITH n.name as name, count(*) as times
    WITH collect({name:name, times:times}) as rows, max(times) as max
    UNWIND [row in rows WHERE row.times = max] as row
    RETURN row.name as name, row.times as times
    

    【讨论】:

    • 请注意,在更高版本的 APOC 中,我们有apoc.agg.maxItems(),它允许您快速获取与最大值关联的项目。它还可以处理绑定并将所有具有绑定最大值的条目一起返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多