Neo4j cypher: объединение агрегатов, упорядочение по и ограничение - PullRequest
1 голос
/ 09 апреля 2019

Относительно новичок в 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, но ничего не получил. Очень благодарен за помощь.

1 Ответ

1 голос
/ 09 апреля 2019

Этот запрос:

MATCH (a)--(b)-[bc]-(c) 
WHERE a.name = 'Bolivia'
WITH a, b, c, bc
ORDER BY b.pop DESC, bc.length DESC
WITH a, b, COLLECT({c: c, bc: bc}) AS data
LIMIT 2
UNWIND data[..2] AS d
RETURN a.name, b.name, b.pop, d.c.name, d.bc.length

возвращается:

╒═════════╤═══════════╤═══════╤══════════╤═════════════╕
│"a.name" │"b.name"   │"b.pop"│"d.c.name"│"d.bc.length"│
╞═════════╪═══════════╪═══════╪══════════╪═════════════╡
│"Bolivia"│"Argentina"│43     │"Chile"   │6691         │
├─────────┼───────────┼───────┼──────────┼─────────────┤
│"Bolivia"│"Argentina"│43     │"Paraguay"│1880         │
├─────────┼───────────┼───────┼──────────┼─────────────┤
│"Bolivia"│"Peru"     │32     │"Colombia"│1800         │
├─────────┼───────────┼───────┼──────────┼─────────────┤
│"Bolivia"│"Peru"     │32     │"Ecuador" │1420         │
└─────────┴───────────┴───────┴──────────┴─────────────┘

COLLECT - это агрегирующая функция , которая использует неагрегирующие термины в том же предложении WITH (или RETURN) в качестве «ключа группировки». В этом запросе COLLECT собирает упорядоченный список значений c и bc для каждой отдельной (и упорядоченной) пары значений a и b. Предложение LIMIT ограничивает результаты WITH первыми двумя парами a и b (и их списками data).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...