我一直在尝试在密码查询中编写以下任务,但我没有得到正确的结果.其他stackoverflow问题讨论限制或收集,但我认为这不足以完成以下任务.
任务:我有(p:Product)节点,在两个产品节点之间有一个名为"BOUGHT_TOGETHER"的关系.那是
(p:Product)-[b:BOUGHT_TOGETHER]-(q:Product)
Run Code Online (Sandbox Code Playgroud)
并且关系b具有称为"大小"的属性,其包含一些数字.我想返回按大小排序的每个产品关系的前3个结果.例如,查询结果应如下所示.
+------------------------+
| p.id | q.id | b.size |
+------------------------+
1 2 10
1 3 8
1 5 7
2 21 34
2 17 20
2 35 15
3 5 49
3 333 30
3 65 5
. . .
. . .
. . .
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何编写一个密码查询,以达到预期的效果吗?谢谢!
另一个解决方案是首先对关系进行排序,在集合中管道它们,然后UNWIND只收集集合的3个第一个结果:
MATCH (p:Product)-[r:BOUGHT_TOGETHER]->(:Product)
WITH p, r
ORDER BY r.size DESC
WITH p, collect(r) AS bts
UNWIND bts[0..3] AS r
RETURN p.uuid as pid, endNode(r).uuid as qid, r.size as size
Run Code Online (Sandbox Code Playgroud)
测试控制台:http://console.neo4j.org/r/r88ijn
注意:在重新阅读jjaderberg的答案后,这有点类似,只是我认为更具可读性.为什么我投票给他答案.
Cypher 有 LIMIT 和 ORDER 语句。
http://neo4j.com/docs/stable/query-limit.html
http://neo4j.com/docs/stable/query-order.html
MATCH (p:Product)-[b:BOUGHT_TOGETHER]-(q:Product)
RETURN p.id, q.id, b.size
ORDER BY b.size DESC
LIMIT 3;
Run Code Online (Sandbox Code Playgroud)