在neo4j中为每个组获取前n个记录

tib*_*riu 7 neo4j

我需要对来自neo4j数据库的数据进行分组,然后过滤掉除n每个组的最高记录之外的所有内容.

例:

我有两种节点类型:Order和Article.他们之间存在"增加"的关系."ADDED"关系具有时间戳属性.我想知道的(对于每篇文章)是在添加到订单的前两篇文章中有多少次.我尝试的是以下方法:

  1. 获得所有订单 - [已添加] - 文章

  2. 将订单ID作为第一个排序键,然后按ADDED关系的时间戳作为第二个排序键,将步骤1的结果排序;

  3. 对于代表一个订单的步骤2中的每个子组,仅保留前2行;

  4. 在步骤3的输出中计算不同的文章ID;

我的问题是我在第3步陷入困境.是否有可能为代表订单的每个子组获得前2行?

谢谢,

Tiberiu

jja*_*erg 7

尝试

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
Run Code Online (Sandbox Code Playgroud)

结果看起来像

articleId    count
   8           6
   2           2
   4           5
   7           2
   3           3
   6           5
   0           7
Run Code Online (Sandbox Code Playgroud)

在此示例图表上创建

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
    )
)
Run Code Online (Sandbox Code Playgroud)

  • 好答案.不过,我不会收集`r`.你可以通过只收集`a`来处理`endnode`:`MATCH(o:Order) - [r:ADDED] - >(a:Article)with o,r,ORDER BY o.oid,rt WITH o,COLLECT(a)[... 2] AS top_articles UNWIND top_articles AS文章RETURN articles.aid,COUNT(*)AS count ORDER BY count DESC;` (2认同)