Execution plan operators in detail

All executin plan operators are listed here, grouped by the similarity of their characteristics.

Certain operators are only used by a subset of the runtimes that Cypher can choose from. If that is the case, the example queries will be prefixed with an option to choose one of these runtimes.

All Nodes Scan

The AllNodesScan operator reads all nodes from the node store. The variable that will contain the nodes is seen in the arguments. Any query using this operator is likely to encounter performance problems on a non-trivial database.

Example 1. AllNodesScan
Query
PROFILE
MATCH (n)
RETURN n
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | n       |             35 |   35 |       0 |                |                        |           |                     |
| |               +---------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan   | n       |             35 |   35 |      36 |            120 |                    3/0 |     0.354 | Fused in Pipeline 0 |
+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 36, total allocated memory: 184

Directed Relationship Index Scan

The DirectedRelationshipIndexScan operator examines all values stored in an index, returning all relationships and their start and end nodes with a particular relationship type and a specified property.

Example 2. DirectedRelationshipIndexScan
Query
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+--------------------------------+----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                       | Details                                                                    | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------------------+----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                | r                                                                          |             15 |   15 |       0 |                |                        |           |                     |
| |                              +----------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipIndexScan | RANGE INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title IS NOT NULL |             15 |   15 |      16 |            120 |                    3/1 |     2.464 | Fused in Pipeline 0 |
+--------------------------------+----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 16, total allocated memory: 184

Undirected Relationship Index Scan

The UndirectedRelationshipIndexScan operator examines all values stored in an index, returning all relationships and their start and end nodes with a particular relationship type and a specified property.

Example 3. UndirectedRelationshipIndexScan
Query
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------------------+---------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                         | Details                                                                   | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------------------+---------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                  | r                                                                         |             30 |   30 |       0 |                |                        |           |                     |
| |                                +---------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipIndexScan | RANGE INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title IS NOT NULL |             30 |   30 |      16 |            120 |                    3/1 |     1.266 | Fused in Pipeline 0 |
+----------------------------------+---------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 16, total allocated memory: 184

Directed Relationship Index Seek

The DirectedRelationshipIndexSeek operator finds relationships and their start and end nodes using an index seek. The relationship variable and the index used are shown in the arguments of the operator.

Example 4. DirectedRelationshipIndexSeek
Query
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+--------------------------------+-----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                       | Details                                                                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------------------+-----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                | candidate                                                                         |              2 |    1 |       0 |                |                        |           |                     |
| |                              +-----------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipIndexSeek | RANGE INDEX (candidate)-[r:WORKS_IN(title)]->(anon_0) WHERE title = $autostring_0 |              2 |    1 |       2 |            120 |                    3/1 |     0.591 | Fused in Pipeline 0 |
+--------------------------------+-----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 2, total allocated memory: 184

Undirected Relationship Index Seek

The UndirectedRelationshipIndexSeek operator finds relationships and their start and end nodes using an index seek. The relationship variable and the index used are shown in the arguments of the operator.

Example 5. UndirectedRelationshipIndexSeek
Query
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------------------+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                         | Details                                                                          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------------------+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                  | candidate                                                                        |              4 |    2 |       0 |                |                        |           |                     |
| |                                +----------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipIndexSeek | RANGE INDEX (candidate)-[r:WORKS_IN(title)]-(anon_0) WHERE title = $autostring_0 |              4 |    2 |       2 |            120 |                    3/1 |     0.791 | Fused in Pipeline 0 |
+----------------------------------+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 2, total allocated memory: 184

Directed Relationship By Id Seek

The DirectedRelationshipByIdSeek operator reads one or more relationships by id from the relationship store, and produces both the relationship and the nodes on either side.

Example 6. DirectedRelationshipByIdSeek
Query
PROFILE
MATCH (n1)-[r]->()
WHERE id(r) = 0
RETURN r, n1
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------------------+---------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                      | Details                                     | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------------------+---------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults               | r, n1                                       |              1 |    1 |       0 |                |                        |           |                     |
| |                             +---------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipByIdSeek | (n1)-[r]->(anon_0) WHERE id(r) = $autoint_0 |              1 |    1 |       1 |            120 |                    4/0 |     0.459 | Fused in Pipeline 0 |
+-------------------------------+---------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Undirected Relationship By Id Seek

The UndirectedRelationshipByIdSeek operator reads one or more relationships by id from the relationship store. As the direction is unspecified, two rows are produced for each relationship as a result of alternating the combination of the start and end node.

Example 7. UndirectedRelationshipByIdSeek
Query
PROFILE
MATCH (n1)-[r]-()
WHERE elementId(r) = 1
RETURN r, n1
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                              | Details                                    | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                       | r, n1                                      |              2 |    2 |       0 |                |                        |           |                     |
| |                                     +--------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipByElementIdSeek| (n1)-[r]-(anon_0) WHERE elementId(r) = $autoint_0 |       2 |    2 |       1 |            120 |                    4/0 |     0.332 | Fused in Pipeline 0 |
+---------------------------------+--------------------------------------------+-----+---------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Directed Relationship Index Contains Scan

The DirectedRelationshipIndexContainsScan operator examines all values stored in an index, searching for entries containing a specific string; for example, in queries including CONTAINS. Although this is slower than an index seek (since all entries need to be examined), it is still faster than the indirection resulting from a type scan using DirectedRelationshipTypeScan, and a property store filter.

Example 8. DirectedRelationshipIndexContainsScan
Query
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title CONTAINS 'senior'
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                               | Details                                                                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                        | r                                                                                    |              0 |    4 |       0 |                |                        |           |                     |
| |                                      +--------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipIndexContainsScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title CONTAINS $autostring_0 |              0 |    4 |       5 |            120 |                    3/0 |     1.051 | Fused in Pipeline 0 |
+----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 5, total allocated memory: 184

Undirected Relationship Index Contains Scan

The UndirectedRelationshipIndexContainsScan operator examines all values stored in an index, searching for entries containing a specific string; for example, in queries including CONTAINS. Although this is slower than an index seek (since all entries need to be examined), it is still faster than the indirection resulting from a type scan using DirectedRelationshipTypeScan, and a property store filter.

Example 9. UndirectedRelationshipIndexContainsScan
Query
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title CONTAINS 'senior'
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                                 | Details                                                                             | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                          | r                                                                                   |              0 |    8 |       0 |                |                        |           |                     |
| |                                        +-------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipIndexContainsScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title CONTAINS $autostring_0 |              0 |    8 |       5 |            120 |                    3/0 |     2.684 | Fused in Pipeline 0 |
+------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 5, total allocated memory: 184

Directed Relationship Index Ends With Scan

The DirectedRelationshipIndexEndsWithScan operator examines all values stored in an index, searching for entries ending in a specific string; for example, in queries containing ENDS WITH. Although this is slower than an index seek (since all entries need to be examined), it is still faster than the indirection resulting from a label scan using NodeByLabelScan, and a property store filter.

Example 10. DirectedRelationshipIndexEndsWithScan
Query
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title ENDS WITH 'developer'
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                               | Details                                                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                        | r                                                                                     |              0 |    8 |       0 |                |                        |           |                     |
| |                                      +---------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipIndexEndsWithScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title ENDS WITH $autostring_0 |              0 |    8 |       9 |            120 |                    3/0 |     1.887 | Fused in Pipeline 0 |
+----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 9, total allocated memory: 184

Undirected Relationship Index Ends With Scan

The UndirectedRelationshipIndexEndsWithScan operator examines all values stored in an index, searching for entries ending in a specific string; for example, in queries containing ENDS WITH. Although this is slower than an index seek (since all entries need to be examined), it is still faster than the indirection resulting from a label scan using NodeByLabelScan, and a property store filter.

Example 11. UndirectedRelationshipIndexEndsWithScan
Query
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title ENDS WITH 'developer'
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                                 | Details                                                                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                          | r                                                                                    |              0 |   16 |       0 |                |                        |           |                     |
| |                                        +--------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipIndexEndsWithScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title ENDS WITH $autostring_0 |              0 |   16 |       9 |            120 |                    3/0 |     1.465 | Fused in Pipeline 0 |
+------------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 9, total allocated memory: 184

Directed Relationship Index Seek By Range

The DirectedRelationshipIndexSeekByRange operator finds relationships and their start and end nodes using an index seek where the value of the property matches a given prefix string. DirectedRelationshipIndexSeekByRange can be used for STARTS WITH and comparison operators such as <, >, <= and >=.

Example 12. DirectedRelationshipIndexSeekByRange
Query
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]->(location)
WHERE r.duration > 100
RETURN candidate
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------------------+----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                              | Details                                                                                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------------------+----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                       | candidate                                                                              |              4 |   15 |       0 |                |                        |           |                     |
| |                                     +----------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter                               | candidate:Person                                                                       |              4 |   15 |      30 |                |                        |           |                     |
| |                                     +----------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipIndexSeekByRange | RANGE INDEX (candidate)-[r:WORKS_IN(duration)]->(location) WHERE duration > $autoint_0 |              4 |   15 |      16 |            120 |                    4/1 |     0.703 | Fused in Pipeline 0 |
+---------------------------------------+----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 46, total allocated memory: 184

Undirected Relationship Index Seek By Range

The UndirectedRelationshipIndexSeekByRange operator finds relationships and their start and end nodes using an index seek where the value of the property matches a given prefix string. UndirectedRelationshipIndexSeekByRange can be used for STARTS WITH and comparison operators such as <, >, <= and >=.

Example 13. UndirectedRelationshipIndexSeekByRange
Query
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]-(location)
WHERE r.duration > 100
RETURN candidate
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                                | Details                                                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                         | candidate                                                                             |              5 |   15 |       0 |                |                        |           |                     |
| |                                       +---------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter                                 | candidate:Person                                                                      |              5 |   15 |      60 |                |                        |           |                     |
| |                                       +---------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipIndexSeekByRange | RANGE INDEX (candidate)-[r:WORKS_IN(duration)]-(location) WHERE duration > $autoint_0 |              8 |   30 |      16 |            120 |                    4/1 |     1.214 | Fused in Pipeline 0 |
+-----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 76, total allocated memory: 184

Union Node By Labels Scan

The UnionNodeByLabelsScan operator fetches all nodes that have at least one of the provided labels from the node label index.

Query
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------+------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| Operator               | Details                            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by            | Pipeline            |
+------------------------+------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| +ProduceResults        | countryOrLocation                  |             17 |   11 |       0 |                |                        |           |                       |                     |
| |                      +------------------------------------+----------------+------+---------+----------------+                        |           |                       |                     |
| +UnionNodeByLabelsScan | countryOrLocation:Country|Location |             17 |   11 |      13 |            120 |                    3/1 |     0.660 | countryOrLocation ASC | Fused in Pipeline 0 |
+------------------------+------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+

Total database accesses: 13, total allocated memory: 184

Directed All Relationships Scan

The DirectedAllRelationshipsScan operator fetches all relationships and their start and end nodes in the database.

Query
PROFILE
MATCH ()-[r]->() RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------------------+------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                      | Details                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------------------+------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults               | r                      |             28 |   28 |       0 |                |                        |           |                     |
| |                             +------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedAllRelationshipsScan | (anon_0)-[r]->(anon_1) |             28 |   28 |      28 |            120 |                    3/0 |     0.502 | Fused in Pipeline 0 |
+-------------------------------+------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 28, total allocated memory: 184

Undirected All Relationships Scan

The UndirectedAllRelationshipsScan operator fetches all relationships and their start and end nodes in the database.

Query
PROFILE
MATCH ()-[r]-() RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------------+-----------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                        | Details               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------------+-----------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                 | r                     |             56 |   56 |       0 |                |                        |           |                     |
| |                               +-----------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedAllRelationshipsScan | (anon_0)-[r]-(anon_1) |             56 |   56 |      28 |            120 |                    3/0 |     1.110 | Fused in Pipeline 0 |
+---------------------------------+-----------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 28, total allocated memory: 184

Directed Relationship Type Scan

The DirectedRelationshipTypeScan operator fetches all relationships and their start and end nodes with a specific type from the relationship type index.

Example 14. DirectedRelationshipTypeScan
Query
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------------------+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                      | Details                             | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------------------+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults               | r                                   |             12 |   12 |       0 |                |                        |           |                     |
| |                             +-------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedRelationshipTypeScan | (anon_0)-[r:FRIENDS_WITH]->(anon_1) |             12 |   12 |      13 |            120 |                    2/1 |     0.557 | Fused in Pipeline 0 |
+-------------------------------+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 184

Undirected Relationship Type Scan

The UndirectedRelationshipTypeScan operator fetches all relationships and their start and end nodes with a specific type from the relationship type index.

Query
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------------+------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                        | Details                            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------------+------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                 | r                                  |             24 |   24 |       0 |                |                        |           |                     |
| |                               +------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipTypeScan | (anon_0)-[r:FRIENDS_WITH]-(anon_1) |             24 |   24 |      13 |            120 |                    2/1 |     0.749 | Fused in Pipeline 0 |
+---------------------------------+------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 184

Directed Union Relationship Types Scan

The DirectedUnionRelationshipTypeScan operator fetches all relationships and their start and end nodes with at least one of the provided types from the relationship type index.

Example 15. DirectedUnionRelationshipTypeScan
Query
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------+---------------------+
| Operator                            | Details                                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by      | Pipeline            |
+-------------------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------+---------------------+
| +ProduceResults                     | friendOrFoe                                       |             15 |   12 |       0 |                |                        |           |                 |                     |
| |                                   +---------------------------------------------------+----------------+------+---------+----------------+                        |           |                 |                     |
| +DirectedUnionRelationshipTypesScan | (anon_0)-[friendOrFoe:FRIENDS_WITH|FOE]->(anon_1) |             15 |   12 |      14 |            120 |                    3/1 |     2.027 | friendOrFoe ASC | Fused in Pipeline 0 |
+-------------------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------+---------------------+

