Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j cypher:组合聚合、排序依据和限制_Neo4j_Cypher - Fatal编程技术网

Neo4j cypher:组合聚合、排序依据和限制

Neo4j cypher:组合聚合、排序依据和限制,neo4j,cypher,Neo4j,Cypher,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 (ecuado

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)
节点,然后根据
(b)
的每种情况将前2个
(c)
节点限制为
[bc.length]
。在本例中,这表示第1、2、4和5行

我尝试过收集,但没有结果。非常感谢您的帮助。

此查询:

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
是一种使用与
(或
RETURN
)子句相同的
中的非聚合术语作为“分组键”的方法。在该查询中,
COLLECT
正在收集
c
bc
值的有序列表,这些值分别对应于
a
b
值的不同(和有序)对。
LIMIT
子句将带有
结果的
限制为前两个
a
b
对(以及它们的
数据列表)。

非常感谢Sam。这是正确的数据,但我正在努力解释查询。收集向量化c和bc,然后分别应用
限制2
?我在答案中添加了一段。希望这有帮助。谢谢Sam。真的很有帮助。很抱歉继续,但是您知道这个密码表达式是否是在计算
b.pop的限制之前,先计算
bc.length的所有
bc
组合?数据库上的查询达到内存限制,而查询的最终输出应该非常小。