6

使用Cypher 1.8,有一些函数处理集合并返回单个元素:

HEAD( expression )

START a=node(2)
RETURN a.array, head(a.array)

LAST( expression )

START a=node(2)
RETURN a.array, last(a.array)

但是,我找不到返回集合的第 n 个元素的函数。我错过了什么?

4

3 回答 3

15

目前没有什么好的方法可以做到这一点。请在https://github.com/neo4j/neo4j提交功能请求

我见过人们做 head(tail(tail(tail(coll)))),虽然它的速度可能可以接受,但在查询中看到它仍然让我有点不舒服,特别是如果你在谈论第 17 个元素或更糟。

示例: http ://console.neo4j.org/r/bbo6o4

更新: 这是一种使用 reduce 和 range 的方法。它使您至少可以为 nth 提供一个参数,即使它仍然让我畏缩:

start n=node(*) 
with collect(n) as allnodes 
return head(reduce(acc=allnodes, x in range(1,3): tail(acc)));

http://console.neo4j.org/r/8erfup

更新 2 (8/31/2013):
新的集合语法现已合并到 2.0 中,理论上将成为 M05 的一部分!因此,您将能够:

start n=node(*)
with collect(n) as allnodes
return allnodes[3]; // or slices, like [1..3]

更新后,我将添加指向快照文档的链接。

于 2012-12-16T20:35:44.430 回答
1

我刚刚遇到了这个老问题,为了最近遇到的其他人的利益……似乎列表支持有所改善。

来自Cypher 4 列表文档

Cypher 对列表有全面的支持。

^ 旁注:我认为这是列表推导双关语?;-)

他们继续给出一个示例,展示如何访问列表的第 n 个元素:

要访问列表中的单个元素,我们再次使用方括号。这将从开始索引中提取,直到但不包括结束索引。...我们将使用范围函数。它为您提供了一个列表,其中包含给定开始数字和结束数字之间的所有数字。范围包括两端。

RETURN range(0, 10)[3]
^ returns "3"
于 2020-10-13T20:13:44.233 回答
0

目前,随着APOC Procedures 3.3.0.2的发布,您可以使用聚合函数

这样,您可以进行如下思考:

create (:Node {node_id : 1}),
    (:Node {node_id : 2}),
    (:Node {node_id : 3});

match(n:Node)
with n order by n.node_id
// returns {"node_id":2}  
return apoc.agg.nth(n, 1);

或者:

match(n:Node)
with n order by n.node_id
// returns {"node_id":1} 
// you can also use apoc.agg.last
return apoc.agg.first(n);

首先使用列表UNWIND列表:

with ['fist', 'second', 'third'] as list
unwind list as value
// returns 'second'
return apoc.agg.nth(value, 1);
于 2018-03-08T16:31:31.767 回答