neo4j - Neo4j 密码:结合聚合、排序和限制
问题描述
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 │
└─────────┴───────────┴───────┴───────────┴───────────┘
我需要首先通过pop属性将结果限制为前 2 个匹配(b)
节点,然后对于. 在此示例中,这意味着第 1、2、4 和 5 行。(c)
[bc.length]
(b)
我已经尝试过 COLLECT 但一无所获。非常感谢您的帮助。
解决方案
这个查询:
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
推荐阅读
- amazon-web-services - Aws sdk for .NET custom region endpoint configuration
- c# - 构造多部分 MIME 消息而不将其保存在内存中
- data-visualization - Combining separate temporal measurement series
- java - How do I use reflection to access a private method?
- azure - 需要使用 PowerShell 而不是 AZ CLI 在 Azure 快照上获取磁盘信息
- python - 使用 for 循环从多个列表中打印一个值
- symfony - 如何修改 Symfony ORM 插入\更新查询
- mysql - 查询内部变量会在代码分析中引发错误
- javascript - React - TypeError:无法读取未定义的属性“dropdownList”
- sql - Oracle功能优化