Total database accesses: 14, total allocated memory: 184

Undirected Union Relationship Types Scan

The UndirectedUnionRelationshipTypeScan operator fetches all relationships and their start and end nodes with at least one of the provided types from the relationship type index.

Example 16. UndirectedUnionRelationshipTypeScan
Query
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------------------+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------+---------------------+
| Operator                              | Details                                          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by      | Pipeline            |
+---------------------------------------+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------+---------------------+
| +ProduceResults                       | friendOrFoe                                      |             30 |   24 |       0 |                |                        |           |                 |                     |
| |                                     +--------------------------------------------------+----------------+------+---------+----------------+                        |           |                 |                     |
| +UndirectedUnionRelationshipTypesScan | (anon_0)-[friendOrFoe:FRIENDS_WITH|FOE]-(anon_1) |             30 |   24 |      14 |            120 |                    3/1 |     0.887 | friendOrFoe ASC | Fused in Pipeline 0 |
+---------------------------------------+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------+---------------------+

Total database accesses: 14, total allocated memory: 184

Node By Id Seek

The NodeByIdSeek operator reads one or more nodes by id from the node store.

Example 17. NodeByIdSeek
Query
PROFILE
MATCH (n)
WHERE elementId(n) = 0
RETURN n
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator               | Details                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults        | n                                 |              1 |    1 |       0 |                |                        |           |                     |
| |                      +-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+----------------------                        |           |                     |
| +NodeByElementIdSeek   | n WHERE elementId(n) = $autoint_0 |              1 |    1 |       1 |            120 |                    3/0 |     2.108 | Fused in Pipeline 0 |
+------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Node By Label Scan

The NodeByLabelScan operator fetches all nodes with a specific label from the node label index.

Example 18. NodeByLabelScan
Query
PROFILE
MATCH (person:Person)
RETURN person
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details       | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | person        |             14 |   14 |       0 |                |                        |           |                     |
| |                +---------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan | person:Person |             14 |   14 |      15 |            120 |                    2/1 |     0.522 | Fused in Pipeline 0 |
+------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 184

Node Index Seek

The NodeIndexSeek operator finds nodes using an index seek. The node variable and the index used are shown in the arguments of the operator. If the index is a unique index, the operator is instead called NodeUniqueIndexSeek.

Example 19. NodeIndexSeek
Query
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | location                                                       |              1 |    1 |       0 |                |                        |           |                     |
| |               +----------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek  | RANGE INDEX location:Location(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    2/1 |     0.401 | Fused in Pipeline 0 |
+-----------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 2, total allocated memory: 184

Node Unique Index Seek

The NodeUniqueIndexSeek operator finds nodes using an index seek within a unique index. The node variable and the index used are shown in the arguments of the operator. If the index is not unique, the operator is instead called NodeIndexSeek. If the index seek is used to solve a MERGE clause, it will also be marked with (Locking). This makes it clear that any nodes returned from the index will be locked in order to prevent concurrent conflicting updates.

Example 20. NodeUniqueIndexSeek
Query
PROFILE
MATCH (t:Team {name: 'Malmo'})
RETURN t
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator             | Details                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults      | t                                              |              1 |    0 |       0 |                |                        |           |                     |
| |                    +------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeUniqueIndexSeek | UNIQUE t:Team(name) WHERE name = $autostring_0 |              1 |    0 |       1 |            120 |                    0/1 |     0.280 | Fused in Pipeline 0 |
+----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Multi Node Index Seek

The MultiNodeIndexSeek operator finds nodes using multiple index seeks. It supports using multiple distinct indexes for different nodes in the query. The node variables and the indexes used are shown in the arguments of the operator.

The operator yields a cartesian product of all index seeks. For example, if the operator does two seeks and the first seek finds the nodes a1, a2 and the second b1, b2, b3, the MultiNodeIndexSeek will yield the rows (a1, b1), (a1, b2), (a1, b3), (a2, b1), (a2, b2), (a2, b3).

Example 21. MultiNodeIndexSeek
Query
PROFILE
CYPHER runtime=pipelined
MATCH
  (location:Location {name: 'Malmo'}),
  (person:Person {name: 'Bob'})
RETURN location, person
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator            | Details                                                         | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults     | location, person                                                |              1 |    1 |       0 |                |                        |           |                     |
| |                   +-----------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +MultiNodeIndexSeek | RANGE INDEX location:Location(name) WHERE name = $autostring_0, |              1 |    0 |       0 |            120 |                    2/2 |     1.910 | Fused in Pipeline 0 |
|                     | RANGE INDEX person:Person(name) WHERE name = $autostring_1      |                |      |         |                |                        |           |                     |
+---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 0, total allocated memory: 184

Asserting Multi Node Index Seek

The AssertingMultiNodeIndexSeek operator is used to ensure that no property uniqueness constraints are violated. The example looks for the presence of a team with the supplied name and id, and if one does not exist, it will be created. Owing to the existence of two property uniqueness constraints on :Team(name) and :Team(id), any node that would be found by the UniqueIndexSeek operator must be the very same node or the constraints would be violated.

Example 22. AssertingMultiNodeIndexSeek
Query
PROFILE
MERGE (t:Team {name: 'Engineering', id: 42})
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                     | Details                                                                                 | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults              |                                                                                         |              1 |    0 |       0 |                |                        |           |                     |
| |                            +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult                 |                                                                                         |              1 |    0 |       0 |                |                        |           |                     |
| |                            +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Merge                       | CREATE (t:Team {name: $autostring_0, id: $autoint_1})                                   |              1 |    1 |       0 |                |                        |           |                     |
| |                            +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +AssertingMultiNodeIndexSeek | UNIQUE t:Team(name) WHERE name = $autostring_0, UNIQUE t:Team(id) WHERE id = $autoint_1 |              0 |    2 |       4 |            120 |                    0/2 |     1.584 | Fused in Pipeline 0 |
+------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 4, total allocated memory: 184

Node Index Seek By Range

The NodeIndexSeekByRange operator finds nodes using an index seek where the value of the property matches a given prefix string. NodeIndexSeekByRange can be used for STARTS WITH and comparison operators such as <, >, <= and >=. If the index is a unique index, the operator is instead called NodeUniqueIndexSeekByRange.

Example 23. NodeIndexSeekByRange
Query
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+-------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator              | Details                                                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------------+-------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults       | l                                                                 |              2 |    1 |       0 |                |                        |           |                     |
| |                     +-------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeekByRange | RANGE INDEX l:Location(name) WHERE name STARTS WITH $autostring_0 |              2 |    1 |       2 |            120 |                    3/0 |     0.825 | Fused in Pipeline 0 |
+-----------------------+-------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 2, total allocated memory: 184

Node Unique Index Seek By Range

The NodeUniqueIndexSeekByRange operator finds nodes using an index seek within a unique index, where the value of the property matches a given prefix string. NodeUniqueIndexSeekByRange is used by STARTS WITH and comparison operators such as <, >, <=, and >=. If the index is not unique, the operator is instead called NodeIndexSeekByRange.

Example 24. NodeUniqueIndexSeekByRange
Query
PROFILE
MATCH (t:Team)
WHERE t.name STARTS WITH 'Ma'
RETURN t
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                    | Details                                                  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults             | t                                                        |              2 |    0 |       0 |                |                        |           |                     |
| |                           +----------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeUniqueIndexSeekByRange | UNIQUE t:Team(name) WHERE name STARTS WITH $autostring_0 |              2 |    0 |       1 |            120 |                    1/0 |     0.623 | Fused in Pipeline 0 |
+-----------------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Node Index Contains Scan

The NodeIndexContainsScan operator examines all values stored in an index, searching for entries containing a specific string; for example, in queries including CONTAINS. Although this is slower than an index seek (since all entries need to be examined), it is still faster than the indirection resulting from a label scan using NodeByLabelScan, and a property store filter.

Example 25. NodeIndexContainsScan
Query
PROFILE
MATCH (l:Location)
WHERE l.name CONTAINS 'al'
RETURN l
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator               | Details                                                       | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults        | l                                                             |              0 |    2 |       0 |                |                        |           |                     |
| |                      +---------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexContainsScan | TEXT INDEX l:Location(name) WHERE name CONTAINS $autostring_0 |              0 |    2 |       3 |            120 |                    2/0 |     1.305 | Fused in Pipeline 0 |
+------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 3, total allocated memory: 184

Node Index Ends With Scan

The NodeIndexEndsWithScan operator examines all values stored in an index, searching for entries ending in a specific string; for example, in queries containing ENDS WITH. Although this is slower than an index seek (since all entries need to be examined), it is still faster than the indirection resulting from a label scan using NodeByLabelScan, and a property store filter.

Example 26. NodeIndexEndsWithScan
Query
PROFILE
MATCH (l:Location)
WHERE l.name ENDS WITH 'al'
RETURN l
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator               | Details                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults        | l                                                              |              0 |    0 |       0 |                |                        |           |                     |
| |                      +----------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexEndsWithScan | TEXT INDEX l:Location(name) WHERE name ENDS WITH $autostring_0 |              0 |    0 |       1 |            120 |                    0/0 |     4.409 | Fused in Pipeline 0 |
+------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Node Index Scan

The NodeIndexScan operator examines all values stored in an index, returning all nodes with a particular label and a specified property.

Example 27. NodeIndexScan
Query
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                             | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | l                                                   |             10 |   10 |       0 |                |                        |           |                     |
| |               +-----------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexScan  | RANGE INDEX l:Location(name) WHERE name IS NOT NULL |             10 |   10 |      11 |            120 |                    2/1 |     0.557 | Fused in Pipeline 0 |
+-----------------+-----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 11, total allocated memory: 184

Apply

All the different Apply operators (listed below) share the same basic functionality: they perform a nested loop by taking a single row from the left-hand side, and using the Argument operator on the right-hand side, execute the operator tree on the right-hand side. The versions of the Apply operators differ in how the results are managed. The Apply operator (i.e. the standard version) takes the row produced by the right-hand side — which at this point contains data from both the left-hand and right-hand sides — and yields it.

Example 28. Apply
Query
PROFILE
MATCH (p:Person {name: 'me'})
MATCH (q:Person {name: p.secondName})
RETURN p, q
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | p, q                                                  |              1 |    0 |       0 |                |                        |           |                     |
| |                +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply           |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |\               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +NodeIndexSeek | RANGE INDEX q:Person(name) WHERE name = p.secondName  |              1 |    0 |       0 |           2152 |                    0/0 |     0.219 | Fused in Pipeline 1 |
| |                +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek   | RANGE INDEX p:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    0/1 |     0.236 | In Pipeline 0       |
+------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 2, total allocated memory: 2216

Semi Apply

The SemiApply operator tests for the presence of a pattern predicate, and is a variation of the Apply operator. If the right-hand side operator yields at least one row, the row from the left-hand side operator is yielded by the SemiApply operator. This makes SemiApply a filtering operator, used mostly for pattern predicates in queries.

Example 29. SemiApply
Query
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
WHERE (p)-[:FRIENDS_WITH]->(:Person)
RETURN p.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+-------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                             | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+-------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults | `p.name`                            |             11 |   10 |       0 |                    0/0 |
| |               +-------------------------------------+----------------+------+---------+------------------------+
| +Projection     | p.name AS `p.name`                  |             11 |   10 |      10 |                    1/0 |
| |               +-------------------------------------+----------------+------+---------+------------------------+
| +SemiApply      |                                     |             11 |   10 |       0 |                    0/0 |
| |\              +-------------------------------------+----------------+------+---------+------------------------+
| | +Filter       | anon_3:Person                       |             12 |    0 |      10 |                    0/0 |
| | |             +-------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)  | (p)-[anon_2:FRIENDS_WITH]->(anon_3) |             12 |   10 |      51 |                   28/0 |
| | |             +-------------------------------------+----------------+------+---------+------------------------+
| | +Argument     | p                                   |             14 |   14 |       0 |                    0/0 |
| |               +-------------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan| p:Person                            |             14 |   14 |      35 |                    1/0 |
+-----------------+-------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 142, total allocated memory: 64

Anti Semi Apply

The AntiSemiApply operator tests for the absence of a pattern, and is a variation of the Apply operator. If the right-hand side operator yields no rows, the row from the left-hand side operator is yielded by the AntiSemiApply operator. This makes AntiSemiApply a filtering operator, used for pattern predicates in queries.

Example 30. AntiSemiApply
Query
PROFILE
CYPHER runtime=slotted
MATCH
  (me:Person {name: 'me'}),
  (other:Person)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| Operator          | Details                                                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses |
+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +ProduceResults   | `other.name`                                           |              4 |   12 |       0 |                |                    0/0 |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +Projection       | other.name AS `other.name`                             |              4 |   12 |      12 |                |                    1/0 |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +AntiSemiApply    |                                                        |              4 |   12 |       0 |                |                    0/0 |
| |\                +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| | +Expand(Into)   | (me)-[anon_2:FRIENDS_WITH]->(other)                    |              1 |    0 |      81 |            896 |                   28/0 |
| | |               +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| | +Argument       | me, other                                              |             14 |   14 |       0 |                |                    0/0 |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +CartesianProduct |                                                        |             14 |   14 |       0 |                |                    0/0 |
| |\                +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| | +NodeByLabelScan| other:Person                                           |             14 |   14 |      35 |                |                    1/0 |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| +NodeIndexSeek    | RANGE INDEX me:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |                |                    0/1 |
+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+

