返回Neo4j中每个查询的前n个结果

use*_*562 3 neo4j cypher

我一直在尝试在密码查询中编写以下任务,但我没有得到正确的结果.其他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)

有人可以告诉我如何编写一个密码查询,以达到预期的效果吗?谢谢!

Chr*_*sen 5

另一个解决方案是首先对关系进行排序,在集合中管道它们,然后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的答案后,这有点类似,只是我认为更具可读性.为什么我投票给他答案.


Mic*_*ech 3

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)

  • 上述查询总共返回 3 行。我想要的是为每个节点返回 3 行。 (3认同)