12.3.4 EXTRACT
Чтобы вернуть единственное свойство или значение функции из коллекции узлов или связей, вы можете использовать EXTRACT. Она пройдет по коллекции, запустит выражение на каждом элементе и вернёт результаты в коллекцию с этими значениями. Функция работает подобно методу map в функциональных языках, подобных Lisp и Scala.
Синтаксис:
EXTRACT( identifier in collection | expression )
Аргументы:
- collection: Выражение, которое возвращает коллекцию.
- identifier: Замыкание будет иметь идентификатор, введенный в его контексте. Здесь вы решаете, какой идентификатор использовать.
- expression: Это выражение будет выполняться по разу на каждое значение в коллекции, создавая при этом результирующую коллекцию.
Запрос
MATCH p=(a)-->(b)-->(c) WHERE a.name='Alice' AND b.name='Bob' AND c.name='Daniel' RETURN extract(n IN nodes(p)| n.age) AS extracted
возвращает свойство age для всех узлов в пути.
Таблица 12.17 Результат
extracted |
---|
[38,25,54] |
12.3.5 FILTER
FILTER возвращает все элементы в коллекции, которые согласуются с предикатом.
Синтаксис:
FILTER(identifier in collection WHERE predicate)
Аргументы:
- collection: Выражение, которое возвращает коллекцию.
- identifier: Это идентификатор, который может использоваться из предиката.
- predicate: Предикат, который проверяется для всех элементов в коллекции.
Запрос
MATCH (a) WHERE a.name='Eskil' RETURN a.array, filter(x IN a.array WHERE length(x)= 3)
возвращает свойство с именем array и список значений в нём, которые имеют длину 3.
Таблица 12.18 Результат
a.array | filter(x in a.array WHERE length(x) = 3) |
---|---|
["one","two","three"] | ["one","two"] |
12.3.6 TAIL
TAIL возвращает все элементы в коллекции кроме первого.
Синтаксис:
TAIL( expression )
Аргументы:
- expression: Выражение должно возвращать какую-нибудь коллекцию.
Запрос
MATCH (a) WHERE a.name='Eskil' RETURN a.array, tail(a.array)
возвращает свойство с именем array и все элементы этого свойства за исключением первого.
Таблица 12.19 Результат
a.array | tail(a.array) |
---|---|
["one","two","three"] | ["two","three"] |
12.3.7 RANGE
Возвращает числовые значения в диапазоне с ненулевым значение шага step. Диапазон включает обе границы.
Синтаксис:
RANGE( start, end [, step] )
Аргументы:
- start: Числовое выражение.
- end: Числовое выражение.
- step: Числовое выражение.
Запрос
RETURN range(0,10), range(2,18,3)
возвращает два списка чисел.
Таблица 12.20 Результат
range(0,10) | range(2,18,3) |
---|---|
[0,1,2,3,4,5,6,7,8,9,10] | [2,5,8,11,14,17] |
12.3.8 REDUCE
Вы можете использовать REDUCE для выполнения выражения на отдельных элементах коллекции и сохранять результат выражения в накопителе. Функция обойдет коллекцию, выполнит выражение на каждом элементе, сохраняя частичный результат в накопителе. Это работает подобно методам fold или reduce в функциональных языках программирования типа Lisp и Scala.
Синтаксис:
REDUCE( accumulator = initial, identifier in collection | expression )
Аргументы:
- accumulator: Идентификатор, который будет содержать результат и частичные результаты по мере выполнения итераций на коллекции.
- initial: Выражение, которые выполняется один раз, чтобы дать начальное значение накопителю.
- collection: Выражение, которое возвращает коллекцию.
- identifier: Замыкание будет иметь идентификатор, введенное в его контексте. Здесь вы решаете, какой идентификатор использовать.
- expression: Это выражение будет выполняться один раз на каждое значение в коллекции и производить результирующее значение.
Запрос
MATCH p=(a)-->(b)-->(c) WHERE a.name='Alice' AND b.name='Bob' AND c.name='Daniel' RETURN reduce(totalAge = 0, n IN nodes(p)| totalAge + n.age) AS reduction
Свойство age для всех узлов в пути суммируется и возвращается как единственное значение.
Таблица 12.21 Результат
reduction |
---|
117 |