Total database accesses: 166, total allocated memory: 976

Anti

The Anti operator tests for the absence of a pattern. If there are incoming rows, the Anti operator will yield no rows. If there are no incoming rows, the Anti operator will yield a single row.

Example 31. Anti
Query
PROFILE
CYPHER runtime=pipelined
MATCH
  (me:Person {name: 'me'}),
  (other:Person)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator          | Details                                                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults   | `other.name`                                           |              4 |   12 |       0 |                |                    0/0 |     0.068 |                     |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Projection       | other.name AS `other.name`                             |              4 |   12 |      24 |                |                    2/0 |     0.111 | In Pipeline 4       |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Apply            |                                                        |              4 |   12 |       0 |                |                    0/0 |           |                     |
| |\                +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Anti           |                                                        |              4 |   12 |       0 |           1256 |                    0/0 |     0.084 | In Pipeline 4       |
| | |               +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Limit          | 1                                                      |             11 |    2 |       0 |            752 |                        |           |                     |
| | |               +--------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(Into)   | (me)-[anon_2:FRIENDS_WITH]->(other)                    |              1 |    2 |      81 |           2632 |                        |           |                     |
| | |               +--------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument       | me, other                                              |             14 |   14 |       0 |           3192 |                    1/0 |     0.904 | Fused in Pipeline 3 |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +CartesianProduct |                                                        |             14 |   14 |       0 |           3672 |                        |     1.466 | In Pipeline 2       |
| |\                +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +NodeByLabelScan| other:Person                                           |             14 |   14 |      35 |                |                        |           |                     |
| |                 +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek    | RANGE INDEX me:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    0/1 |     0.493 | In Pipeline 0       |
+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 178, total allocated memory: 6744

Let Semi Apply

The LetSemiApply operator tests for the presence of a pattern predicate, and is a variation of the Apply operator. When a query contains multiple pattern predicates separated with OR, LetSemiApply will be used to evaluate the first of these. It will record the result of evaluating the predicate but will leave any filtering to another operator. In the example, LetSemiApply will be used to check for the presence of the FRIENDS_WITH relationship from each person.

Example 32. LetSemiApply
Query
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE (other)-[:FRIENDS_WITH]->(:Person) OR (other)-[:WORKS_IN]->(:Location)
RETURN other.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+--------------------+-----------------------------------------+----------------+------+---------+------------------------+
| Operator           | Details                                 | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+--------------------+-----------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults    | `other.name`                            |             13 |   14 |       0 |                    0/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +Projection        | other.name AS `other.name`              |             13 |   14 |      14 |                    1/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +SelectOrSemiApply | anon_9                                  |             14 |   14 |       0 |                    0/0 |
| |\                 +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter          | anon_7:Location                         |             14 |    0 |       4 |                    0/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)     | (other)-[anon_6:WORKS_IN]->(anon_7)     |             14 |    4 |      15 |                    8/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument        | other                                   |             14 |    4 |       0 |                    0/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +LetSemiApply      |                                         |             14 |   14 |       0 |                    0/0 |
| |\                 +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter          | anon_5:Person                           |             12 |    0 |      10 |                    0/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)     | (other)-[anon_4:FRIENDS_WITH]->(anon_5) |             12 |   10 |      51 |                   28/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument        | other                                   |             14 |   14 |       0 |                    0/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan   | other:Person                            |             14 |   14 |      35 |                    1/0 |
+--------------------+-----------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 165, total allocated memory: 64

Let Anti Semi Apply

The LetAntiSemiApply operator tests for the absence of a pattern, and is a variation of the Apply operator. When a query contains multiple negated pattern predicates — i.e. predicates separated with OR, where at least one predicate contains NOT — LetAntiSemiApply will be used to evaluate the first of these. It will record the result of evaluating the predicate but will leave any filtering to another operator. In the example, LetAntiSemiApply will be used to check for the absence of the FRIENDS_WITH relationship from each person.

Example 33. LetAntiSemiApply
Query
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE NOT ((other)-[:FRIENDS_WITH]->(:Person)) OR (other)-[:WORKS_IN]->(:Location)
RETURN other.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4
+--------------------+-----------------------------------------+----------------+------+---------+------------------------+
| Operator           | Details                                 | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+--------------------+-----------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults    | `other.name`                            |             11 |   14 |       0 |                    0/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +Projection        | other.name AS `other.name`              |             11 |   14 |      14 |                    1/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +SelectOrSemiApply | anon_9                                  |             14 |   14 |       0 |                    0/0 |
| |\                 +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter          | anon_7:Location                         |             14 |    0 |      10 |                    0/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)     | (other)-[anon_6:WORKS_IN]->(anon_7)     |             14 |   10 |      38 |                   20/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument        | other                                   |             14 |   10 |       0 |                    0/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +LetAntiSemiApply  |                                         |             14 |   14 |       0 |                    0/0 |
| |\                 +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter          | anon_5:Person                           |             12 |    0 |      10 |                    0/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)     | (other)-[anon_4:FRIENDS_WITH]->(anon_5) |             12 |   10 |      51 |                   28/0 |
| | |                +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument        | other                                   |             14 |   14 |       0 |                    0/0 |
| |                  +-----------------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan   | p:Person                                |             14 |   14 |      35 |                    1/0 |
+--------------------+-----------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 142, total allocated memory: 64

Select Or Semi Apply

The SelectOrSemiApply operator tests for the presence of a pattern predicate and evaluates a predicate, and is a variation of the Apply operator. This operator allows for the mixing of normal predicates and pattern predicates that check for the presence of a pattern. First, the normal expression predicate is evaluated, and, only if it returns false, is the costly pattern predicate evaluated.

Example 34. SelectOrSemiApply
Query
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+--------------------+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator           | Details                                 | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults    | `other.name`                            |             11 |   10 |       0 |                |                        |           |                     |
| |                  +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Projection        | other.name AS `other.name`              |             11 |   10 |      20 |                |                        |           |                     |
| |                  +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +SelectOrSemiApply | other.age > $autoint_0                  |             14 |   10 |       0 |            392 |                    0/0 |     0.190 | Fused in Pipeline 2 |
| |\                 +-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Limit           | 1                                       |             14 |   10 |       0 |            752 |                        |           |                     |
| | |                +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Filter          | anon_3:Person                           |             12 |   10 |      20 |                |                        |           |                     |
| | |                +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)     | (other)-[anon_2:FRIENDS_WITH]->(anon_3) |             12 |   10 |      37 |                |                        |           |                     |
| | |                +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument        | other                                   |             14 |   14 |       0 |           2168 |                    2/0 |     0.435 | Fused in Pipeline 1 |
| |                  +-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan   | other:Person                            |             14 |   14 |      35 |                |                        |           | Fused in Pipeline 0 |
+--------------------+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 148, total allocated memory: 2952

Select Or Anti Semi Apply

The SelectOrAntiSemiApply operator is used to evaluate OR between a predicate and a negative pattern predicate (i.e. a pattern predicate preceded with NOT), and is a variation of the Apply operator. If the predicate returns true, the pattern predicate is not tested. If the predicate returns false or null, SelectOrAntiSemiApply will instead test the pattern predicate.

Example 35. SelectOrAntiSemiApply
Query
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR NOT (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator               | Details                                 | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults        | `other.name`                            |              4 |    4 |       0 |                |                        |           |                     |
| |                      +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Projection            | other.name AS `other.name`              |              4 |    4 |       8 |                |                        |           |                     |
| |                      +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +SelectOrAntiSemiApply | other.age > $autoint_0                  |             14 |    4 |       0 |            200 |                    0/0 |     0.155 | Fused in Pipeline 3 |
| |\                     +-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Anti                |                                         |             14 |    4 |       0 |           1256 |                    0/0 |     0.170 | In Pipeline 2       |
| | |                    +-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Limit               | 1                                       |              0 |   10 |       0 |            752 |                        |           |                     |
| | |                    +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Filter              | anon_3:Person                           |             12 |   10 |      20 |                |                        |           |                     |
| | |                    +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)         | (other)-[anon_2:FRIENDS_WITH]->(anon_3) |             12 |   10 |      37 |                |                        |           |                     |
| | |                    +-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument            | other                                   |             14 |   14 |       0 |           2168 |                    2/0 |     0.449 | Fused in Pipeline 1 |
| |                      +-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan       | other:Person                            |             14 |   14 |      35 |                |                        |           | Fused in Pipeline 0 |
+------------------------+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 136, total allocated memory: 4208

Let Select Or Semi Apply

The LetSelectOrSemiApply operator is planned for pattern predicates that are combined with other predicates using OR. This is a variation of the Apply operator.

Example 36. LetSelectOrSemiApply
Query
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE (other)-[:FRIENDS_WITH]->(:Person) OR (other)-[:WORKS_IN]->(:Location) OR other.age = 5
RETURN other.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------------+-----------------------------------------+----------------+------+---------+------------------------+
| Operator              | Details                                 | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------------+-----------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults       | `other.name`                            |             13 |   14 |       0 |                    0/0 |
| |                     +-----------------------------------------+----------------+------+---------+------------------------+
| +Projection           | other.name AS `other.name`              |             13 |   14 |      14 |                    1/0 |
| |                     +-----------------------------------------+----------------+------+---------+------------------------+
| +SelectOrSemiApply    | anon_9                                  |             14 |   14 |       0 |                    0/0 |
| |\                    +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter             | anon_7:Location                         |             14 |    0 |       4 |                    0/0 |
| | |                   +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)        | (other)-[anon_6:WORKS_IN]->(anon_7)     |             14 |    4 |      15 |                    8/0 |
| | |                   +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument           | other                                   |             14 |    4 |       0 |                    0/0 |
| |                     +-----------------------------------------+----------------+------+---------+------------------------+
| +LetSelectOrSemiApply | other.age = $autoint_0                  |             14 |   14 |      14 |                    0/0 |
| |\                    +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter             | anon_5:Person                           |             12 |    0 |      10 |                    0/0 |
| | |                   +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)        | (other)-[anon_4:FRIENDS_WITH]->(anon_5) |             12 |   10 |      51 |                   28/0 |
| | |                   +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument           | other                                   |             14 |   14 |       0 |                    0/0 |
| |                     +-----------------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan      | other:Person                            |             14 |   14 |      35 |                    1/0 |
+-----------------------+-----------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 179, total allocated memory: 64

Let Select Or Anti Semi Apply

The LetSelectOrAntiSemiApply operator is planned for negated pattern predicates — i.e. pattern predicates preceded with NOT — that are combined with other predicates using OR. This operator is a variation of the Apply operator.

Example 37. LetSelectOrAntiSemiApply
Query
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE NOT (other)-[:FRIENDS_WITH]->(:Person) OR (other)-[:WORKS_IN]->(:Location) OR other.age = 5
RETURN other.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+---------------------------+-----------------------------------------+----------------+------+---------+------------------------+
| Operator                  | Details                                 | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+---------------------------+-----------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults           | `other.name`                            |             12 |   14 |       0 |                    0/0 |
| |                         +-----------------------------------------+----------------+------+---------+------------------------+
| +Projection               | other.name AS `other.name`              |             12 |   14 |      14 |                    1/0 |
| |                         +-----------------------------------------+----------------+------+---------+------------------------+
| +SelectOrSemiApply        | anon_9                                  |             14 |   14 |       0 |                    0/0 |
| |\                        +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter                 | anon_7:Location                         |             14 |    0 |      10 |                    0/0 |
| | |                       +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)            | (other)-[anon_6:WORKS_IN]->(anon_7)     |             14 |   10 |      38 |                   20/0 |
| | |                       +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument               | other                                   |             14 |   10 |       0 |                    0/0 |
| |                         +-----------------------------------------+----------------+------+---------+------------------------+
| +LetSelectOrAntiSemiApply | other.age = $autoint_0                  |             14 |   14 |      14 |                    0/0 |
| |\                        +-----------------------------------------+----------------+------+---------+------------------------+
| | +Filter                 | anon_5:Person                           |             12 |    0 |      10 |                    0/0 |
| | |                       +-----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)            | (other)-[anon_4:FRIENDS_WITH]->(anon_5) |             12 |   10 |      51 |                   28/0 |
| | |                       +-----------------------------------------+----------------+------+---------+------------------------+
| | +Argument               | other                                   |             14 |   14 |       0 |                    0/0 |
| |                         +-----------------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan          | other:Person                            |             14 |   14 |      35 |                    1/0 |
+---------------------------+-----------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 208, total allocated memory: 64

Merge

The Merge operator will either read or create nodes and/or relationships.

If matches are found it will execute the provided ON MATCH operations foreach incoming row. If no matches are found instead nodes and relationships are created and all ON CREATE operations are run.

Example 38. Merge
Query
PROFILE
MERGE (p:Person {name: 'Andy'})
ON MATCH SET p.existed = true
ON CREATE SET p.existed = false
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                                                 | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |                                                                         |              1 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |                                                                         |              1 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Merge          | CREATE (p:Person {name: $autostring_0}), ON MATCH SET p.existed = true, |              1 |    1 |       2 |                |                        |           |                     |
| |               | ON CREATE SET p.existed = false                                         |                |      |         |                |                        |           |                     |
| |               +-------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek  | RANGE INDEX p:Person(name) WHERE name = $autostring_0                   |              1 |    1 |       2 |            120 |                    2/1 |     0.749 | Fused in Pipeline 0 |
+-----------------+-------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 4, total allocated memory: 184

Locking Merge

The LockingMerge operator is just like a normal Merge but will lock the start and end node when creating a relationship if necessary.

