使用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个元素。我错过了什么?
答案 0 :(得分:12)
目前没有好办法做到这一点。请在https://github.com/neo4j/neo4j
提交功能请求我已经看到人们做头(尾巴(尾巴(尾巴))),虽然它可能是可以接受的快速,但在查询中看到它仍然让我有点不适,特别是如果你正在谈论第17个元素或者更糟糕的话。
实施例: http://console.neo4j.org/r/bbo6o4
<强>更新强> 这是使用reduce和range来实现它的方法。它使得你至少可以给第n个参数,即使它仍然让我感到畏缩:
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(2013年8月31日):
新的集合语法现在合并为2.0,理论上将成为M05的一部分!所以,你能够做到:
start n=node(*)
with collect(n) as allnodes
return allnodes[3]; // or slices, like [1..3]
我会在快照文档更新时添加指向快照文档的链接。
答案 1 :(得分:0)
目前,随着APOC Procedures 3.3.0.2的发布,您可以使用aggregation functions。
这样,您可以这样做:
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);
答案 2 :(得分:0)
我刚刚遇到了这个老问题,为了最近遇到的其他任何人的利益……列表支持似乎有所改善。
Cypher对列表具有全面的支持。
^旁注:我认为列表理解是双关语吗? ;-)
接着继续给出一个示例,显示您如何访问列表的第n个元素:
要访问列表中的各个元素,请再次使用方括号。这将从开始索引中提取,直到但不包括结束索引。 ...我们将使用范围功能。它为您提供了一个列表,其中包含给定开始和结束数字之间的所有数字。范围包括两端。
RETURN range(0, 10)[3]
^ returns "3"