在neo4j中获得各组前n名记录

在neo4j中获得各组前n名记录,neo4j,Neo4j,我需要对neo4j数据库中的数据进行分组,然后过滤掉除每组顶部n记录之外的所有内容 例如: 我有两种节点类型:Order和Article。他们之间有一种“附加”关系。“添加”关系具有时间戳属性。我想知道的是(每一篇文章)在订单的前两篇文章中添加了多少次。我尝试了以下方法: 获取所有订单-[添加]-文章 按照订单id作为第一个排序键,然后按照添加关系的时间戳作为第二个排序键,对步骤1的结果进行排序 对于步骤2中表示一个顺序的每个子组,只保留前2行 在步骤3的输出中统计不同的项目ID 我的问题是我在

我需要对neo4j数据库中的数据进行分组,然后过滤掉除每组顶部
n
记录之外的所有内容

例如:

我有两种节点类型:Order和Article。他们之间有一种“附加”关系。“添加”关系具有时间戳属性。我想知道的是(每一篇文章)在订单的前两篇文章中添加了多少次。我尝试了以下方法:

  • 获取所有订单-[添加]-文章

  • 按照订单id作为第一个排序键,然后按照添加关系的时间戳作为第二个排序键,对步骤1的结果进行排序

  • 对于步骤2中表示一个顺序的每个子组,只保留前2行

  • 在步骤3的输出中统计不同的项目ID

  • 我的问题是我在第三步被卡住了。是否可以为表示订单的每个子组获取前2行

    谢谢


    提比略

    使用
    LIMIT
    orderby
    组合,获得任何事物的前N名。例如,前5名得分为:

    MATCH (node:MyScoreNode) 
    RETURN node
    ORDER BY node.score DESC
    LIMIT 5;
    

    排序依据部分确保最高分首先显示。
    限制只给出前5个,因为它们已排序,所以始终是最高的。

    我试图达到您想要的结果,但失败了

    所以,我猜,这是不可能的纯密码

    有什么问题?塞弗把一切都看成是一条路。实际上是在做遍历。
    尝试将结果分组,然后对每个组执行filter意味着cypher应该以某种方式在某些点进行分支遍历。但Cypher对所有结果执行了筛选,因为它们被视为不同路径的集合

    我的建议-创建几个查询,以实现所需的功能,并实现一些客户端逻辑。

    试试看

    MATCH (o:Order)-[r:ADDED]->(a:Article)
    WITH o, r, a
    ORDER BY o.oid, r.t
    WITH o, COLLECT(a)[..2] AS topArticlesByOrder UNWIND topArticlesByOrder AS a
    RETURN a.aid AS articleId, COUNT(*) AS count
    
    结果看起来像

    articleId    count
       8           6
       2           2
       4           5
       7           2
       3           3
       6           5
       0           7
    
    在此基础上创建

    FOREACH(opar IN RANGE(1,15) |
        MERGE (o:Order {oid:opar})
        FOREACH(apar IN RANGE(1,5) |
            MERGE (a:Article {aid:TOINT(RAND()*10)})
            CREATE o-[:ADDED {t:timestamp() - TOINT(RAND()*1000)}]->a
        )
    )
    

    你能给我们看看你的模型吗?你想买这样的吗?谢谢你的回复,但这不是我想要的。也许我的问题不够清楚。我会编辑的。回答得好。不过,我不会收集
    r
    。只需收集
    a
    MATCH(o:Order)-[r:ADDED]->(a:Article)with o,r,a:Order by o.oid,r.t with o,COLLECT(a)[…2]AS top_articles展开top_articles AS articles返回articles.aid,COUNT(*)AS COUNT Order by COUNT DESC@NicoleWhite你说得对,谢谢!我已经更新了答案。很好的一个Jonatan,我只是被非常短的标识符和属性名弄糊涂了:)根据文章的数量,最好使用a,count(*)作为count返回a.id,count
    来减少属性访问的次数。@MichaelHunger是的,标识符/属性名称有点简洁:)我可以更改它,关于延迟属性访问,您当然是对的,但由于某些原因,您的建议实际上给出了不同的结果:。我必须停下来,稍后再想想原因。谢谢你的评论,很少能从两位专家那里得到这样的反馈!