Example 39. LockingMerge
Query
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply          |                                                       |              1 |    1 |       0 |                |                        |           |                     |
| |\              +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +LockingMerge | CREATE (s)-[anon_0:FRIENDS_WITH]->(s), LOCK(s)        |              1 |    1 |       1 |                |                        |           |                     |
| | |             +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(Into) | (s)-[anon_0:FRIENDS_WITH]->(s)                        |              0 |    0 |      12 |            896 |                        |           |                     |
| | |             +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument     | s                                                     |              1 |    3 |       0 |           2152 |                    3/0 |     0.616 | Fused in Pipeline 1 |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek  | RANGE INDEX s:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    0/1 |     0.298 | In Pipeline 0       |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 2232

Roll Up Apply

The RollUpApply operator is used to execute an expression which takes as input a pattern, and returns a list with content from the matched pattern; for example, when using a pattern expression or pattern comprehension in a query. This operator is a variation of the Apply operator.

Example 40. RollUpApply
Query
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
RETURN p.name, [(p)-[:WORKS_IN]->(location) | location.name] AS cities
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+-----------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                           | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+-----------------------------------+----------------+------+---------+------------------------+
| +ProduceResults | `p.name`, cities                  |             14 |   14 |       0 |                    0/0 |
| |               +-----------------------------------+----------------+------+---------+------------------------+
| +Projection     | p.name AS `p.name`                |             14 |   14 |      14 |                    0/0 |
| |               +-----------------------------------+----------------+------+---------+------------------------+
| +RollUpApply    | cities, anon_0                    |             14 |   14 |       0 |                    0/0 |
| |\              +-----------------------------------+----------------+------+---------+------------------------+
| | +Projection   | location.name AS anon_0           |             15 |   15 |      15 |                    1/0 |
| | |             +-----------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)  | (p)-[anon_2:WORKS_IN]->(location) |             15 |   15 |      53 |                   28/0 |
| | |             +-----------------------------------+----------------+------+---------+------------------------+
| | +Argument     | p                                 |             14 |   14 |       0 |                    0/0 |
| |               +-----------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan| p:Person                          |             14 |   14 |      35 |                    1/0 |
+-----------------+-----------------------------------+----------------+------+---------+------------------------+

Total database accesses: 153, total allocated memory: 64

Argument

The Argument operator indicates the variable to be used as an argument to the right-hand side of an Apply operator.

Example 41. Argument
Query
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply          |                                                       |              1 |    1 |       0 |                |                        |           |                     |
| |\              +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +LockingMerge | CREATE (s)-[anon_0:FRIENDS_WITH]->(s), LOCK(s)        |              1 |    1 |       1 |                |                        |           |                     |
| | |             +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(Into) | (s)-[anon_0:FRIENDS_WITH]->(s)                        |              0 |    0 |      12 |            896 |                        |           |                     |
| | |             +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument     | s                                                     |              1 |    3 |       0 |           2152 |                    3/0 |     0.631 | Fused in Pipeline 1 |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek  | RANGE INDEX s:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    0/1 |     0.220 | In Pipeline 0       |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 2232

Expand All

Given a start node, and depending on the pattern relationship, the Expand(All) operator will traverse incoming or outgoing relationships.

Example 42. Expand(All)
Query
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)
RETURN fof
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | fof                                                   |              1 |    2 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)    | (p)-[anon_0:FRIENDS_WITH]->(fof)                      |              1 |    2 |       5 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek  | RANGE INDEX p:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    4/1 |     1.137 | Fused in Pipeline 0 |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 7, total allocated memory: 184

Expand Into

When both the start and end node have already been found, the Expand(Into) operator is used to find all relationships connecting the two nodes. As both the start and end node of the relationship are already in scope, the node with the smallest degree will be used. This can make a noticeable difference when dense nodes appear as end points.

Example 43. Expand(Into)
Query
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)-->(p)
RETURN fof
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | fof                                                   |              0 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter         | not anon_1 = anon_0                                   |              0 |    0 |       0 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(Into)   | (p)-[anon_0:FRIENDS_WITH]->(fof)                      |              0 |    0 |       6 |            896 |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)    | (p)<-[anon_1]-(fof)                                   |              1 |    1 |       5 |                |                        |           |                     |
| |               +-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek  | RANGE INDEX p:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    4/1 |     0.546 | Fused in Pipeline 0 |
+-----------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 976

Optional Expand All

The OptionalExpand(All) operator is analogous to Expand(All), apart from when no relationships match the direction, type and property predicates. In this situation, OptionalExpand(all) will return a single row with the relationship and end node set to null.

Example 44. OptionalExpand(All)
Query
PROFILE
MATCH (p:Person)
OPTIONAL MATCH (p)-[works_in:WORKS_IN]->(l)
  WHERE works_in.duration > 180
RETURN p, l
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------+-------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator             | Details                                                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------+-------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults      | p, l                                                              |             14 |   15 |       1 |                |                        |           |                     |
| |                    +-------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +OptionalExpand(All) | (p)-[works_in:WORKS_IN]->(l) WHERE works_in.duration > $autoint_0 |             14 |   15 |      53 |                |                        |           |                     |
| |                    +-------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan     | p:Person                                                          |             14 |   14 |      15 |            120 |                    5/0 |     1,233 | Fused in Pipeline 0 |
+----------------------+-------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 125, total allocated memory: 184

Optional Expand Into

The OptionalExpand(Into) operator is analogous to Expand(Into), apart from when no matching relationships are found. In this situation, OptionalExpand(Into) will return a single row with the relationship and end node set to null. As both the start and end node of the relationship are already in scope, the node with the smallest degree will be used. This can make a noticeable difference when dense nodes appear as end points.

Example 45. OptionalExpand(Into)
Query
PROFILE
MATCH (p:Person)-[works_in:WORKS_IN]->(l)
OPTIONAL MATCH (l)-->(p)
RETURN p
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator              | Details                      | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults       | p                            |             15 |   15 |       0 |                |                        |           |                     |
| |                     +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +OptionalExpand(Into) | (l)-[anon_0]->(p)            |             15 |   15 |     105 |           3360 |                        |           |                     |
| |                     +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)          | (p)-[works_in:WORKS_IN]->(l) |             15 |   15 |      39 |                |                        |           |                     |
| |                     +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan      | p:Person                     |             14 |   14 |      15 |            120 |                    7/0 |     3,925 | Fused in Pipeline 0 |
+-----------------------+--- --------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 215, total allocated memory: 3440

VarLength Expand All

Given a start node, the VarLengthExpand(All) operator will traverse variable-length relationships.

Example 46. VarLengthExpand(All)
Query
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(q:Person)
RETURN p, q
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator              | Details                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults       | p, q                              |             40 |   48 |       0 |                |                        |           |                     |
| |                     +-----------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter               | q:Person                          |             40 |   48 |      96 |                |                        |           |                     |
| |                     +-----------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +VarLengthExpand(All) | (p)-[anon_0:FRIENDS_WITH*..2]-(q) |             40 |   48 |     151 |            128 |                        |           |                     |
| |                     +-----------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan      | p:Person                          |             14 |   14 |      15 |            120 |                    6/0 |    10,457 | Fused in Pipeline 0 |
+-----------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 318, total allocated memory: 208

VarLength Expand Into

When both the start and end node have already been found, the VarLengthExpand(Into) operator is used to find all variable-length relationships connecting the two nodes.

Example 47. VarLengthExpand(Into)
Query
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(p:Person)
RETURN p
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator               | Details                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults        | p                                 |              3 |    4 |       0 |                |                        |           |                     |
| |                      +-----------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +VarLengthExpand(Into) | (p)-[anon_0:FRIENDS_WITH*..2]-(p) |              3 |    4 |     151 |            128 |                        |           |                     |
| |                      +-----------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan       | p:Person                          |             14 |   14 |      15 |            120 |                    6/0 |     0,797 | Fused in Pipeline 0 |
+------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+


Total database accesses: 222, total allocated memory: 192

VarLength Expand Pruning

Given a start node, the VarLengthExpand(Pruning) operator will traverse variable-length relationships much like the VarLengthExpand(All) operator. However, as an optimization, some paths will not be explored if they are guaranteed to produce an end node that has already been found (by means of a previous path traversal).

This kind of expand is only planned when:

  • The individual paths are not of interest.

  • The relationships have an upper bound.

The VarLengthExpand(Pruning) operator guarantees that all the end nodes produced will be unique.

Example 48. VarLengthExpand(Pruning)
Query
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *3..4]-(q:Person)
RETURN DISTINCT p, q
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                  | Details                      | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults           | p, q                         |             17 |   32 |       0 |                |                    2/0 |     0.242 |                     |
| |                         +------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Distinct                 | p, q                         |             17 |   32 |       0 |           2208 |                    0/0 |    13.409 |                     |
| |                         +------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Filter                   | q:Person                     |             18 |   32 |      64 |                |                    1/0 |     0.358 |                     |
| |                         +------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +VarLengthExpand(Pruning) | (p)-[:FRIENDS_WITH*3..4]-(q) |             18 |   32 |     204 |           1696 |                        |           | In Pipeline 1       |
| |                         +------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan          | p:Person                     |             14 |   14 |      15 |            120 |                    1/0 |     0,100 | In Pipeline 0       |
+---------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 339, total allocated memory: 2288

Breadth First VarLength Expand Pruning

Given a start node, the VarLengthExpand(Pruning,BFS) operator traverses variable-length relationships much like the VarLengthExpand(All) operator. However, as an optimization, it instead performs a breadth-first search (BFS) and while expanding, some paths are not explored if they are guaranteed to produce an end node that has already been found (by means of a previous path traversal). This is only used in cases where the individual paths are not of interest.

This kind of expand is only planned when:

  • The individual paths are not of interest.

  • The relationships have an upper bound.

  • The lower bound is either 0 or 1 (default).

This operator guarantees that all the end nodes produced are unique.

Query
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *..4]-(q:Person)
RETURN DISTINCT p, q
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------------------+-----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                      | Details                     | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------------------+-----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults               | p, q                        |             56 |   68 |       0 |                |                        |           |                     |
| |                             +-----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Distinct                     | p, q                        |             56 |   68 |       0 |           4480 |                        |           |                     |
| |                             +-----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter                       | q:Person                    |             59 |   68 |     136 |                |                        |           |                     |
| |                             +-----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +VarLengthExpand(Pruning,BFS) | (p)-[:FRIENDS_WITH*..4]-(q) |             59 |   68 |     280 |            696 |                        |           |                     |
| |                             +-----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan              | p:Person                    |             14 |   14 |      15 |            120 |                    4/0 |     3,202 | Fused in Pipeline 0 |
+-------------------------------+-----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 487, total allocated memory: 5256

Assert Same Node

The AssertSameNode operator is used to ensure that no property uniqueness constraints are violated in the slotted and interpreted runtime. The example looks for the presence of a team with the supplied name and id, and if one does not exist, it will be created. Owing to the existence of two property uniqueness constraints on :Team(name) and :Team(id), any node that would be found by the UniqueIndexSeek operator must be the very same node or the constraints would be violated.

Example 49. AssertSameNode
Query
PROFILE
CYPHER runtime=slotted
MERGE (t:Team {name: 'Engineering', id: 42})
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+---------------------------------+-------------------------------------------------------+----------------+------+---------+------------------------+
| Operator                        | Details                                               | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+---------------------------------+-------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults                 |                                                       |              1 |    0 |       0 |                    0/0 |
| |                               +-------------------------------------------------------+----------------+------+---------+------------------------+
| +EmptyResult                    |                                                       |              1 |    0 |       0 |                    0/0 |
| |                               +-------------------------------------------------------+----------------+------+---------+------------------------+
| +Merge                          | CREATE (t:Team {name: $autostring_0, id: $autoint_1}) |              1 |    1 |       0 |                    0/0 |
| |                               +-------------------------------------------------------+----------------+------+---------+------------------------+
| +AssertSameNode                 | t                                                     |              0 |    1 |       0 |                    0/0 |
| |\                              +-------------------------------------------------------+----------------+------+---------+------------------------+
| | +NodeUniqueIndexSeek(Locking) | UNIQUE t:Team(id) WHERE id = $autoint_1               |              1 |    1 |       1 |                    0/1 |
| |                               +-------------------------------------------------------+----------------+------+---------+------------------------+
| +NodeUniqueIndexSeek(Locking)   | UNIQUE t:Team(name) WHERE name = $autostring_0        |              1 |    1 |       1 |                    0/1 |
+---------------------------------+-------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 2, total allocated memory: 64

Empty Result

The EmptyResult operator eagerly loads all incoming data and discards it.

Example 50. EmptyResult
Query
PROFILE
CREATE (:Person)
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-----------------+----------------+------+---------+------------------------+-----------+---------------------+
| Operator        | Details         | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-----------------+----------------+------+---------+------------------------+-----------+---------------------+
| +ProduceResults |                 |              1 |    0 |       0 |                        |           |                     |
| |               +-----------------+----------------+------+---------+                        |           |                     |
| +EmptyResult    |                 |              1 |    0 |       0 |                        |           |                     |
| |               +-----------------+----------------+------+---------+                        |           |                     |
| +Create         | (anon_0:Person) |              1 |    1 |       1 |                    0/0 |     0.000 | Fused in Pipeline 0 |
+-----------------+-----------------+----------------+------+---------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Produce Results

The ProduceResults operator prepares the result so that it is consumable by the user, such as transforming internal values to user values. It is present in every single query that returns data to the user, and has little bearing on performance optimisation.

Example 51. ProduceResults
Query
PROFILE
MATCH (n)
RETURN n
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | n       |             35 |   35 |       0 |                |                        |           |                     |
| |               +---------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan   | n       |             35 |   35 |      36 |            120 |                    3/0 |     0.508 | Fused in Pipeline 0 |
+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 36, total allocated memory: 184

