Относительно новичок в Cypher и не может понять из документации, как получить то, что мне нужно, то есть комбинацию ORDER BY и LIMIT с агрегацией, я полагаю, с помощью COLLECT.
Возьмите следующий график:
CREATE (colombia {name:'Colombia', pop:50})
CREATE (argentina {name:'Argentina', pop:43})
CREATE (peru {name:'Peru', pop:32})
CREATE (chile {name:'Chile', pop:17})
CREATE (ecuador {name:'Ecuador', pop:16})
CREATE (bolivia {name:'Bolivia', pop:11})
CREATE (paraguay {name:'Paraguay', pop:7})
CREATE (uruguay {name:'Uruguay', pop:3.4})
CREATE (venezuela {name:'Venezuela', pop:32})
CREATE
(colombia)-[:BORDERS {length:586}]->(ecuador),
(colombia)-[:BORDERS {length:2219}]->(venezuela),
(colombia)-[:BORDERS {length:1800}]->(peru),
(ecuador)-[:BORDERS {length:1420}]->(peru),
(peru)-[:BORDERS {length:171}]->(chile),
(peru)-[:BORDERS {length:1075}]->(bolivia),
(chile)-[:BORDERS {length:6691}]->(argentina),
(argentina)-[:BORDERS {length:942}]->(bolivia),
(argentina)-[:BORDERS {length:1880}]->(paraguay),
(argentina)-[:BORDERS {length:541}]->(uruguay),
(bolivia)-[:BORDERS {length:750}]->(paraguay)
Чтобы проиллюстрировать, что мне нужно, рассмотрим запрос:
MATCH (a)-[ab]-(b)-[bc]-(c)
WHERE a.name = 'Bolivia'
WITH a, b, c, bc
ORDER BY b.pop DESC, bc.length DESC
RETURN a.name, b.name, b.pop, c.name, bc.length
╒═════════╤═══════════╤═══════╤═══════════╤═══════════╕
│"a.name" │"b.name" │"b.pop"│"c.name" │"bc.length"│
╞═════════╪═══════════╪═══════╪═══════════╪═══════════╡
│"Bolivia"│"Argentina"│43 │"Chile" │6691 │
├─────────┼───────────┼───────┼───────────┼───────────┤
│"Bolivia"│"Argentina"│43 │"Paraguay" │1880 │
├─────────┼───────────┼───────┼───────────┼───────────┤
│"Bolivia"│"Argentina"│43 │"Uruguay" │541 │
├─────────┼───────────┼───────┼───────────┼───────────┤
│"Bolivia"│"Peru" │32 │"Colombia" │1800 │
├─────────┼───────────┼───────┼───────────┼───────────┤
│"Bolivia"│"Peru" │32 │"Ecuador" │1420 │
├─────────┼───────────┼───────┼───────────┼───────────┤
│"Bolivia"│"Peru" │32 │"Chile" │171 │
├─────────┼───────────┼───────┼───────────┼───────────┤
│"Bolivia"│"Paraguay" │7 │"Argentina"│1880 │
└─────────┴───────────┴───────┴───────────┴───────────┘
Мне нужно ограничить результаты сначала двумя 2 * соответствующими узлами (b)
по атрибуту pop , затем верхними 2 (c)
узлами по [bc.length]
для каждого случая (b)
. В этом примере это означает строки 1,2,4 и 5.
Я экспериментировал с COLLECT, но ничего не получил. Очень благодарен за помощь.