在neo4j中获得各组前n名记录
我需要对neo4j数据库中的数据进行分组,然后过滤掉除每组顶部在neo4j中获得各组前n名记录,neo4j,Neo4j,我需要对neo4j数据库中的数据进行分组,然后过滤掉除每组顶部n记录之外的所有内容 例如: 我有两种节点类型:Order和Article。他们之间有一种“附加”关系。“添加”关系具有时间戳属性。我想知道的是(每一篇文章)在订单的前两篇文章中添加了多少次。我尝试了以下方法: 获取所有订单-[添加]-文章 按照订单id作为第一个排序键,然后按照添加关系的时间戳作为第二个排序键,对步骤1的结果进行排序 对于步骤2中表示一个顺序的每个子组,只保留前2行 在步骤3的输出中统计不同的项目ID 我的问题是我在
n
记录之外的所有内容
例如:
我有两种节点类型:Order和Article。他们之间有一种“附加”关系。“添加”关系具有时间戳属性。我想知道的是(每一篇文章)在订单的前两篇文章中添加了多少次。我尝试了以下方法:
提比略使用
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是的,标识符/属性名称有点简洁:)我可以更改它,关于延迟属性访问,您当然是对的,但由于某些原因,您的建议实际上给出了不同的结果:。我必须停下来,稍后再想想原因。谢谢你的评论,很少能从两位专家那里得到这样的反馈!