Load CSV

The LoadCSV operator loads data from a CSV source into the query. It is used whenever the LOAD CSV clause is used in a query.

Example 52. LoadCSV
Query
PROFILE
LOAD CSV FROM 'https://neo4j.com/docs/cypher-refcard/3.3/csv/artists.csv' AS line
RETURN line
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator        | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults | line    |             10 |    4 |       0 |                |                    0/0 |     0.210 |               |
| |               +---------+----------------+------+---------+----------------+------------------------+-----------+               |
| +LoadCSV        | line    |             10 |    4 |       0 |             72 |                        |           | In Pipeline 1 |
+-----------------+---------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 0, total allocated memory: 184

Hash joins in general

Hash joins have two inputs: the build input and probe input. The query planner assigns these roles so that the smaller of the two inputs is the build input. The build input is pulled in eagerly, and is used to build a probe table. Once this is complete, the probe table is checked for each row coming from the probe input side.

In query plans, the build input is always the left operator, and the probe input the right operator.

There are four hash join operators:

Node Hash Join

The NodeHashJoin operator is a variation of the hash join. NodeHashJoin executes the hash join on node ids. As primitive types and arrays can be used, it can be done very efficiently.

Example 53. NodeHashJoin
Query
PROFILE
MATCH (bob:Person {name: 'Bob'})-[:WORKS_IN]->(loc)<-[:WORKS_IN]-(matt:Person {name: 'Mattias'})
RETURN loc.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details                                                  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | `loc.name`                                               |             10 |    0 |       0 |                |                    0/0 |     0.000 |                     |
| |                +----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Projection      | loc.name AS `loc.name`                                   |             10 |    0 |       0 |                |                    0/0 |     0.000 |                     |
| |                +----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Filter          | not anon_0 = anon_1                                      |             10 |    0 |       0 |                |                    0/0 |     0.000 |                     |
| |                +----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +NodeHashJoin    | loc                                                      |             10 |    0 |       0 |           3688 |                        |     0.053 | In Pipeline 2       |
| |\               +----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Expand(All)   | (matt)-[anon_1:WORKS_IN]->(loc)                          |             19 |    0 |       0 |                |                        |           |                     |
| | |              +----------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +NodeIndexSeek | RANGE INDEX matt:Person(name) WHERE name = $autostring_1 |              1 |    0 |       1 |            120 |                    1/0 |     0.288 | Fused in Pipeline 1 |
| |                +----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Expand(All)     | (bob)-[anon_0:WORKS_IN]->(loc)                           |             19 |    1 |       4 |                |                        |           |                     |
| |                +----------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek   | RANGE INDEX bob:Person(name) WHERE name = $autostring_0  |              1 |    1 |       2 |            120 |                    3/0 |     0.556 | Fused in Pipeline 0 |
+------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 7, total allocated memory: 3888

Value Hash Join

The ValueHashJoin operator is a variation of the hash join. This operator allows for arbitrary values to be used as the join key. It is most frequently used to solve predicates of the form: n.prop1 = m.prop2 (i.e. equality predicates between two property columns).

Example 54. ValueHashJoin
Query
PROFILE
MATCH
  (p:Person),
  (q:Person)
WHERE p.age = q.age
RETURN p, q
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator          | Details       | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults    | p, q         |             10 |    0 |       0 |                |                    0/0 |     0.000 |                     |
| |                 +---------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +ValueHashJoin     | p.age = q.age|             10 |    0 |       0 |            344 |                        |           | In Pipeline 2       |
| |\                +---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +NodeByLabelScan| q:Person      |             15 |    0 |       0 |            120 |                    0/0 |     0,000 | In Pipeline 1       |
| |                 +---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan  | p:Person      |             15 |   15 |      16 |            120 |                    1/0 |     0,211 | In Pipeline 0       |
+-------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 71, total allocated memory: 664

Node Left/Right Outer Hash Join

The NodeLeftOuterHashJoin and NodeRightOuterHashJoin operators are variations of the hash join. The query below can be planned with either a left or a right outer join. The decision depends on the cardinalities of the left-hand and right-hand sides; i.e. how many rows would be returned, respectively, for (a:Person) and (a)-→(b:Person). If (a:Person) returns fewer results than (a)-→(b:Person), a left outer join — indicated by NodeLeftOuterHashJoin — is planned. On the other hand, if (a:Person) returns more results than (a)-→(b:Person), a right outer join — indicated by NodeRightOuterHashJoin — is planned instead.

Example 55. NodeRightOuterHashJoin
Query
PROFILE
MATCH (a:Person)
OPTIONAL MATCH (a)-->(b:Person)
USING JOIN ON a
RETURN a.name, b.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------------+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                | Details                                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------------+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults         | `a.name`, `b.name`                                   |             14 |   16 |       0 |                |                    0/0 |     0.102 |                     |
| |                       +------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Projection             | cache[a.name] AS `a.name`, cache[b.name] AS `b.name` |             14 |   16 |       8 |                |                    0/0 |     0.055 |                     |
| |                       +------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +NodeRightOuterHashJoin | a                                                    |             14 |   16 |       0 |           4232 |                        |     0.269 | In Pipeline 2       |
| |\                      +------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +NodeByLabelScan      | a:Person                                             |             15 |   15 |      16 |            120 |                    1/0 |     0,049 | In Pipeline 1       |
| |                       +------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +CacheProperties        | cache[b.name], cache[a.name]                         |             13 |   13 |      39 |                |                        |           |                     |
| |                       +------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)            | (b)<-[anon_0]-(a)                                    |             13 |   13 |      55 |                |                        |           |                     |
| |                       +------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan        | b:Person                                             |             15 |   15 |      16 |            120 |                    5/0 |     1,150 | Fused in Pipeline 0 |
+-------------------------+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 211, total allocated memory: 4312

Triadic Selection

The TriadicSelection operator is used to solve triangular queries, such as the very common 'find my friend-of-friends that are not already my friend'. It does so by putting all the friends into a set, and uses the set to check if the friend-of-friends are already connected to me. The example finds the names of all friends of my friends that are not already my friends.

Example 56. TriadicSelection
Query
PROFILE
CYPHER runtime=slotted
MATCH (me:Person)-[:FRIENDS_WITH]-()-[:FRIENDS_WITH]-(other)
WHERE NOT (me)-[:FRIENDS_WITH]-(other)
RETURN other.name
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-------------------+----------------------------------------+----------------+------+---------+------------------------+
| Operator          | Details                                | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-------------------+----------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults   | `other.name`                           |              4 |   24 |       0 |                    0/0 |
| |                 +----------------------------------------+----------------+------+---------+------------------------+
| +Projection       | other.name AS `other.name`             |              4 |   24 |      24 |                    1/0 |
| |                 +----------------------------------------+----------------+------+---------+------------------------+
| +Filter           | not anon_2 = anon_4                    |             16 |   24 |       0 |                    0/0 |
| |                 +----------------------------------------+----------------+------+---------+------------------------+
| +TriadicSelection | WHERE NOT (me)--(other)                |              4 |   24 |       0 |                    0/0 |
| |\                +----------------------------------------+----------------+------+---------+------------------------+
| | |               +----------------------------------------+----------------+------+---------+------------------------+
| | +Expand(All)    | (anon_3)-[anon_4:FRIENDS_WITH]-(other) |             16 |   48 |      98 |                   48/0 |
| | |               +----------------------------------------+----------------+------+---------+------------------------+
| | +Argument       | anon_3, anon_2                         |             24 |   24 |       0 |                    0/0 |
| |                 +----------------------------------------+----------------+------+---------+------------------------+
| +Expand(All)      | (me)-[anon_2:FRIENDS_WITH]-(anon_3)    |             24 |   24 |      53 |                   28/0 |
| |                 +----------------------------------------+----------------+------+---------+------------------------+
| +NodeByLabelScan  | me:Person                              |             15 |   15 |      16 |                    1/0 |
+-------------------+----------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 246, total allocated memory: 64

Triadic Build

The TriadicBuild operator is used in conjunction with TriadicFilter to solve triangular queries, such as the very common 'find my friend-of-friends that are not already my friend'. These two operators are specific to Pipelined runtime and together perform the same logic as TriadicSelection does for other runtimes. TriadicBuild builds a set of all friends, which is later used by TriadicFilter. The example finds the names of all friends of my friends that are not already my friends.

Example 57. TriadicBuild
Query
PROFILE
CYPHER runtime=pipelined
MATCH (me:Person)-[:FRIENDS_WITH]-()-[:FRIENDS_WITH]-(other)
WHERE NOT (me)-[:FRIENDS_WITH]-(other)
RETURN other.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | `other.name`                           |              4 |   24 |       0 |                |                    0/0 |     0.133 |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Projection     | other.name AS `other.name`             |              4 |   24 |      48 |                |                    2/0 |     0.056 |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Filter         | not anon_2 = anon_4                    |             16 |   24 |       0 |                |                        |           |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +TriadicFilter  | WHERE NOT (me)--(other)                |              4 |   24 |       0 |           4136 |                    0/0 |     0.195 | In Pipeline 3       |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Apply          |                                        |             16 |   24 |       0 |                |                    0/0 |           |                     |
| |\              +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | |             +----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)  | (anon_3)-[anon_4:FRIENDS_WITH]-(other) |             16 |   48 |      98 |                |                        |           |                     |
| | |             +----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument     | anon_3, anon_2                         |             24 |   24 |       0 |           4200 |                    0/0 |     0.397 | Fused in Pipeline 2 |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +TriadicBuild   | (me)--(anon_3)                         |             24 |   24 |       0 |            888 |                    0/0 |     1.427 | In Pipeline 1       |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Expand(All)    | (me)-[anon_2:FRIENDS_WITH]-(anon_3)    |             24 |   24 |      39 |                |                        |           |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan| me:Person                               |             15 |   15 |      16 |            120 |                    3/0 |     0,200 | Fused in Pipeline 0 |
+-----------------+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 256, total allocated memory: 7376

Triadic Filter

The TriadicFilter operator is used in conjunction with TriadicBuild to solve triangular queries, such as the very common 'find my friend-of-friends that are not already my friend'. These two operators are specific to Pipelined runtime and together perform the same logic as TriadicSelection does for other runtimes. TriadicFilter uses a set of friends previously built by TriadicBuild to check if the friend-of-friends are already connected to me. The example finds the names of all friends of my friends that are not already my friends.

Example 58. TriadicFilter
Query
PROFILE
CYPHER runtime=pipelined
MATCH (me:Person)-[:FRIENDS_WITH]-()-[:FRIENDS_WITH]-(other)
WHERE NOT (me)-[:FRIENDS_WITH]-(other)
RETURN other.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | `other.name`                           |              4 |   24 |       0 |                |                    0/0 |     0.189 |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +Projection     | other.name AS `other.name`             |              4 |   24 |      48 |                |                    2/0 |     0.381 |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Filter         | not anon_2 = anon_4                    |             16 |   24 |       0 |                |                        |           |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +TriadicFilter  | WHERE NOT (me)--(other)                |              4 |   24 |       0 |           4136 |                    0/0 |     0.685 | In Pipeline 3       |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Apply          |                                        |             16 |   24 |       0 |                |                    0/0 |           |                     |
| |\              +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | |             +----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)  | (anon_3)-[anon_4:FRIENDS_WITH]-(other) |             16 |   48 |      98 |                |                        |           |                     |
| | |             +----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument     | anon_3, anon_2                         |             24 |   24 |       0 |           4200 |                    0/0 |     0.496 | Fused in Pipeline 2 |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +TriadicBuild   | (me)--(anon_3)                         |             24 |   24 |       0 |            888 |                    0/0 |     3.268 | In Pipeline 1       |
| |               +----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Expand(All)    | (me)-[anon_2:FRIENDS_WITH]-(anon_3)    |             24 |   24 |      39 |                |                        |           |                     |
| |               +----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan| me:Person                              |             15 |   15 |      16 |            120 |                    3/0 |     0,481 | Fused in Pipeline 0 |
+-----------------+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 256, total allocated memory: 7376

Cartesian Product

The CartesianProduct operator produces a cartesian product of the two inputs — each row coming from the left child operator will be combined with all the rows from the right child operator. CartesianProduct generally exhibits bad performance and ought to be avoided if possible.

Example 59. CartesianProduct
Query
PROFILE
MATCH
  (p:Person),
  (t:Team)
RETURN p, t
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+--------------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator           | Details  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults    | p, t     |            140 |  140 |       0 |                |                    2/0 |     1.917 |                     |
| |                  +----------+----------------+------+---------+----------------+------------------------+-----------+                     |
| +CartesianProduct  |          |            140 |  140 |       0 |           1736 |                        |     1.209 | In Pipeline 2       |
| |\                 +----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +NodeByLabelScan | t:Team   |             10 |   10 |      11 |            136 |                    1/0 |     1,145 | In Pipeline 1       |
| |                  +----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan   | p:Person |             15 |   15 |      16 |            120 |                    1/0 |     0,409 | In Pipeline 0       |
+--------------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 142, total allocated memory: 1816

Foreach

The Foreach operator executes a nested loop between the left child operator and the right child operator. In an analogous manner to the Apply operator, it takes a row from the left-hand side and, using the Argument operator, provides it to the operator tree on the right-hand side. Foreach will yield all the rows coming in from the left-hand side; all results from the right-hand side are pulled in and discarded.

