How to limit a subquery in cypher?

寵の児 提交于 2019-12-12 06:06:53

问题


Say I have 3 things in my graph database and each of these 3 things have 0 or more subthings attached to them. How do I make a query to retrieve the top 2 subthings for each of the things in the graph (according to some arbitrary ordering).

Here's an example setup:

CREATE (t1:Thing)-[:X]->(a1:SubThing),
             (t1)-[:X]->(a2:SubThing),
             (t1)-[:X]->(a3:SubThing),
             (t1)-[:X]->(a4:SubThing),
       (t2:Thing)-[:X]->(b1:SubThing),
             (t2)-[:X]->(b2:SubThing),
             (t2)-[:X]->(b3:SubThing),
       (t3:Thing);

What match command could I run to receive a table like this:

t           s
(0:Thing)   (3:SubThing)
(0:Thing)   (4:SubThing)
(1:Thing)   (7:SubThing)
(1:Thing)   (8:SubThing)
(2:Thing)   null

Here's a console.neo4j.org I was using to work it out.

http://console.neo4j.org/r/k32uyy


回答1:


This is probably the best way to do it. I can't unwind the collection or else I'll lose the empty :Thing.

MATCH (t:Thing)
OPTIONAL MATCH (t)-->(s:SubThing)
WITH t, s
ORDER BY id(s)
RETURN t, collect(s)[0..2]
ORDER BY id(t)

And it returns this:

t           collect(s)[0..2]
(0:Thing)   [(3:SubThing), (4:SubThing)]
(1:Thing)   [(7:SubThing), (8:SubThing)]
(2:Thing)   []



回答2:


You need to use an OPTIONAL MATCH here, aggregate by same start node and sort the result by the count of subthings:

MATCH (t:Thing)
OPTIONAL MATCH (t)-[:X]->(s)
RETURN t, count(s) AS degree
ORDER BY degree DESC 
LIMIT 2


来源:https://stackoverflow.com/questions/29023703/how-to-limit-a-subquery-in-cypher

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!