获取Cypher中集合的第n个元素

时间:2012-12-16 18:59:49

标签: collections neo4j cypher

使用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个元素。我错过了什么?

3 个答案:

答案 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 4 list docs

Cypher对列表具有全面的支持。

^旁注:我认为列表理解是双关语吗? ;-)

接着继续给出一个示例,显示您如何访问列表的第n个元素:

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

RETURN range(0, 10)[3]
^ returns "3"