Example 60. Foreach
Query
PROFILE
CYPHER runtime=slotted
FOREACH (value IN [1,2,3] | CREATE (:Person {age: value}))
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+---------------------------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                                                 | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+---------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults |                                                         |              1 |    0 |       0 |                    0/0 |
| |               +---------------------------------------------------------+----------------+------+---------+------------------------+
| +EmptyResult    |                                                         |              1 |    0 |       0 |                    0/0 |
| |               +---------------------------------------------------------+----------------+------+---------+------------------------+
| +Foreach        | value IN [1, 2, 3], CREATE (anon_0:Person {age: value}) |              1 |    1 |       9 |                    0/0 |
+-----------------+---------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 9, total allocated memory: 64

Eager

The Eager operator causes all preceding operators to execute fully, for the whole dataset, before continuing execution. This is done to ensure isolation between parts of the query plan that might otherwise affect each other.

Values from the graph are fetched in a lazy manner; i.e. a pattern matching might not be fully exhausted before updates are applied. To maintain correct semantics, the query planner will insert Eager operators into the query plan to prevent updates from influencing pattern matching, or other read operations. This scenario is exemplified by the query below, where the DELETE clause would otherwise influence both the MATCH clause and the MERGE clause. For more information on how the Eager operator can ensure correct semantics, see the section on Clause composition.

The Eager operator can cause high memory usage when importing data or migrating graph structures. In such cases, the operations should be split into simpler steps; e.g. importing nodes and relationships separately. Alternatively, the records to be updated can be returned, followed by an update statement.

Example 61. Eager
Query
PROFILE
MATCH (a), (b)
DETACH DELETE a, b
MERGE ()
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 1024

+-------------------+----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| Operator          | Id | Details                                                                          | Estimated Rows | Rows  | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------+----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults   |  0 |                                                                                  |          15129 |     0 |       0 |                |                        |           |                     |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+                        |           |                     |
| +EmptyResult      |  1 |                                                                                  |          15129 |     0 |       0 |                |                        |           |                     |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+                        |           |                     |
| +Apply            |  2 |                                                                                  |          15129 | 15129 |       0 |                |                        |           |                     |
| |\                +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+                        |           |                     |
| | +Merge          |  3 | CREATE (anon_0)                                                                  |          15129 | 15129 |       1 |                |                        |           |                     |
| | |               +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+                        |           |                     |
| | +AllNodesScan   |  4 | anon_0                                                                           |        1860867 | 15128 |   30257 |          24680 |               347967/0 |  1820.510 | Fused in Pipeline 5 |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| +Eager            |  5 | read/delete conflict for variable: anon_0, read/delete conflict for variable: a, |          15129 | 15129 |       0 |         243608 |                    0/0 |     0.182 | In Pipeline 4       |
| |                 |    | read/delete conflict for variable: b                                             |                |       |         |                |                        |           |                     |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| +DetachDelete     |  6 | b                                                                                |          15129 | 15129 |     122 |                |                        |           |                     |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+                        |           |                     |
| +DetachDelete     |  7 | a                                                                                |          15129 | 15129 |       1 |                |                        |           |                     |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+                        |           |                     |
| +Eager            |  8 | read/delete conflict for variable: b                                             |          15129 | 15129 |       0 |         243608 |                    0/0 |     8.515 | Fused in Pipeline 3 |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| +CartesianProduct |  9 |                                                                                  |          15129 | 15129 |       0 |          10712 |                    0/0 |     0.342 | In Pipeline 2       |
| |\                +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| | +AllNodesScan   | 10 | b                                                                                |            123 |   123 |     124 |            136 |                   23/0 |     0.243 | In Pipeline 1       |
| |                 +----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+
| +AllNodesScan     | 11 | a                                                                                |            123 |   123 |     124 |            120 |                   23/0 |     0.344 | In Pipeline 0       |
+-------------------+----+----------------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 30629, total allocated memory: 260488

Eager Aggregation

The EagerAggregation operator evaluates a grouping expression and uses the result to group rows into different groupings. For each of these groupings, EagerAggregation will then evaluate all aggregation functions and return the result. To do this, EagerAggregation, as the name implies, needs to pull in all data eagerly from its source and build up state, which leads to increased memory pressure in the system.

Example 62. EagerAggregation
Query
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN
  l.name AS location,
  collect(p.name) AS people
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-------------------+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator          | Details                                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults   | location, people                                     |              4 |    6 |       0 |                |                    0/0 |     0.113 | In Pipeline 1       |
| |                 +------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +EagerAggregation | cache[l.name] AS location, collect(p.name) AS people |              4 |    6 |      30 |           2584 |                        |           |                     |
| |                 +------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter           | p:Person                                             |             15 |   15 |      30 |                |                        |           |                     |
| |                 +------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)      | (l)<-[anon_0:WORKS_IN]-(p)                           |             15 |   15 |      16 |                |                        |           |                     |
| |                 +------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +CacheProperties  | cache[l.name]                                        |             10 |   10 |      10 |                |                        |           |                     |
| |                 +------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan  | l:Location                                           |             10 |   10 |      11 |            120 |                    5/0 |     3,077 | Fused in Pipeline 0 |
+-------------------+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 157, total allocated memory: 2664

Ordered Aggregation

The OrderedAggregation operator is an optimization of the EagerAggregation operator that takes advantage of the ordering of the incoming rows. This operator uses lazy evaluation and has a lower memory pressure in the system than the EagerAggregation operator.

Example 63. OrderedAggregation
Query
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p.name, count(*) AS count
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+
| Operator              | Details                                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by   | Pipeline      |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+
| +ProduceResults       | `p.name`, count                                                                |              0 |    2 |       0 |                |                    0/0 |     0.045 |              |               |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+              |               |
| +OrderedAggregation   | cache[p.name] AS `p.name`, count(*) AS count                                   |              0 |    2 |       0 |            288 |                    0/0 |     0.175 | `p.name` ASC | In Pipeline 1 |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+
| +NodeIndexSeekByRange | RANGE INDEX p:Person(name) WHERE name STARTS WITH $autostring_0, cache[p.name] |              0 |    2 |       3 |            120 |                    0/1 |     0.529 | p.name ASC   | In Pipeline 0 |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+

Total database accesses: 3, total allocated memory: 352

Node Count From Count Store

The NodeCountFromCountStore operator uses the count store to answer questions about node counts. This is much faster than the EagerAggregation operator which achieves the same result by actually counting. However, as the count store only stores a limited range of combinations, EagerAggregation will still be used for more complex queries. For example, we can get counts for all nodes, and nodes with a label, but not nodes with more than one label.

Example 64. NodeCountFromCountStore
Query
PROFILE
MATCH (p:Person)
RETURN count(p) AS people
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                 | Details                      | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults          | people                       |              1 |    1 |       0 |                |                        |           |                     |
| |                        +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeCountFromCountStore | count( (:Person) ) AS people |              1 |    1 |       1 |            120 |                    0/0 |     0.169 | Fused in Pipeline 0 |
+--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Relationship Count From Count Store

The RelationshipCountFromCountStore operator uses the count store to answer questions about relationship counts. This is much faster than the EagerAggregation operator which achieves the same result by actually counting. However, as the count store only stores a limited range of combinations, EagerAggregation will still be used for more complex queries. For example, we can get counts for all relationships, relationships with a type, relationships with a label on one end, but not relationships with labels on both end nodes.

Example 65. RelationshipCountFromCountStore
Query
PROFILE
MATCH (p:Person)-[r:WORKS_IN]->()
RETURN count(r) AS jobs
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+----------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                         | Details                                    | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                  | jobs                                       |              1 |    1 |       0 |                |                        |           |                     |
| |                                +--------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +RelationshipCountFromCountStore | count( (:Person)-[:WORKS_IN]->() ) AS jobs |              1 |    1 |       1 |            120 |                    0/0 |     0.625 | Fused in Pipeline 0 |
+----------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 1, total allocated memory: 184

Distinct

The Distinct operator removes duplicate rows from the incoming stream of rows. To ensure only distinct elements are returned, Distinct will pull in data lazily from its source and build up state. This may lead to increased memory pressure in the system.

Example 66. Distinct
Query
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN DISTINCT l
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details                    | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | l                          |             14 |    6 |       0 |                |                        |           |                     |
| |                +----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Distinct        | l                          |             14 |    6 |       0 |            224 |                        |           |                     |
| |                +----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter          | p:Person                   |             15 |   15 |      30 |                |                        |           |                     |
| |                +----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)     | (l)<-[anon_0:WORKS_IN]-(p) |             15 |   15 |      16 |                |                        |           |                     |
| |                +----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan | l:Location                 |             10 |   10 |      11 |            120 |                    4/0 |     0,744 | Fused in Pipeline 0 |
+------------------+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 117, total allocated memory: 304

Ordered Distinct

The OrderedDistinct operator is an optimization of the Distinct operator that takes advantage of the ordering of the incoming rows. This operator has a lower memory pressure in the system than the Distinct operator.

Example 67. OrderedDistinct
Query
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN DISTINCT p.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+
| Operator              | Details                                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by   | Pipeline      |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+
| +ProduceResults       | `p.name`                                                                       |              0 |    2 |       0 |                |                    0/0 |     0.046 |              |               |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+              |               |
| +OrderedDistinct      | cache[p.name] AS `p.name`                                                      |              0 |    2 |       0 |             32 |                    0/0 |     0.090 | `p.name` ASC |               |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+               |
| +NodeIndexSeekByRange | RANGE INDEX p:Person(name) WHERE name STARTS WITH $autostring_0, cache[p.name] |              0 |    2 |       3 |            120 |                    0/1 |     0.493 | p.name ASC   | In Pipeline 0 |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+

Total database accesses: 3, total allocated memory: 184

Filter

The Filter operator filters each row coming from the child operator, only passing through rows that evaluate the predicates to true.

Example 68. Filter
Query
PROFILE
MATCH (p:Person)
WHERE p.name =~ '^a.*'
RETURN p
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                                          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | p                                                                |             14 |    0 |       0 |                |                        |           |                     |
| |               +------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter         | cache[p.name] =~ $autostring_0                                   |             14 |    0 |       0 |                |                        |           |                     |
| |               +------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexScan  | RANGE INDEX p:Person(name) WHERE name IS NOT NULL, cache[p.name] |             14 |   14 |      15 |            120 |                    0/1 |     0.763 | Fused in Pipeline 0 |
+-----------------+------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 184

Limit

The Limit operator returns the first n rows from the incoming input.

Example 69. Limit
Query
PROFILE
MATCH (p:Person)
RETURN p
LIMIT 3
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | p        |              3 |    3 |       0 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +Limit          | 3        |              3 |    3 |       0 |             32 |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan| p:Person |              3 |    4 |       5 |            120 |                    3/0 |     0,540 | Fused in Pipeline 0 |
+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 8, total allocated memory: 184

Skip

The Skip operator skips n rows from the incoming rows.

Example 70. Skip
Query
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.id
SKIP 1
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+----------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| Operator         | Details        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline            |
+------------------+----------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProduceResults  | p              |             13 |   13 |       0 |                |                    2/0 |     0.165 |            |                     |
| |                +----------------+----------------+------+---------+----------------+------------------------+-----------+            |                     |
| +Skip            | $autoint_0     |             13 |   13 |       0 |             32 |                    0/0 |     0.043 |            |                     |
| |                +----------------+----------------+------+---------+----------------+------------------------+-----------+            |                     |
| +Sort            | `p.id` ASC     |             14 |   14 |       0 |            400 |                    0/0 |     0.155 | p.id ASC   | In Pipeline 1       |
| |                +----------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +Projection      | p.id AS `p.id` |             14 |   14 |       0 |                |                        |           |            |                     |
| |                +----------------+----------------+------+---------+----------------+                        |           +------------+                     |
| +NodeByLabelScan | p:Person       |             18 |   18 |      19 |            120 |                    3/0 |     0,157 |            | Fused in Pipeline 0 |
+------------------+----------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+

Total database accesses: 71, total allocated memory: 512

Sort

The Sort operator sorts rows by a provided key. In order to sort the data, all data from the source operator needs to be pulled in eagerly and kept in the query state, which will lead to increased memory pressure in the system.

Example 71. Sort
Query
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| Operator         | Details            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline            |
+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProduceResult s | p                  |             14 |   14 |       0 |                |                    2/0 |     0.178 |            |                     |
| |                +--------------------+----------------+------+---------+----------------+------------------------+-----------+            |                     |
| +Sort            | `p.name` ASC       |             14 |   14 |       0 |           1192 |                    0/0 |     0.107 | p.name ASC | In Pipeline 1       |
| |                +--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +Projection      | p.name AS `p.name` |             14 |   14 |      14 |                |                        |           |            |                     |
| |                +--------------------+----------------+------+---------+----------------+                        |           +------------+                     |
| +NodeByLabelScan |p:Person            |             14 |   14 |      35 |            120 |                    3/0 |     0,221 |            | Fused in Pipeline 0 |
+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+

Total database accesses: 85, total allocated memory: 1272

Partial Sort

The PartialSort operator is an optimization of the Sort operator that takes advantage of the ordering of the incoming rows. This operator uses lazy evaluation and has a lower memory pressure in the system than the Sort operator. Partial sort is only applicable when sorting on multiple columns.

Example 72. PartialSort
Query
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p
ORDER BY p.name, p.age
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| Operator              | Details                                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by            | Pipeline            |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| +ProduceResults       | p                                                                              |              0 |    2 |       0 |                |                    2/0 |     0.087 |                       |                     |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                       |                     |
| +PartialSort          | `p.name` ASC, `p.age` ASC                                                      |              0 |    2 |       0 |            544 |                    0/0 |     0.184 | p.name ASC, p.age ASC | In Pipeline 1       |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| +Projection           | cache[p.name] AS `p.name`, p.age AS `p.age`                                    |              0 |    2 |       0 |                |                        |           | `p.name` ASC          |                     |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           +-----------------------+                     |
| +NodeIndexSeekByRange | RANGE INDEX p:Person(name) WHERE name STARTS WITH $autostring_0, cache[p.name] |              0 |    2 |       3 |            120 |                    0/1 |     0.362 | p.name ASC            | Fused in Pipeline 0 |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+

