3.2.8. Lists

Cypher has comprehensive support for lists.

3.2.8.1. Lists in general

A literal list is created by using brackets and separating the elements in the list with commas.

Query. 

RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list

Table 3.18. Result
list

1 row

[0,1,2,3,4,5,6,7,8,9]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list

In our examples, we’ll use the range function. It gives you a list containing all numbers between given start and end numbers. Range is inclusive in both ends.

To access individual elements in the list, we use the square brackets again. This will extract from the start index and up to but not including the end index.

Query. 

RETURN range(0, 10)[3]

Table 3.19. Result
range(0, 10)[3]

1 row

3

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[3]

You can also use negative numbers, to start from the end of the list instead.

Query. 

RETURN range(0, 10)[-3]

Table 3.20. Result
range(0, 10)[-3]

1 row

8

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[-3]

Finally, you can use ranges inside the brackets to return ranges of the list.

Query. 

RETURN range(0, 10)[0..3]

Table 3.21. Result
range(0, 10)[0..3]

1 row

[0,1,2]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[0..3]

Query. 

RETURN range(0, 10)[0..-5]

Table 3.22. Result
range(0, 10)[0..-5]

1 row

[0,1,2,3,4,5]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[0..-5]

Query. 

RETURN range(0, 10)[-5..]

Table 3.23. Result
range(0, 10)[-5..]

1 row

[6,7,8,9,10]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[-5..]

Query. 

RETURN range(0, 10)[..4]

Table 3.24. Result
range(0, 10)[..4]

1 row

[0,1,2,3]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[..4]

Out-of-bound slices are simply truncated, but out-of-bound single elements return null.

Query. 

RETURN range(0, 10)[15]

Table 3.25. Result
range(0, 10)[15]

1 row

<null>

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[15]

Query. 

RETURN range(0, 10)[5..15]

Table 3.26. Result
range(0, 10)[5..15]

1 row

[5,6,7,8,9,10]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN range(0, 10)[5..15]

You can get the size of a list as follows:

Query. 

RETURN size(range(0, 10)[0..3])

Table 3.27. Result
size(range(0, 10)[0..3])

1 row

3

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN size(range(0, 10)[0..3])

3.2.8.2. List comprehension

List comprehension is a syntactic construct available in Cypher for creating a list based on existing lists. It follows the form of the mathematical set-builder notation (set comprehension) instead of the use of map and filter functions.

Query. 

RETURN [x IN range(0,10) WHERE x % 2 = 0 | x^3] AS result

Table 3.28. Result
result

1 row

[0.0,8.0,64.0,216.0,512.0,1000.0]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN [x IN range(0,10) WHERE x % 2 = 0 | x^3 ] AS result

Either the WHERE part, or the expression, can be omitted, if you only want to filter or map respectively.

Query. 

RETURN [x IN range(0,10) WHERE x % 2 = 0] AS result

Table 3.29. Result
result

1 row

[0,2,4,6,8,10]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN [x IN range(0,10) WHERE x % 2 = 0 ] AS result

Query. 

RETURN [x IN range(0,10)| x^3] AS result

Table 3.30. Result
result

1 row

[0.0,1.0,8.0,27.0,64.0,125.0,216.0,343.0,512.0,729.0,1000.0]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) RETURN [x IN range(0,10) | x^3 ] AS result

3.2.8.3. Pattern comprehension

Pattern comprehension is a syntactic construct available in Cypher for creating a list based on matchings of a pattern. A pattern comprehension will match the specified pattern just like a normal MATCH clause, with predicates just like a normal WHERE clause, but will yield a custom projection as specified.

The following graph is used for the example below:

Figure 3.4. Graph
alt

Query. 

MATCH (a:Person { name: 'Charlie Sheen' })
RETURN [(a)-->(b) WHERE b:Movie | b.year] AS years

Table 3.31. Result
years

1 row

[1979,1984,1987]

Try this query live.  CREATE (charlie:Person {name: 'Charlie Sheen', realName: 'Carlos Irwin Estévez'}), (martin:Person {name: 'Martin Sheen'}), (wallstreet:Movie {title: 'Wall Street', year: 1987}), (reddawn:Movie {title: 'Red Dawn', year: 1984}), (apocalypsenow:Movie {title: 'Apocalypse Now', year: 1979}), (charlie)-[:ACTED_IN]->(wallstreet), (charlie)-[:ACTED_IN]->(reddawn), (charlie)-[:ACTED_IN]->(apocalypsenow), (martin)-[:ACTED_IN]->(wallstreet), (martin)-[:ACTED_IN]->(apocalypsenow) MATCH (a:Person {name: 'Charlie Sheen'}) RETURN [(a)-->(b) WHERE b:Movie | b.year] AS years

The whole predicate, including the WHERE keyword, is optional and may be omitted.