使用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 个元素的函数。我错过了什么?
使用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 个元素的函数。我错过了什么?
目前没有什么好的方法可以做到这一点。请在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]
更新后,我将添加指向快照文档的链接。
我刚刚遇到了这个老问题,为了最近遇到的其他人的利益……似乎列表支持有所改善。
Cypher 对列表有全面的支持。
^ 旁注:我认为这是列表推导双关语?;-)
他们继续给出一个示例,展示如何访问列表的第 n 个元素:
要访问列表中的单个元素,我们再次使用方括号。这将从开始索引中提取,直到但不包括结束索引。...我们将使用范围函数。它为您提供了一个列表,其中包含给定开始数字和结束数字之间的所有数字。范围包括两端。
RETURN range(0, 10)[3]
^ returns "3"
目前,随着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);