Total database accesses: 3, total allocated memory: 608

Top

The Top operator returns the first n rows sorted by a provided key. Instead of sorting the entire input, only the top n rows are retained.

Example 73. Top
Query
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
LIMIT 2
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+----------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| Operator         | Details              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline            |
+------------------+----------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProduceResults  | p                    |              2 |    2 |       0 |                |                    2/0 |     0.093 |            |                     |
| |                +----------------------+----------------+------+---------+----------------+------------------------+-----------+            |                     |
| +Top             | `p.name` ASC LIMIT 2 |              2 |    2 |       0 |           1184 |                    0/0 |     0.295 | p.name ASC | In Pipeline 1       |
| |                +----------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +Projection      | p.name AS `p.name`   |             14 |   14 |      14 |                |                        |           |            |                     |
| |                +----------------------+----------------+------+---------+----------------+                        |           +------------+                     |
| +NodeByLabelScan | p:Person             |             14 |   14 |      35 |            120 |                    3/0 |     0,166 |            | Fused in Pipeline 0 |
+------------------+----------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+

Total database accesses: 85, total allocated memory: 1264

Partial Top

The PartialTop operator is an optimization of the Top operator that takes advantage of the ordering of the incoming rows. This operator uses lazy evaluation and has a lower memory pressure in the system than the Top operator. Partial top is only applicable when sorting on multiple columns.

Example 74. PartialTop
Query
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p
ORDER BY p.name, p.age
LIMIT 2
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| Operator              | Details                                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by            | Pipeline            |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| +ProduceResults       | p                                                                              |              0 |    2 |       0 |                |                    2/0 |     0.093 |                       |                     |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+                       |                     |
| +PartialTop           | `p.name` ASC, `p.age` ASC LIMIT 2                                              |              0 |    2 |       0 |            640 |                    0/0 |     0.870 | p.name ASC, p.age ASC | In Pipeline 1       |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+
| +Projection           | cache[p.name] AS `p.name`, p.age AS `p.age`                                    |              0 |    2 |       0 |                |                        |           | `p.name` ASC          |                     |
| |                     +--------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           +-----------------------+                     |
| +NodeIndexSeekByRange | RANGE INDEX p:Person(name) WHERE name STARTS WITH $autostring_0, cache[p.name] |              0 |    2 |       3 |            120 |                    0/1 |     0.556 | p.name ASC            | Fused in Pipeline 0 |
+-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+-----------------------+---------------------+

Total database accesses: 3, total allocated memory: 704

Union

The Union operator concatenates the results from the right child operator with the results from the left child operator.

Example 75. Union
Query
PROFILE
MATCH (p:Location)
  RETURN p.name
UNION ALL
MATCH (p:Country)
  RETURN p.name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | `p.name`           |             20 |   11 |       0 |                |                        |           |                     |
| |                +--------------------+----------------+------+---------+----------------+                        |           |                     |
| +Union           |                    |             20 |   11 |       0 |            776 |                    0/0 |     0.171 | Fused in Pipeline 2 |
| |\               +--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Projection    | `p.name`           |             10 |    1 |       0 |                |                        |           |                     |
| | |              +--------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Projection    | p.name AS `p.name` |             10 |    1 |       1 |                |                        |           |                     |
| | |              +--------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Filter        | p:Country          |             10 |    1 |      35 |                |                        |           |                     |
| | |              +--------------------+----------------+------+---------+----------------+                        |           |                     |
| | +AllNodesScan  | p                  |             35 |   35 |      36 |            120 |                    0/0 |     0.127 | Fused in Pipeline 1 |
| |                +--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Projection      | `p.name`           |             10 |   10 |       0 |                |                        |           |                     |
| |                +--------------------+----------------+------+---------+----------------+                        |           |                     |
| +Projection      | p.name AS `p.name` |             10 |   10 |      10 |                |                        |           |                     |
| |                +--------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan | p:Location         |             10 |   10 |      11 |            120 |                    3/0 |     0,171 | Fused in Pipeline 0 |
+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 153, total allocated memory: 984

Unwind

The Unwind operator returns one row per item in a list.

Example 76. Unwind
Query
PROFILE
UNWIND range(1, 5) AS value
RETURN value
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| Operator        | Details                                | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +ProduceResults | value                                  |             10 |    5 |       0 |                        |           |                     |
| |               +----------------------------------------+----------------+------+---------+                        |           |                     |
| +Unwind         | range($autoint_0, $autoint_1) AS value |             10 |    5 |       0 |                    0/0 |     0.000 | Fused in Pipeline 0 |
+-----------------+----------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+

Total database accesses: 0, total allocated memory: 184

Exhaustive Limit

The ExhaustiveLimit operator is just like a normal Limit but will always exhaust the input. Used when combining LIMIT and updates

Example 77. ExhaustiveLimit
Query
PROFILE
MATCH (p:Person)
SET p.seen = true
RETURN p
LIMIT 3
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details       | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | p             |              3 |    3 |       0 |                |                        |           |                     |
| |                +---------------+----------------+------+---------+----------------+                        |           |                     |
| +ExhaustiveLimit | 3             |              3 |    3 |       0 |             32 |                        |           |                     |
| |                +---------------+----------------+------+---------+----------------+                        |           |                     |
| +SetProperty     | p.seen = true |             14 |   14 |      28 |                |                        |           |                     |
| |                +---------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan | p:Person      |             14 |   14 |      35 |            120 |                    5/0 |    41,656 | Fused in Pipeline 0 |
+------------------+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 99, total allocated memory: 200

Optional

The Optional operator is used to solve some OPTIONAL MATCH queries. It will pull data from its source, simply passing it through if any data exists. However, if no data is returned by its source, Optional will yield a single row with all columns set to null.

Example 78. Optional
Query
PROFILE
MATCH (p:Person {name: 'me'})
OPTIONAL MATCH (q:Person {name: 'Lulu'})
RETURN p, q
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator         | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults  | p, q                                                  |              1 |    1 |       0 |                |                    2/0 |     0.079 | In Pipeline 2 |
| |                +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +Apply           |                                                       |              1 |    1 |       0 |                |                    0/0 |     0.096 |               |
| |\               +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| | +Optional      | p                                                     |              1 |    1 |       0 |            768 |                    0/0 |     0.043 | In Pipeline 2 |
| | |              +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| | +NodeIndexSeek | RANGE INDEX q:Person(name) WHERE name = $autostring_1 |              1 |    0 |       1 |           2152 |                    1/0 |     0.098 | In Pipeline 1 |
| |                +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +NodeIndexSeek   | RANGE INDEX p:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            120 |                    0/1 |     0.364 | In Pipeline 0 |
+------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 3, total allocated memory: 3000

Project Endpoints

The ProjectEndpoints operator projects the start and end node of a relationship.

Example 79. ProjectEndpoints
Query
PROFILE
CREATE (n)-[p:KNOWS]->(m)
WITH p AS r
MATCH (u)-[r]->(v)
RETURN u, v
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator            | Details                      | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults     | u, v                         |              1 |    1 |       0 |                |                        |           |                     |
| |                   +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply              |                              |              1 |    1 |       0 |                |                        |           |                     |
| |\                  +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +ProjectEndpoints | (u)-[r]->(v)                 |              1 |    1 |       0 |                |                        |           |                     |
| | |                 +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument         | r                            |              1 |    1 |       0 |           4200 |                    0/0 |     0.248 | Fused in Pipeline 1 |
| |                   +------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Projection         | p AS r                       |              1 |    1 |       0 |                |                        |           |                     |
| |                   +------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Create             | (n), (m), (n)-[p:KNOWS]->(m) |              1 |    1 |       4 |                |                    0/0 |     0.000 | Fused in Pipeline 0 |
+---------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 4, total allocated memory: 4280

Projection

For each incoming row, the Projection operator evaluates a set of expressions and produces a row with the results of the expressions.

Example 80. Projection
Query
PROFILE
RETURN 'hello' AS greeting
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+---------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| Operator        | Details                   | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+---------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +ProduceResults | greeting                  |              1 |    1 |       0 |                        |           |                     |
| |               +---------------------------+----------------+------+---------+                        |           |                     |
| +Projection     | $autostring_0 AS greeting |              1 |    1 |       0 |                    0/0 |     0.000 | Fused in Pipeline 0 |
+-----------------+---------------------------+----------------+------+---------+------------------------+-----------+---------------------+

Total database accesses: 0, total allocated memory: 184

Shortest path

The ShortestPath operator finds one or all shortest paths between two previously matches node variables.

Example 81. ShortestPath
Query
PROFILE
MATCH
  (andy:Person {name: 'Andy'}),
  (mattias:Person {name: 'Mattias'}),
  p = shortestPath((andy)-[*]-(mattias))
RETURN p
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator            | Details                                                     | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+---------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults     | p                                                           |              1 |    1 |       0 |                |                    1/0 |     0.241 |               |
| |                   +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+               |
| +ShortestPath       | p = (andy)-[anon_0*]-(mattias)                              |              1 |    1 |       1 |           1424 |                        |           | In Pipeline 1 |
| |                   +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +MultiNodeIndexSeek | RANGE INDEX andy:Person(name) WHERE name = $autostring_0,   |              1 |    1 |       4 |            120 |                    1/1 |     0.308 | In Pipeline 0 |
|                     | RANGE INDEX mattias:Person(name) WHERE name = $autostring_1 |                |      |         |                |                        |           |               |
+---------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 5, total allocated memory: 1488

Empty Row

The EmptyRow operator returns a single row with no columns.

Example 82. EmptyRow
Query
PROFILE
CYPHER runtime=slotted
FOREACH (value IN [1,2,3] | MERGE (:Person {age: value}))
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+--------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                              | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+--------------------+--------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults    |                                      |              1 |    0 |       0 |                    0/0 |
| |                  +--------------------------------------+----------------+------+---------+------------------------+
| +EmptyResult       |                                      |              1 |    0 |       0 |                    0/0 |
| |                  +--------------------------------------+----------------+------+---------+------------------------+
| +Foreach           | value IN [1, 2, 3]                   |              1 |    1 |       0 |                    0/0 |
| |\                 +--------------------------------------+----------------+------+---------+------------------------+
| | +Merge           | CREATE (anon_0:Person {age: value})  |              1 |    3 |       9 |                    0/0 |
| | |                +--------------------------------------+----------------+------+---------+------------------------+
| | +Filter          | anon_0.age = value                   |              1 |    0 |     184 |                    2/0 |
| | |                +--------------------------------------+----------------+------+---------+------------------------+
| | +NodeByLabelScan | anon_0:Person                        |             35 |  108 |     111 |                    3/0 |
| |                  +--------------------------------------+----------------+------+---------+------------------------+
| +EmptyRow          |                                      |              1 |    1 |       0 |                    0/0 |
+--------------------+--------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 304, total allocated memory: 64

Procedure Call

The ProcedureCall operator indicates an invocation to a procedure.

Example 83. ProcedureCall
Query
PROFILE
CALL db.labels() YIELD label
RETURN *
ORDER BY label
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| Operator        | Details                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline            |
+-----------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProduceResults | label                             |             10 |    4 |       0 |                |                    0/0 |     0.091 |            |                     |
| |               +-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+            |                     |
| +Sort           | label ASC                         |             10 |    4 |       0 |            536 |                    0/0 |     0.178 | label ASC  | In Pipeline 1       |
| |               +-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProcedureCall  | db.labels() :: (label :: STRING?) |             10 |    4 |         |                |                        |           |            | Fused in Pipeline 0 |
+-----------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+

Total database accesses: ?, total allocated memory: 600

Cache Properties

The CacheProperties operator reads nodes and relationship properties and caches them in the current row. Future accesses to these properties can avoid reading from the store which will speed up the query. In the plan below we will cache l.name before Expand(All) where there are fewer rows.

Example 84. CacheProperties
Query
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN
  l.name AS location,
  p.name AS name
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+-------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details                                   | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+-------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  | location, name                            |             15 |   15 |       0 |                |                        |           |                     |
| |                +-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Projection      | cache[l.name] AS location, p.name AS name |             15 |   15 |      30 |                |                        |           |                     |
| |                +-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter          | p:Person                                  |             15 |   15 |      30 |                |                        |           |                     |
| |                +-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)     | (l)<-[anon_0:WORKS_IN]-(p)                |             15 |   15 |      16 |                |                        |           |                     |
| |                +-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +CacheProperties | cache[l.name]                             |             10 |   10 |      10 |                |                        |           |                     |
| |                +-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan | l:Location                                |             10 |   10 |      35 |            120 |                    5/0 |     0,422 | Fused in Pipeline 0 |
+------------------+-------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 157, total allocated memory: 200

Create (nodes and relationships)

The Create operator is used to create nodes and relationships.

Example 85. Create
Query
PROFILE
CREATE
  (max:Person {name: 'Max'}),
  (chris:Person {name: 'Chris'})
CREATE (max)-[:FRIENDS_WITH]->(chris)
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| Operator        | Details                                                                   | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +ProduceResults |                                                                           |              1 |    0 |       0 |                        |           |                     |
| |               +---------------------------------------------------------------------------+----------------+------+---------+                        |           |                     |
| +EmptyResult    |                                                                           |              1 |    0 |       0 |                        |           |                     |
| |               +---------------------------------------------------------------------------+----------------+------+---------+                        |           |                     |
| +Create         | (max:Person {name: $autostring_0}), (chris:Person {name: $autostring_1}), |              1 |    1 |       7 |                    0/0 |     0.000 | Fused in Pipeline 0 |
|                 | (max)-[anon_0:FRIENDS_WITH]->(chris)                                      |                |      |         |                        |           |                     |
+-----------------+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+

Total database accesses: 7, total allocated memory: 184

Delete (nodes and relationships)

The Delete operator is used to delete a node or a relationship.

Example 86. Delete
Query
PROFILE
MATCH (me:Person {name: 'me'})-[w:WORKS_IN {duration: 190}]->(london:Location {name: 'London'})
DELETE w
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+-----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details                                                                     | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+-----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |                                                                             |              0 |    0 |       0 |                |                        |           |                     |
| |               +-----------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |                                                                             |              0 |    0 |       0 |                |                        |           |                     |
| |               +-----------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Delete         | w                                                                           |              0 |    1 |       1 |                |                        |           |                     |
| |               +-----------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Eager          | read/delete conflict for variable: w                                        |              0 |    1 |       0 |            112 |                    1/0 |     0.247 | Fused in Pipeline 1 |
| |               +-----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Filter         | london.name = $autostring_2 AND w.duration = $autoint_1 AND london:Location |              0 |    1 |       5 |                |                        |           |                     |
| |               +-----------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)    | (me)-[w:WORKS_IN]->(london)                                                 |              1 |    1 |       5 |                |                        |           |                     |
| |               +-----------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek  | RANGE INDEX me:Person(name) WHERE name = $autostring_0                      |              1 |    1 |       2 |            120 |                    4/1 |     0.447 | Fused in Pipeline 0 |
+-----------------+-----------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 216

Detach Delete

The DetachDelete operator is used in all queries containing the DETACH DELETE clause, when deleting nodes and their relationships.

Example 87. DetachDelete
Query
PROFILE
MATCH (p:Person)
DETACH DELETE p
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+------------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Details  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |          |             14 |    0 |       0 |                |                        |           |                     |
| |                +----------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult     |          |             14 |    0 |       0 |                |                        |           |                     |
| |                +----------+----------------+------+---------+----------------+                        |           |                     |
| +DetachDelete    | p        |             14 |   14 |      41 |                |                        |           |                     |
| |                +----------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan | p:Person |             14 |   14 |      35 |            120 |                   21/0 |    12,439 | Fused in Pipeline 0 |
+------------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 112, total allocated memory: 200

Set Labels

The SetLabels operator is used when setting labels on a node.

Example 88. SetLabels
Query
PROFILE
MATCH (n)
SET n:Person
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |          |             35 |    0 |       0 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |          |             35 |    0 |       0 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +SetLabels      | n:Person |             35 |   35 |      22 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan   | n        |             35 |   35 |      36 |            120 |                    3/0 |     0.873 | Fused in Pipeline 0 |
+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 58, total allocated memory: 184

Remove Labels

The RemoveLabels operator is used when deleting labels from a node.

Example 89. RemoveLabels
Query
PROFILE
MATCH (n)
REMOVE n:Person
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details  | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |          |             35 |    0 |       0 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |          |             35 |    0 |       0 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +RemoveLabels   | n:Person |             35 |   35 |      15 |                |                        |           |                     |
| |               +----------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan   | n        |             35 |   35 |      36 |            120 |                    3/0 |     0.765 | Fused in Pipeline 0 |
+-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 51, total allocated memory: 184

Set Node Properties From Map

The SetNodePropertiesFromMap operator is used when setting properties from a map on a node.

Example 90. SetNodePropertiesFromMap
Query
PROFILE
MATCH (n)
SET n = {weekday: 'Monday', meal: 'Lunch'}
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                  | Details                                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults           |                                                   |             35 |    0 |       0 |                |                        |           |                     |
| |                         +---------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult              |                                                   |             35 |    0 |       0 |                |                        |           |                     |
| |                         +---------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +SetNodePropertiesFromMap | n = {weekday: $autostring_0, meal: $autostring_1} |             35 |   35 |     105 |                |                        |           |                     |
| |                         +---------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan             | n                                                 |             35 |   35 |      36 |            120 |                    5/0 |     3.954 | Fused in Pipeline 0 |
+---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 141, total allocated memory: 184

Set Relationship Properties From Map

The SetRelationshipPropertiesFromMap operator is used when setting properties from a map on a relationship.

Example 91. SetRelationshipPropertiesFromMap
Query
PROFILE
MATCH (n)-[r]->(m)
SET r = {weight: 5, unit: 'kg'}
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                          | Details                                       | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                   |                                               |             28 |    0 |       0 |                |                        |           |                     |
| |                                 +-----------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult                      |                                               |             28 |    0 |       0 |                |                        |           |                     |
| |                                 +-----------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +SetRelationshipPropertiesFromMap | r = {weight: $autoint_0, unit: $autostring_1} |             28 |   28 |      84 |                |                        |           |                     |
| |                                 +-----------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DirectedAllRelationshipsScan     | (n)-[r]->(m)                                  |             28 |   28 |      28 |            120 |                    5/0 |    15.278 | Fused in Pipeline 0 |
+-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 112, total allocated memory: 184

Set Property

The SetProperty operator is used when setting a property on a node or relationship.

Example 92. SetProperty
Query
PROFILE
MATCH (n)
SET n.checked = true
Query Plan
Planner COST

Runtime PIPELINED

Runtime version 5.4

Batch size 128

+-----------------+------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Details          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |                  |             35 |    0 |       0 |                |                        |           |                     |
| |               +------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |                  |             35 |    0 |       0 |                |                        |           |                     |
| |               +------------------+----------------+------+---------+----------------+                        |           |                     |
| +SetProperty    | n.checked = true |             35 |   35 |      70 |                |                        |           |                     |
| |               +------------------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan   | n                |             35 |   35 |      36 |            120 |                    3/0 |     0.753 | Fused in Pipeline 0 |
+-----------------+------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 106, total allocated memory: 184

Create Constraint

The CreateConstraint operator creates a constraint.

This constraint can have any of the available constraint types:

  • Property uniqueness constraints

  • Property existence constraints Enterprise Edition

  • Node key constraints Enterprise Edition

The following query will create a property uniqueness constraint with the name uniqueness on the name property of nodes with the Country label.

Example 93. CreateConstraint
Query
PROFILE
CREATE CONSTRAINT uniqueness
FOR (c:Country) REQUIRE c.name is UNIQUE
Query Plan
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.4

+-------------------+------------------------------------------------------------------+
| Operator          | Details                                                          |
+-------------------+------------------------------------------------------------------+
| +CreateConstraint | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE |
+-------------------+------------------------------------------------------------------+

Total database accesses: ?

Do Nothing If Exists (constraint)

To not get an error creating the same constraint twice, we use the DoNothingIfExists operator for constraints. This will make sure no other constraint with the given name or another constraint of the same type and schema already exists before the specific CreateConstraint operator creates the constraint. If it finds a constraint with the given name or with the same type and schema it will stop the execution and no new constraint is created. The following query will create a property uniqueness constraint with the name uniqueness on the name property of nodes with the Country label only if no constraint named uniqueness or property uniqueness constraint on (:Country {name}) already exists.

Example 94. DoNothingIfExists(CONSTRAINT)
Query
PROFILE
CREATE CONSTRAINT uniqueness IF NOT EXISTS
FOR (c:Country) REQUIRE c.name is UNIQUE
Query Plan
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.4

+--------------------------------+------------------------------------------------------------------+
| Operator                       | Details                                                          |
+--------------------------------+------------------------------------------------------------------+
| +CreateConstraint              | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE |
| |                              +------------------------------------------------------------------+
| +DoNothingIfExists(CONSTRAINT) | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE |
+--------------------------------+------------------------------------------------------------------+

Total database accesses: ?

Drop Constraint

The DropConstraint operator removes a constraint using the name of the constraint, no matter the type.

Example 95. DropConstraint
Query
PROFILE
DROP CONSTRAINT name
Query Plan
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.4

+-----------------+-----------------+
| Operator        | Details         |
+-----------------+-----------------+
| +DropConstraint | CONSTRAINT name |
+-----------------+-----------------+

Total database accesses: ?

Show Constraints

The ShowConstraints operator lists constraints. It may include filtering on constraint type and can have either default or full output.

Example 96. ShowConstraints
Query
PROFILE
SHOW CONSTRAINTS
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+
| Operator         | Details                                                           | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults  | id, name, type, entityType, labelsOrTypes, properties, ownedIndex |             10 |    3 |       0 |                    0/0 |
| |                +-------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ShowConstraints | allConstraints, defaultColumns                                    |             10 |    3 |       2 |                    0/0 |
+------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 2, total allocated memory: 64

Create Index

The CreateIndex operator creates an index.

This index can either be a fulltext, point, range, text, or lookup index.

Example 97. CreateIndex

The following query will create an index with the name my_index on the name property of nodes with the Country label.

Query
PROFILE
CREATE INDEX my_index
FOR (c:Country) ON (c.name)
Query Plan
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.4

+--------------+-----------------------------------------------+
| Operator     | Details                                       |
+--------------+-----------------------------------------------+
| +CreateIndex | RANGE INDEX my_index FOR (:Country) ON (name) |
+--------------+-----------------------------------------------+

Total database accesses: ?

Do Nothing If Exits (index)

To not get an error creating the same index twice, we use the DoNothingIfExists operator for indexes. This will make sure no other index with the given name or schema already exists before the CreateIndex operator creates an index. If it finds an index with the given name or schema it will stop the execution and no new index is created. The following query will create an index with the name my_index on the since property of relationships with the KNOWS relationship type only if no such index already exists.

Example 98. DoNothingIfExists(INDEX)
Query
PROFILE
CREATE INDEX my_index IF NOT EXISTS
FOR ()-[k:KNOWS]-() ON (k.since)
Query Plan
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.4

+---------------------------+----------------------------------------------------+
| Operator                  | Details                                            |
+---------------------------+----------------------------------------------------+
| +CreateIndex              | RANGE INDEX my_index FOR ()-[:KNOWS]-() ON (since) |
| |                         +----------------------------------------------------+
| +DoNothingIfExists(INDEX) | RANGE INDEX my_index FOR ()-[:KNOWS]-() ON (since) |
+---------------------------+----------------------------------------------------+

Total database accesses: ?

Drop Index

The DropIndex operator removes an index using the name of the index.

Example 99. DropIndex
Query
PROFILE
DROP INDEX my_index
Query Plan
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.4

+------------+---------------+
| Operator   | Details       |
+------------+---------------+
| +DropIndex | INDEX my_index|
+------------+---------------+

Total database accesses: ?

Show Indexes

The ShowIndexes operator lists indexes. It may include filtering on index type and can have either default or full output.

Example 100. ShowIndexes
Query
PROFILE
SHOW INDEXES
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                                                                                         | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults | id, name, state, populationPercent, type, entityType, labelsOrTypes, properties, indexProvider, |             10 |    9 |       0 |                    0/0 |
| |               | owningConstraint                                                                                |                |      |         |                        |
| |               +-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ShowIndexes    | allIndexes, defaultColumns                                                                      |             10 |    9 |       2 |                    0/0 |
+-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 2, total allocated memory: 64

Show Functions

The ShowFunctions operator lists functions. It may include filtering on built-in vs user-defined functions as well as if a given user can execute the function. The output can either be default or full output.

Example 101. ShowFunctions
Query
PROFILE
SHOW FUNCTIONS
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                                             | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults | name, category, description                         |             10 |  147 |       0 |                    0/0 |
| |               +-----------------------------------------------------+----------------+------+---------+------------------------+
| +ShowFunctions  | allFunctions, functionsForUser(all), defaultColumns |             10 |  147 |       0 |                    0/0 |
+-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 0, total allocated memory: 64

Show Procedures

The ShowProcedures operator lists procedures. It may include filtering on whether a given user can execute the procedure and can have either default or full output.

Example 102. ShowProcedures
Query
PROFILE
SHOW PROCEDURES
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-----------------+----------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                                | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+----------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults | name, description, mode, worksOnSystem |             10 |   55 |       0 |                    0/0 |
| |               +----------------------------------------+----------------+------+---------+------------------------+
| +ShowProcedures | proceduresForUser(all), defaultColumns |             10 |   55 |       0 |                    0/0 |
+-----------------+----------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 0, total allocated memory: 64

Show Transactions

The ShowTransactions operator lists transactions. It may include filtering on given ids and can have either default or full output.

Example 103. ShowTransactions
Query
PROFILE
SHOW TRANSACTIONS
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| Operator          | Details                                                                                       | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults   | database, transactionId, currentQueryId, connectionId, clientAddress, username, currentQuery, |             10 |    1 |       0 |                    0/0 |
| |                 | startTime, status, elapsedTime                                                                |                |      |         |                        |
| |                 +-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ShowTransactions | defaultColumns, allTransactions                                                               |             10 |    1 |       0 |                    0/0 |
+-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 0, total allocated memory: 64

Terminate Transactions

The TerminateTransactions operator terminates transactions by ID.

Example 104. TerminateTransactions
Query
PROFILE
TERMINATE TRANSACTIONS 'database-transaction-123'
Query Plan
Planner COST

Runtime SLOTTED

Runtime version 5.4

+------------------------+--------------------------------------------------------+----------------+------+---------+------------------------+
| Operator               | Details                                                | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+------------------------+--------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults        | transactionId, username, message                       |             10 |    1 |       0 |                    0/0 |
| |                      +--------------------------------------------------------+----------------+------+---------+------------------------+
| +TerminateTransactions | defaultColumns, transactions(database-transaction-123) |             10 |    1 |       0 |                    0/0 |
+------------------------+--------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 0, total allocated memory: 64