运算符详解

此页面包含 Cypher® 中所有可用运算符的详细信息和示例查询。这些运算符按其特性的相似性分组。

某些运算符仅由 Cypher 可以从中选择的 运行时 的子集使用。如果是这种情况,示例查询将以选择其中一个运行时的选项为前缀。

所有节点扫描

AllNodesScan 运算符从节点存储中读取所有节点。包含节点的变量在参数中显示。任何使用此运算符的查询都可能在非平凡的数据库上遇到性能问题。

示例 1. AllNodesScan
查询
PROFILE
MATCH (n)
RETURN n
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区所有节点扫描

PartitionedAllNodesScanAllNodesScan 运算符的变体,由 并行运行时 使用。它允许将存储分区成不同的段,每个段可以并行独立扫描。

示例 2. PartitionedAllNodesScan
查询
CYPHER runtime=parallel
PROFILE
MATCH (n)
RETURN n
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+--------------------------+----+---------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                 | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+--------------------------+----+---------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults          |  0 | n       |             35 |   35 |      71 |                    2/0 |     6.470 | In Pipeline 1 |
| |                        +----+---------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedAllNodesScan |  1 | n       |             35 |   35 |      35 |                    3/0 |     1.491 | In Pipeline 0 |
+--------------------------+----+---------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 106

定向关系索引扫描

DirectedRelationshipIndexScan 运算符检查索引中存储的所有值,返回具有特定关系类型和指定属性的所有关系及其起始节点和结束节点。

示例 3. DirectedRelationshipIndexScan
查询
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区定向关系索引扫描

PartitionedDirectedRelationshipIndexScanDirectedRelationshipIndexScan 运算符的变体,由 并行运行时 使用。它允许将索引分区成不同的段,每个段可以并行独立扫描。

示例 4. PartitionedDirectedRelationshipIndexScan
查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+-------------------------------------------+----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                  | Id | Details                                                                    | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-------------------------------------------+----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                           |  0 | r                                                                          |             15 |   15 |      70 |                    1/0 |     2.865 | In Pipeline 1 |
| |                                         +----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedDirectedRelationshipIndexScan |  1 | RANGE INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title IS NOT NULL |             15 |   15 |      16 |                    2/0 |     0.527 | In Pipeline 0 |
+-------------------------------------------+----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 86

非定向关系索引扫描

UndirectedRelationshipIndexScan 运算符检查索引中存储的所有值,返回具有特定关系类型和指定属性的所有关系及其起始节点和结束节点。

示例 5. UndirectedRelationshipIndexScan
查询
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区非定向关系索引扫描

PartitionedUndirectedRelationshipIndexScanUndirectedRelationshipIndexScan 运算符的变体,由 并行运行时 使用。它允许将索引分区成不同的段,每个段可以并行独立扫描。

示例 6. PartitionedUndirectedRelationshipIndexScan
查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+---------------------------------------------+----+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                    | Id | Details                                                                   | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+---------------------------------------------+----+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                             |  0 | r                                                                         |             30 |   30 |     140 |                    1/0 |     3.088 | In Pipeline 1 |
| |                                           +----+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedUndirectedRelationshipIndexScan |  1 | RANGE INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title IS NOT NULL |             30 |   30 |      16 |                    2/0 |     0.572 | In Pipeline 0 |
+---------------------------------------------+----+---------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 156

定向关系索引查找

DirectedRelationshipIndexSeek 运算符使用索引查找来查找关系及其起始节点和结束节点。关系变量和使用的索引在运算符的参数中显示。

示例 7. DirectedRelationshipIndexSeek
查询
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区定向关系索引查找

PartitionedDirectedRelationshipIndexSeekDirectedRelationshipIndexSeek 运算符的变体,由 并行运行时 使用。它允许将索引分区成不同的段,每个段可以并行独立扫描。

示例 8. PartitionedDirectedRelationshipIndexSeek
查询
CYPHER runtime=parallel
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+-------------------------------------------+----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                  | Id | Details                                                                           | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-------------------------------------------+----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                           |  0 | candidate                                                                         |              2 |    1 |       2 |                    2/0 |     0.284 | In Pipeline 1 |
| |                                         +----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedDirectedRelationshipIndexSeek |  1 | RANGE INDEX (candidate)-[r:WORKS_IN(title)]->(anon_0) WHERE title = $autostring_0 |              2 |    1 |       2 |                    2/0 |     0.148 | In Pipeline 0 |
+-------------------------------------------+----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 4

非定向关系索引查找

UndirectedRelationshipIndexSeek 运算符使用索引查找来查找关系及其起始节点和结束节点。关系变量和使用的索引在运算符的参数中显示。

示例 9. UndirectedRelationshipIndexSeek
查询
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区非定向关系索引查找

PartitionedUndirectedRelationshipIndexSeek 运算符使用索引查找关系及其起始节点和结束节点。关系变量和使用的索引在运算符的参数中显示。

示例 10. PartitionedUndirectedRelationshipIndexSeek
查询
CYPHER runtime=parallel
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+---------------------------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                    | Id | Details                                                                          | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+---------------------------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                             |  0 | candidate                                                                        |              4 |    2 |       4 |                    2/0 |     0.333 | In Pipeline 1 |
| |                                           +----+----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedUndirectedRelationshipIndexSeek |  1 | RANGE INDEX (candidate)-[r:WORKS_IN(title)]-(anon_0) WHERE title = $autostring_0 |              4 |    2 |       2 |                    2/0 |     0.151 | In Pipeline 0 |
+---------------------------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 6

通过元素 ID 查找定向关系

DirectedRelationshipByElementIdSeek 运算符通过元素 ID(使用函数 elementId() 指定)从关系存储中读取一个或多个关系,并生成关系以及关系的源节点和目标节点。

示例 11. DirectedRelationshipByElementIdSeek
查询
PROFILE
MATCH (n1)-[r]->()
WHERE elementId(r) = 0
RETURN r, n1
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+--------------------------------------+----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator                             | Id | Details                                            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+--------------------------------------+----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults                      |  0 | r, n1                                              |              1 |    0 |       0 |              0 |                    0/0 |     0.314 |               |
| |                                    +----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+               |
| +DirectedRelationshipByElementIdSeek |  1 | (n1)-[r]->(anon_0) WHERE elementId(r) = $autoint_0 |              1 |    0 |       0 |            248 |                    0/0 |     2.337 | In Pipeline 0 |
+--------------------------------------+----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 0, total allocated memory: 312

通过 ID 查找定向关系

DirectedRelationshipByIdSeek 运算符通过 ID 从关系存储中读取一个或多个关系,并生成关系以及关系的源节点和目标节点。

示例 12. DirectedRelationshipByIdSeek
查询
PROFILE
MATCH (n1)-[r]->()
WHERE id(r) = 0
RETURN r, n1
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

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

Total database accesses: 8, total allocated memory: 312

通过元素 ID 查找无向关系

UndirectedRelationshipByElementIdSeek 运算符通过元素 ID(使用函数 elementId() 指定)从关系存储中读取一个或多个关系。由于方向未指定,因此每个关系都会生成两行,这是交替使用起始节点和结束节点的组合的结果。

示例 13. UndirectedRelationshipByElementIdSeek
查询
PROFILE
MATCH (n1)-[r]-()
WHERE elementId(r) = 1
RETURN r, n1
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

通过 ID 查找无向关系

UndirectedRelationshipByIdSeek 运算符通过 ID(使用函数 Id() 指定)从关系存储中读取一个或多个关系。由于方向未指定,因此每个关系都会生成两行,这是交替使用起始节点和结束节点的组合的结果。

示例 14. UndirectedRelationshipByIdSeek
查询
PROFILE
MATCH (n1)-[r]-()
WHERE id(r) = 1
RETURN r, n1
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+---------------------------------+----+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                        | Id | Details                                    | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------------------+----+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults                 |  0 | r, n1                                      |              2 |    2 |      14 |              0 |                        |           |                     |
| |                               +----+--------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +UndirectedRelationshipByIdSeek |  1 | (n1)-[r]-(anon_0) WHERE id(r) = $autoint_0 |              2 |    2 |       1 |            248 |                    3/0 |     1.005 | Fused in Pipeline 0 |
+---------------------------------+----+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 312

定向关系索引包含扫描

DirectedRelationshipIndexContainsScan 运算符检查索引中存储的所有值,搜索包含特定 STRING 的条目;例如,在包含 CONTAINS 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但它仍然比使用 DirectedRelationshipTypeScan 的类型扫描和属性存储过滤器产生的间接寻址更快。

示例 15. DirectedRelationshipIndexContainsScan
查询
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title CONTAINS 'senior'
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

无向关系索引包含扫描

UndirectedRelationshipIndexContainsScan 运算符检查索引中存储的所有值,搜索包含特定 STRING 的条目;例如,在包含 CONTAINS 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但它仍然比使用 DirectedRelationshipTypeScan 的类型扫描和属性存储过滤器产生的间接寻址更快。

示例 16. UndirectedRelationshipIndexContainsScan
查询
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title CONTAINS 'senior'
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

定向关系索引以…结尾扫描

DirectedRelationshipIndexEndsWithScan 运算符检查索引中存储的所有值,搜索以特定 STRING 结尾的条目;例如,在包含 ENDS WITH 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但它仍然比使用 NodeByLabelScan 的标签扫描和属性存储过滤器产生的间接寻址更快。

示例 17. DirectedRelationshipIndexEndsWithScan
查询
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title ENDS WITH 'developer'
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

无向关系索引以…结尾扫描

UndirectedRelationshipIndexEndsWithScan 运算符检查索引中存储的所有值,搜索以特定 STRING 结尾的条目;例如,在包含 ENDS WITH 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但它仍然比使用 NodeByLabelScan 的标签扫描和属性存储过滤器产生的间接寻址更快。

示例 18. UndirectedRelationshipIndexEndsWithScan
查询
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title ENDS WITH 'developer'
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

定向关系索引按范围查找

DirectedRelationshipIndexSeekByRange 运算符使用索引查找关系及其起始节点和结束节点,其中属性的值与给定的前缀 STRING 匹配。DirectedRelationshipIndexSeekByRange 可用于 STARTS WITH 和比较运算符(如 <><=>=)。

示例 19. DirectedRelationshipIndexSeekByRange
查询
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]->(location)
WHERE r.duration > 100
RETURN candidate
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区定向关系索引按范围查找

PartitionedDirectedRelationshipIndexSeekByRangeDirectedRelationshipIndexSeekByRange 运算符的变体,由 并行运行时 使用。它允许将索引划分为不同的段,其中每个段可以独立并行扫描。

示例 20. PartitionedDirectedRelationshipIndexSeekByRange
查询
CYPHER runtime=parallel
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]->(location)
WHERE r.duration > 100
RETURN candidate
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+--------------------------------------------------+----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| Operator                                         | Id | Details                                                                                | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------------------------------------+----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +ProduceResults                                  |  0 | candidate                                                                              |              4 |   15 |      30 |                    1/0 |     1.031 | In Pipeline 1       |
| |                                                +----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +Filter                                          |  1 | candidate:Person                                                                       |              4 |   15 |      30 |                        |           |                     |
| |                                                +----+----------------------------------------------------------------------------------------+----------------+------+---------+                        |           |                     |
| +PartitionedDirectedRelationshipIndexSeekByRange |  2 | RANGE INDEX (candidate)-[r:WORKS_IN(duration)]->(location) WHERE duration > $autoint_0 |              4 |   15 |      16 |                    3/0 |     0.203 | Fused in Pipeline 0 |
+--------------------------------------------------+----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+

Total database accesses: 76

无向关系索引按范围查找

UndirectedRelationshipIndexSeekByRange 运算符使用索引查找关系及其起始节点和结束节点,其中属性的值与给定的前缀 STRING 匹配。UndirectedRelationshipIndexSeekByRange 可用于 STARTS WITH 和比较运算符(如 <><=>=)。

示例 21. UndirectedRelationshipIndexSeekByRange
查询
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]-(location)
WHERE r.duration > 100
RETURN candidate
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区无向关系索引按范围查找

PartitionedUndirectedRelationshipIndexSeekByRangeUndirectedRelationshipIndexSeekByRange 运算符的变体,由 并行运行时 使用。它允许将存储划分为不同的段,其中每个段可以独立并行扫描。

示例 22. PartitionedUndirectedRelationshipIndexSeekByRange
查询
CYPHER runtime=parallel
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]-(location)
WHERE r.duration > 100
RETURN candidate
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+----------------------------------------------------+----+---------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| Operator                                           | Id | Details                                                                               | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+----------------------------------------------------+----+---------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +ProduceResults                                    |  0 | candidate                                                                             |              5 |   15 |      30 |                    1/0 |     0.918 | In Pipeline 1       |
| |                                                  +----+---------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+
| +Filter                                            |  1 | candidate:Person                                                                      |              5 |   15 |      60 |                        |           |                     |
| |                                                  +----+---------------------------------------------------------------------------------------+----------------+------+---------+                        |           |                     |
| +PartitionedUndirectedRelationshipIndexSeekByRange |  2 | RANGE INDEX (candidate)-[r:WORKS_IN(duration)]-(location) WHERE duration > $autoint_0 |              8 |   30 |      16 |                    3/0 |     0.413 | Fused in Pipeline 0 |
+----------------------------------------------------+----+---------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+

Total database accesses: 106

联合节点按标签扫描

UnionNodeByLabelsScan 运算符从节点标签索引中获取具有至少一个提供标签的所有节点。

查询
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区联合节点按标签扫描

PartitionedUnionNodeByLabelsScanUnionNodeByLabelsScan 运算符的变体,由 并行运行时 使用。它允许将索引划分为不同的段,其中每个段可以独立并行扫描。

查询
CYPHER runtime=parallel
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+-----------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                          | Id | Details                            | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-----------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                   |  0 | countryOrLocation                  |             17 |   11 |      22 |                    2/0 |     1.548 | In Pipeline 1 |
| |                                 +----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedUnionNodeByLabelsScan |  1 | countryOrLocation:Country|Location |             17 |   11 |      13 |                    2/0 |     1.976 | In Pipeline 0 |
+-----------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 35

交集节点按标签扫描

IntersectionNodeByLabelsScan 运算符从节点标签索引中获取具有所有提供标签的所有节点。

查询
PROFILE
MATCH (countryAndLocation:Country&Location)
RETURN countryAndLocation
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128


+-------------------------------+----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                      | Id | Details                             | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------------------+----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults               |  0 | countryAndLocation                  |             10 |    0 |       0 |                |                        |           |                     |
| |                             +----+-------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +IntersectionNodeByLabelsScan |  1 | countryAndLocation:Country&Location |             10 |    0 |       0 |            120 |                    0/0 |     1.011 | Fused in Pipeline 0 |
+-------------------------------+----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 184

分区交集节点按标签扫描

PartitionedIntersectionNodeByLabelsScanIntersectionNodeByLabelsScan 运算符的变体,由 并行运行时 使用。它允许将索引划分为不同的段,其中每个段可以独立并行扫描。

查询
CYPHER runtime=parallel
PROFILE
MATCH (countryAndLocation:Country&Location)
RETURN countryAndLocation
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128


------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                 | Id | Details                             | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                          |  0 | countryAndLocation                  |              3 |    0 |       0 |                    0/0 |     0.018 | In Pipeline 1 |
| |                                        +----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedIntersectionNodeByLabelsScan |  1 | countryAndLocation:Country&Location |              3 |    0 |      13 |                    2/0 |     0.770 | In Pipeline 0 |
+------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 13

差集节点按标签扫描

SubtractionNodeByLabelsScan 运算符从节点标签索引中获取具有所有第一组提供标签且没有第二组提供标签的所有节点。在下面的示例中,SubtractionNodeByLabelsScan 将检索具有 Location 标签但没有 Country 标签的所有节点。

查询
PROFILE
MATCH (locationNotCountry:Location&!Country)
RETURN locationNotCountry
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------------------+----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator                     | Id | Details                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------------------+----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults              |  0 | locationNotCountry                   |              7 |   10 |       0 |              0 |                        |           |                     |
| |                            +----+--------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +SubtractionNodeByLabelsScan |  1 | locationNotCountry:Location&!Country |              7 |   10 |      13 |            248 |                    2/0 |     3.081 | Fused in Pipeline 0 |
+------------------------------+----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 312

分区差集节点按标签扫描

PartitionedSubtractionNodeByLabelsScanSubtractionNodeByLabelsScan 运算符的变体,由 并行运行时 使用。它允许将索引划分为不同的段,其中每个段可以独立并行扫描。

查询
CYPHER runtime=parallel
PROFILE
MATCH (locationNotCountry:Location&!Country)
RETURN locationNotCountry
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+-----------------------------------------+----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator                                | Id | Details                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-----------------------------------------+----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults                         |  0 | locationNotCountry                   |              7 |   10 |       0 |            136 |                    0/0 |     0.614 | In Pipeline 1 |
| |                                       +----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +PartitionedSubtractionNodeByLabelsScan |  1 | locationNotCountry:Location&!Country |              7 |   10 |      13 |            120 |                    2/0 |     5.173 | In Pipeline 0 |
+-----------------------------------------+----+--------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 13, total allocated memory: 262144

定向所有关系扫描

DirectedAllRelationshipsScan 运算符获取数据库中所有关系及其起始节点和结束节点。

查询
PROFILE
MATCH ()-[r]->() RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区定向所有关系扫描

PartitionedDirectedAllRelationshipsScanDirectedAllRelationshipsScan 运算符的变体,由 并行运行时 使用。它允许将存储划分为不同的段,其中每个段可以独立并行扫描。

查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[r]->() RETURN r
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

| Operator                                 | Id | Details                | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+------------------------------------------+----+------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                          |  0 | r                      |             28 |   28 |      83 |                    2/0 |     3.872 | In Pipeline 1 |
| |                                        +----+------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedDirectedAllRelationshipsScan |  1 | (anon_0)-[r]->(anon_1) |             28 |   28 |      28 |                    3/0 |     1.954 | In Pipeline 0 |
+------------------------------------------+----+------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 111

无向所有关系扫描

UndirectedAllRelationshipsScan 运算符获取数据库中所有关系及其起始节点和结束节点。

查询
PROFILE
MATCH ()-[r]-() RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区无向所有关系扫描

PartitionedUndirectedAllRelationshipsScanUndirectedAllRelationshipsScan 运算符的变体,由 并行运行时 使用。它允许将存储划分为不同的段,其中每个段可以独立并行扫描。

查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[r]-() RETURN r
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+--------------------------------------------+----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                   | Id | Details               | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+--------------------------------------------+----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                            |  0 | r                     |             56 |   56 |     166 |                    2/0 |     4.905 | In Pipeline 1 |
| |                                          +----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedUndirectedAllRelationshipsScan |  1 | (anon_0)-[r]-(anon_1) |             56 |   56 |      28 |                    9/0 |     1.573 | In Pipeline 0 |
+--------------------------------------------+----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 194

定向关系类型扫描

DirectedRelationshipTypeScan 运算符从关系类型索引中获取具有特定类型的所有关系及其起始节点和结束节点。

示例 23. DirectedRelationshipTypeScan
查询
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区定向关系类型扫描

PartitionedDirectedRelationshipTypeScanDirectedRelationshipTypeScan 运算符的变体,由 并行运行时 使用。它允许将索引划分为不同的段,其中每个段可以独立并行扫描。

示例 24. PartitionedDirectedRelationshipTypeScan
查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

++------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
 | Operator                                 | Id | Details                             | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
 +------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
 | +ProduceResults                          |  0 | r                                   |             12 |   12 |      12 |                    0/0 |     0.560 | In Pipeline 1 |
 | |                                        +----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
 | +PartitionedDirectedRelationshipTypeScan |  1 | (anon_0)-[r:FRIENDS_WITH]->(anon_1) |             12 |   12 |      13 |                    2/0 |     0.167 | In Pipeline 0 |
 +------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

 Total database accesses: 25

无向关系类型扫描

UndirectedRelationshipTypeScan 运算符从关系类型索引中获取具有特定类型的所有关系及其起始节点和结束节点。

查询
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区无向关系类型扫描

PartitionedUndirectedRelationshipTypeScanUndirectedRelationshipTypeScan 运算符的变体,由 并行运行时 使用。它允许将索引划分为不同的段,其中每个段可以独立并行扫描。

查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+--------------------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                   | Id | Details                            | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+--------------------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                            |  0 | r                                  |             24 |   24 |      24 |                    1/0 |     1.466 | In Pipeline 1 |
| |                                          +----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedUndirectedRelationshipTypeScan |  1 | (anon_0)-[r:FRIENDS_WITH]-(anon_1) |             24 |   24 |      13 |                    2/0 |     0.171 | In Pipeline 0 |
+--------------------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 37

定向联合关系类型扫描

DirectedUnionRelationshipTypesScan 运算符从关系类型索引中获取具有至少一个提供类型的所有关系及其起始节点和结束节点。

随着块存储格式成为默认值,该运算符将不再用于生成计划。有关可用的各种存储格式的详细信息,请参阅 操作手册 → 存储格式
示例 25. DirectedUnionRelationshipTypesScan
查询
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区定向联合关系类型扫描

PartitionedDirectedUnionRelationshipTypeScanDirectedUnionRelationshipTypesScan 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立地并行扫描。

随着块存储格式成为默认值,该运算符将不再用于生成计划。有关可用的各种存储格式的详细信息,请参阅 操作手册 → 存储格式
示例 26. PartitionedDirectedUnionRelationshipTypesScan
查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+------------------------------------------------+----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                       | Id | Details                                           | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+------------------------------------------------+----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                                |  0 | friendOrFoe                                       |             15 |   12 |      12 |                    0/0 |     0.570 | In Pipeline 1 |
| |                                              +----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedDirectedUnionRelationshipTypesScan |  1 | (anon_0)-[friendOrFoe:FRIENDS_WITH|FOE]->(anon_1) |             15 |   12 |      13 |                    2/0 |     0.170 | In Pipeline 0 |
+------------------------------------------------+----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 25

无向联合关系类型扫描

UndirectedUnionRelationshipTypesScan 运算符从关系类型索引中获取所有关系及其起点和终点节点,这些节点至少具有提供的类型之一。

随着块存储格式成为默认值,该运算符将不再用于生成计划。有关可用的各种存储格式的详细信息,请参阅 操作手册 → 存储格式
示例 27. UndirectedUnionRelationshipTypeScan
查询
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区无向联合关系类型扫描

PartitionedUndirectedUnionRelationshipTypeScanUndirectedUnionRelationshipTypesScan 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立地并行扫描。

随着块存储格式成为默认值,该运算符将不再用于生成计划。有关可用的各种存储格式的详细信息,请参阅 操作手册 → 存储格式
示例 28. PartitionedUndirectedUnionRelationshipTypesScan
查询
CYPHER runtime=parallel
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+--------------------------------------------------+----+--------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                                         | Id | Details                                          | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+--------------------------------------------------+----+--------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                                  |  0 | friendOrFoe                                      |             30 |   24 |      24 |                    0/0 |     0.896 | In Pipeline 1 |
| |                                                +----+--------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedUndirectedUnionRelationshipTypesScan |  1 | (anon_0)-[friendOrFoe:FRIENDS_WITH|FOE]-(anon_1) |             30 |   24 |      13 |                    2/0 |     0.818 | In Pipeline 0 |
+--------------------------------------------------+----+--------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 37

通过 ElementId 查找节点

NodeByElementIdSeek 运算符通过函数 elementId() 从节点存储中读取一个或多个节点 ID。

示例 29. NodeByElementIdSeek
查询
PROFILE
MATCH (n)
WHERE elementId(n) = 0
RETURN n
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

通过 ID 查找节点

NodeByIdSeek 运算符通过函数 id() 从节点存储中读取一个或多个节点 ID。

示例 30. NodeByIdSeek
查询
PROFILE
MATCH (n)
WHERE id(n) = 0
RETURN n
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------+----+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Id | Details                    | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |  0 | n                          |              1 |    1 |       2 |              0 |                        |           |                     |
| |               +----+----------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByIdSeek   |  1 | n WHERE id(n) = $autoint_0 |              1 |    1 |       1 |            248 |                    2/0 |     1.109 | Fused in Pipeline 0 |
+-----------------+----+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 3, total allocated memory: 312

1 row

通过标签扫描节点

NodeByLabelScan 运算符从节点标签索引中获取所有具有特定标签的节点。

示例 31. NodeByLabelScan
查询
PROFILE
MATCH (person:Person)
RETURN person
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区通过标签扫描节点

PartitionedNodeByLabelScanNodeByLabelScan 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立地并行扫描。

示例 32. PartitionedNodeByLabelScan
查询
CYPHER runtime=parallel
PROFILE
MATCH (person:Person)
RETURN person
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+-----------------------------+----+---------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                    | Id | Details       | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-----------------------------+----+---------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults             |  0 | person        |             14 |   14 |      28 |                    2/0 |     0.623 | In Pipeline 1 |
| |                           +----+---------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedNodeByLabelScan |  1 | person:Person |             14 |   14 |      15 |                    1/0 |     0.094 | In Pipeline 0 |
+-----------------------------+----+---------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 43

节点索引查找

NodeIndexSeek 运算符使用索引查找查找节点。运算符参数中显示了节点变量和使用的索引。如果索引是唯一索引,则运算符被称为 NodeUniqueIndexSeek

示例 33. NodeIndexSeek
查询
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区节点索引查找

PartitionedNodeIndexSeekNodeIndexSeek 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立地并行扫描。

示例 34. PartitionedNodeIndexSeek
查询
CYPHER runtime=parallel
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+---------------------------+----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                  | Id | Details                                                        | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+---------------------------+----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults           |  0 | location                                                       |              0 |    1 |       2 |                    2/0 |     0.179 | In Pipeline 1 |
| |                         +----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedNodeIndexSeek |  1 | RANGE INDEX location:Location(name) WHERE name = $autostring_0 |              0 |    1 |       2 |                    1/0 |     0.167 | In Pipeline 0 |
+---------------------------+----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 4

节点唯一索引查找

NodeUniqueIndexSeek 运算符使用唯一索引中的索引查找查找节点。运算符参数中显示了节点变量和使用的索引。如果索引不是唯一的,则运算符被称为 NodeIndexSeek。如果索引查找用于解决 MERGE 子句,它也会被标记为 (Locking)。这清楚地表明,从索引返回的任何节点都将被锁定,以防止并发冲突更新。

示例 35. NodeUniqueIndexSeek
查询
PROFILE
MATCH (t:Team {name: 'Malmo'})
RETURN t
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

多节点索引查找

MultiNodeIndexSeek 运算符使用多个索引查找查找节点。它支持对查询中的不同节点使用多个不同的索引。运算符参数中显示了节点变量和使用的索引。

运算符产生所有索引查找的笛卡尔积。例如,如果运算符执行两次查找,第一次查找找到节点 a1, a2,第二次查找找到 b1, b2, b3,则 MultiNodeIndexSeek 将产生行 (a1, b1), (a1, b2), (a1, b3), (a2, b1), (a2, b2), (a2, b3)

示例 36. MultiNodeIndexSeek
查询
PROFILE
CYPHER runtime=pipelined
MATCH
  (location:Location {name: 'Malmo'}),
  (person:Person {name: 'Bob'})
RETURN location, person
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

断言多节点索引查找

AssertingMultiNodeIndexSeek 运算符用于确保不违反任何属性唯一性约束。示例查找具有提供的名称和 ID 的团队是否存在,如果不存在,则会创建该团队。由于 :Team(name):Team(id) 上存在两个属性唯一性约束,因此 UniqueIndexSeek 运算符找到的任何节点都必须是同一个节点,否则会违反约束。

示例 37. AssertingMultiNodeIndexSeek
查询
PROFILE
MERGE (t:Team {name: 'Engineering', id: 42})
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

通过范围进行节点索引查找

NodeIndexSeekByRange 运算符使用索引查找查找节点,其中属性的值与给定的前缀 STRING 匹配。NodeIndexSeekByRange 可用于 STARTS WITH 和比较运算符,例如 <><=>=。如果索引是唯一索引,则运算符被称为 NodeUniqueIndexSeekByRange

示例 38. NodeIndexSeekByRange
查询
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区通过范围进行节点索引查找

PartitionedNodeIndexSeekByRangeNodeIndexSeekByRange 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立地并行扫描。

示例 39. PartitionedNodeIndexSeekByRange
查询
CYPHER runtime=parallel
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+----------------------------------+----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                         | Id | Details                                                           | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+----------------------------------+----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults                  |  0 | l                                                                 |              0 |    1 |       2 |                    2/0 |     0.191 | In Pipeline 1 |
| |                                +----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedNodeIndexSeekByRange |  1 | RANGE INDEX l:Location(name) WHERE name STARTS WITH $autostring_0 |              0 |    1 |       2 |                    1/0 |     0.087 | In Pipeline 0 |
+----------------------------------+----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 4

节点唯一索引通过范围查找

NodeUniqueIndexSeekByRange 运算符使用唯一索引中的索引查找查找节点,其中属性的值与给定的前缀 STRING 匹配。NodeUniqueIndexSeekByRangeSTARTS WITH 和比较运算符(例如 <><=>=)使用。如果索引不是唯一的,则运算符被称为 NodeIndexSeekByRange

示例 40. NodeUniqueIndexSeekByRange
查询
PROFILE
MATCH (t:Team)
WHERE t.name STARTS WITH 'Ma'
RETURN t
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

节点索引包含扫描

NodeIndexContainsScan 运算符检查存储在索引中的所有值,查找包含特定 STRING 的条目;例如,在包含 CONTAINS 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但它仍然比使用 NodeByLabelScan 进行标签扫描以及属性存储过滤器产生的间接寻址更快。

示例 41. NodeIndexContainsScan
查询
PROFILE
MATCH (l:Location)
WHERE l.name CONTAINS 'al'
RETURN l
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

节点索引以...结尾扫描

NodeIndexEndsWithScan 运算符检查存储在索引中的所有值,查找以特定 STRING 结尾的条目;例如,在包含 ENDS WITH 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但它仍然比使用 NodeByLabelScan 进行标签扫描以及属性存储过滤器产生的间接寻址更快。

示例 42. NodeIndexEndsWithScan
查询
PROFILE
MATCH (l:Location)
WHERE l.name ENDS WITH 'al'
RETURN l
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

节点索引扫描

NodeIndexScan 运算符检查存储在索引中的所有值,返回具有特定标签和指定属性的所有节点。

示例 43. NodeIndexScan
查询
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区节点索引扫描

PartitionedNodeIndexScanNodeIndexScan 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立地并行扫描。

示例 44. PartitionedNodeIndexScan
查询
CYPHER runtime=parallel
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

+---------------------------+----+-----------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| Operator                  | Id | Details                                             | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+---------------------------+----+-----------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +ProduceResults           |  0 | l                                                   |              1 |   10 |      20 |                    2/0 |     0.472 | In Pipeline 1 |
| |                         +----+-----------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+
| +PartitionedNodeIndexScan |  1 | RANGE INDEX l:Location(name) WHERE name IS NOT NULL |              1 |   10 |      11 |                    1/0 |     0.187 | In Pipeline 0 |
+---------------------------+----+-----------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+

Total database accesses: 31

应用

所有不同的 Apply 运算符(如下所示)共享相同的基本功能:它们通过从左侧获取一行并使用右侧的 Argument 运算符,在右侧执行运算符树来执行嵌套循环。Apply 运算符的版本在结果的管理方式上有所不同。Apply 运算符(即标准版本)获取右侧产生的行(此时包含来自左侧和右侧的数据)并产生该行。

示例 45. Apply
查询
PROFILE
MATCH (p:Person {name: 'me'})
MATCH (q:Person {name: p.secondName})
RETURN p, q
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

半应用

SemiApply 运算符测试模式谓词的存在,是 Apply 运算符的一种变体。如果右侧运算符产生至少一行,则左侧运算符的行将由 SemiApply 运算符产生。这使得 SemiApply 成为一个过滤运算符,主要用于查询中的模式谓词。

示例 46. SemiApply
查询
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
WHERE (p)-[:FRIENDS_WITH]->(:Person)
RETURN p.name
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+-------------------------------------+----------------+------+---------+------------------------+
| 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

反半应用

AntiSemiApply 运算符测试模式的不存在,是 Apply 运算符的一种变体。如果右侧运算符不产生任何行,则左侧运算符的行将由 AntiSemiApply 运算符产生。这使得 AntiSemiApply 成为一个过滤运算符,用于查询中的模式谓词。

示例 47. AntiSemiApply
查询
PROFILE
CYPHER runtime=slotted
MATCH
  (me:Person {name: 'me'}),
  (other:Person)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+
| 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

事务应用

TransactionApply 的工作方式类似于 Apply 运算符,但在指定行数后会提交当前事务。

示例 48. TransactionApply
以下查询使用 变量作用域子句(在 Neo4j 5.23 中引入)将变量导入 CALL 子查询。如果您使用的是较旧版本的 Neo4j,请改为使用 导入 WITH 子句
查询
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
CALL (line) {
  CREATE (a: Artist {name: line[0]})
  RETURN a
} IN TRANSACTIONS OF 100 ROWS
RETURN a;
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-------------------+----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator          | Id | Details                                          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-------------------+----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults   |  0 | a                                                |             10 |    4 |       8 |              0 |                        |           |                     |
| |                 +----+--------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +TransactionApply |  1 | IN TRANSACTIONS OF $autoint_1 ROWS ON ERROR FAIL |             10 |    4 |       0 |           2152 |                    0/0 |     2.036 | Fused in Pipeline 3 |
| |\                +----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Create         |  2 | (a:Artist {name: line[$autoint_0]})              |             10 |    4 |      16 |                |                        |           |                     |
| | |               +----+--------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument       |  3 | line                                             |             10 |    4 |       0 |           3472 |                    0/0 |    32.746 | Fused in Pipeline 2 |
| |                 +----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +LoadCSV          |  4 | line                                             |             10 |    4 |       0 |            328 |                        |           | In Pipeline 1       |
+-------------------+----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 24, total allocated memory: 5472

Anti 运算符测试模式的不存在。如果有传入的行,则 Anti 运算符不会产生任何行。如果没有传入的行,则 Anti 运算符将产生一行。

示例 49. Anti
查询
PROFILE
CYPHER runtime=pipelined
MATCH
  (me:Person {name: 'me'}),
  (other:Person)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

让半应用

LetSemiApply 运算符测试模式谓词的存在,是 Apply 运算符的一种变体。当查询包含用 OR 分隔的多个模式谓词时,LetSemiApply 将用于评估这些谓词中的第一个。它将记录评估谓词的结果,但会将任何过滤留给另一个运算符。在示例中,LetSemiApply 将用于检查每个人的 FRIENDS_WITH 关系是否存在。

示例 50. LetSemiApply
查询
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE (other)-[:FRIENDS_WITH]->(:Person) OR (other)-[:WORKS_IN]->(:Location)
RETURN other.name
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+--------------------+-----------------------------------------+----------------+------+---------+------------------------+
| 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

让反半应用

LetAntiSemiApply 运算符测试模式的不存在,是 Apply 运算符的一种变体。当查询包含多个否定模式谓词(即用 OR 分隔的谓词,其中至少一个谓词包含 NOT)时,LetAntiSemiApply 将用于评估这些谓词中的第一个。它将记录评估谓词的结果,但会将任何过滤留给另一个运算符。在示例中,LetAntiSemiApply 将用于检查每个人的 FRIENDS_WITH 关系是否存在。

示例 51. LetAntiSemiApply
查询
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE NOT ((other)-[:FRIENDS_WITH]->(:Person)) OR (other)-[:WORKS_IN]->(:Location)
RETURN other.name
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25
+--------------------+-----------------------------------------+----------------+------+---------+------------------------+
| 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

选择或半应用

SelectOrSemiApply 运算符测试模式谓词的存在并评估谓词,它是 Apply 运算符的变体。此运算符允许混合正常的谓词和模式谓词,模式谓词检查模式是否存在。首先,评估正常的表达式谓词,并且,只有当它返回 false 时,才会评估代价高的模式谓词。

示例 52. SelectOrSemiApply
查询
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

SelectOrAntiSemiApply 运算符用于评估谓词和否定模式谓词(即以 NOT 开头的模式谓词)之间的 OR,它是 Apply 运算符的变体。如果谓词返回 true,则不会测试模式谓词。如果谓词返回 falsenull,则 SelectOrAntiSemiApply 将改为测试模式谓词。

示例 53. SelectOrAntiSemiApply
查询
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR NOT (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

LetSelectOrSemiApply 运算符是为使用 OR 与其他谓词组合的模式谓词而计划的。这是 Apply 运算符的变体。

示例 54. LetSelectOrSemiApply
查询
PROFILE
CYPHER runtime=slotted
MATCH (other:Person)
WHERE (other)-[:FRIENDS_WITH]->(:Person) OR (other)-[:WORKS_IN]->(:Location) OR other.age = 5
RETURN other.name
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------------+-----------------------------------------+----------------+------+---------+------------------------+
| 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

LetSelectOrAntiSemiApply 运算符是为使用 OR 与其他谓词组合的否定模式谓词(即以 NOT 开头的模式谓词)而计划的。此运算符是 Apply 运算符的变体。

示例 55. LetSelectOrAntiSemiApply
查询
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
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+---------------------------+-----------------------------------------+----------------+------+---------+------------------------+
| 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

Merge 运算符将读取或创建节点和/或关系。

如果找到匹配项,它将针对每个传入行执行提供的 ON MATCH 操作。如果未找到匹配项,则改为创建节点和关系,并运行所有 ON CREATE 操作。

示例 56. Merge
查询
PROFILE
MERGE (p:Person {name: 'Andy'})
ON MATCH SET p.existed = true
ON CREATE SET p.existed = false
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

LockingMerge 运算符类似于 Merge 运算符,但在必要时创建关系时会锁定起点和终点节点。

示例 57. LockingMerge
查询
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Id | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |  0 |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |  1 |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply          |  2 |                                                       |              1 |    1 |       0 |                |                        |           |                     |
| |\              +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +LockingMerge |  3 | CREATE (s)-[anon_0:FRIENDS_WITH]->(s), LOCK(s)        |              1 |    1 |       1 |                |                        |           |                     |
| | |             +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(Into) |  4 | (s)-[anon_0:FRIENDS_WITH]->(s)                        |              0 |    0 |      10 |            904 |                        |           |                     |
| | |             +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument     |  5 | s                                                     |              1 |    3 |       0 |           2280 |                    2/0 |     0.460 | Fused in Pipeline 1 |
| |               +----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek  |  6 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            376 |                    1/0 |     0.211 | In Pipeline 0       |
+-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 2232

Roll Up Apply

RollUpApply 运算符用于执行表达式,该表达式以模式为输入,并返回包含匹配模式内容的列表;例如,在查询中使用模式表达式或模式理解时。此运算符是 Apply 运算符的变体。

示例 58. RollUpApply
查询
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
RETURN p.name, [(p)-[:WORKS_IN]->(location) | location.name] AS cities
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+-----------------------------------+----------------+------+---------+------------------------+
| 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

Argument 运算符指示要用作 Apply 运算符右侧操作数的变量。

示例 59. Argument
查询
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Id | Details                                               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |  0 |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |  1 |                                                       |              1 |    0 |       0 |                |                        |           |                     |
| |               +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply          |  2 |                                                       |              1 |    1 |       0 |                |                        |           |                     |
| |\              +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +LockingMerge |  3 | CREATE (s)-[anon_0:FRIENDS_WITH]->(s), LOCK(s)        |              1 |    1 |       1 |                |                        |           |                     |
| | |             +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(Into) |  4 | (s)-[anon_0:FRIENDS_WITH]->(s)                        |              0 |    0 |      10 |            904 |                        |           |                     |
| | |             +----+-------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument     |  5 | s                                                     |              1 |    3 |       0 |           2280 |                    2/0 |     0.460 | Fused in Pipeline 1 |
| |               +----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek  |  6 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 |              1 |    1 |       2 |            376 |                    1/0 |     0.211 | In Pipeline 0       |
+-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 15, total allocated memory: 2232

Argument Tracker

ArgumentTracker 运算符用于确保逐行语义。这限制了 Cypher 运行时,使其不以更大的块批量处理操作。

示例 60. ArgumentTracker
以下查询使用 变量作用域子句(在 Neo4j 5.23 中引入)将变量导入 CALL 子查询。如果您使用的是较旧版本的 Neo4j,请改为使用 导入 WITH 子句
查询
PROFILE
MATCH (s:Person {name: 'me'})
CALL (s) {
   SET s.seen = coalesce(s.seen + 1,1)
   RETURN s.seen AS result
}
RETURN result;
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

+--------------------+----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator           | Id | Details                                                 | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------+----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults    |  0 | result                                                  |              1 |    1 |       0 |              0 |                        |           |                     |
| |                  +----+---------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply             |  1 |                                                         |              1 |    0 |       0 |                |                        |           |                     |
| |\                 +----+---------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +ArgumentTracker |  7 |                                                         |              1 |    0 |       0 |            736 |                        |           |                     |
| | |                +----+---------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Projection      |  2 | s.seen AS result                                        |              1 |    1 |       2 |                |                        |           |                     |
| | |                +----+---------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Eager           |  3 | read/set conflict for property: seen (Operator: 4 vs 2) |              1 |    1 |       0 |            976 |                    0/0 |     0.298 | Fused in Pipeline 2 |
| | |                +----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +SetProperty     |  4 | s.seen = coalesce(s.seen + $autoint_1, $autoint_2)      |              1 |    1 |       2 |                |                        |           |                     |
| | |                +----+---------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument        |  5 | s                                                       |              1 |    1 |       0 |           2408 |                    2/0 |     1.734 | Fused in Pipeline 1 |
| |                  +----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek     |  6 | RANGE INDEX s:Person(name) WHERE name = $autostring_0   |              1 |    1 |       2 |            368 |                    1/0 |     0.183 | In Pipeline 0       |
+--------------------+----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 6, total allocated memory: 4136

Expand All

给定一个起点节点,并且根据模式关系,Expand(All) 运算符将遍历传入或传出的关系。

示例 61. Expand(All)
查询
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)
RETURN fof
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

当起点和终点节点都已找到时,Expand(Into) 运算符用于查找连接这两个节点的所有关系。由于关系的起点和终点节点已经在范围内,因此将使用度数最小的节点。当密集节点作为端点出现时,这会产生显着差异。

示例 62. Expand(Into)
查询
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)-->(p)
RETURN fof
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

OptionalExpand(All) 运算符类似于 Expand(All),不同之处在于没有关系与方向、类型和属性谓词匹配。在这种情况下,OptionalExpand(all) 将返回一行,其中关系和终点节点设置为 null

示例 63. OptionalExpand(All)
查询
PROFILE
MATCH (p:Person)
OPTIONAL MATCH (p)-[works_in:WORKS_IN]->(l)
  WHERE works_in.duration > 180
RETURN p, l
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

OptionalExpand(Into) 运算符类似于 Expand(Into),不同之处在于没有找到匹配的关系。在这种情况下,OptionalExpand(Into) 将返回一行,其中关系和终点节点设置为 null。由于关系的起点和终点节点已经在范围内,因此将使用度数最小的节点。当密集节点作为端点出现时,这会产生显着差异。

示例 64. OptionalExpand(Into)
查询
PROFILE
MATCH (p:Person)-[works_in:WORKS_IN]->(l)
OPTIONAL MATCH (l)-->(p)
RETURN p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

给定一个起点节点,VarLengthExpand(All) 运算符将遍历可变长度和量化关系。

示例 65. VarLengthExpand(All)
查询
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(q:Person)
RETURN p, q
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

当起点和终点节点都已找到时,VarLengthExpand(Into) 运算符用于查找连接这两个节点的所有可变长度和量化关系。

示例 66. VarLengthExpand(Into)
查询
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(p:Person)
RETURN p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

给定一个起点节点,VarLengthExpand(Pruning) 运算符将遍历可变长度和量化关系,类似于 VarLengthExpand(All) 运算符。但是,作为一种优化,如果可以保证某些路径会产生已经找到的终点节点(通过之前的路径遍历),则不会探索这些路径。

这种类型的扩展仅在以下情况下才会被规划:

  • 各个路径并不重要。

  • 关系具有上限。

VarLengthExpand(Pruning) 运算符保证所有生成的终点节点都是唯一的。

示例 67. VarLengthExpand(Pruning)
查询
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *3..4]-(q:Person)
RETURN DISTINCT p, q
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+---------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------+
| Operator                  | Id | Details                      | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline      |
+---------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------+
| +ProduceResults           |  0 | p, q                         |              0 |    0 |       0 |                |                    0/0 |     0.005 |            |               |
| |                         +----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+            |               |
| +OrderedDistinct          |  1 | p, q                         |              0 |    0 |       0 |             40 |                    0/0 |     0.014 |            |               |
| |                         +----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+            |               |
| +Filter                   |  2 | q:Person                     |              0 |    0 |       0 |                |                    0/0 |     0.014 |            |               |
| |                         +----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+            |               |
| +VarLengthExpand(Pruning) |  3 | (p)-[:FRIENDS_WITH*3..4]-(q) |              1 |    0 |      15 |            400 |                        |           |            | In Pipeline 1 |
| |                         +----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+            +---------------+
| +NodeByLabelScan          |  4 | p:Person                     |             14 |   14 |      15 |            120 |                    1/0 |     0.020 | p ASC      | In Pipeline 0 |
+---------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------+

Total database accesses: 30, total allocated memory: 480

Breadth First VarLength Expand Pruning

给定一个起点节点,VarLengthExpand(Pruning,BFS,All) 运算符会遍历可变长度和量化关系,类似于 VarLengthExpand(All) 运算符。但是,作为一种优化,它会改为执行广度优先搜索 (BFS),并且在扩展时,如果可以保证某些路径会产生已经找到的终点节点(通过之前的路径遍历),则不会探索这些路径。这仅用于各个路径并不重要的场合。

这种类型的扩展仅在以下情况下才会被规划:

  • 各个路径并不重要。

  • 下限为 01(默认值)。

此运算符保证所有生成的终点节点都是唯一的。

查询
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *..4]-(q:Person)
RETURN DISTINCT p, q
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| Operator                          | Id | Details                      | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline            |
+-----------------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProduceResults                   |  0 | p, q                         |             12 |    0 |       0 |              0 |                        |           |            |                     |
| |                                 +----+------------------------------+----------------+------+---------+----------------+                        |           |            |                     |
| +OrderedDistinct                  |  1 | p, q                         |             12 |    0 |       0 |             40 |                        |           |            |                     |
| |                                 +----+------------------------------+----------------+------+---------+----------------+                        |           |            |                     |
| +Filter                           |  2 | q:Person                     |             13 |    0 |       0 |                |                        |           |            |                     |
| |                                 +----+------------------------------+----------------+------+---------+----------------+                        |           |            |                     |
| +VarLengthExpand(Pruning,BFS,All) |  3 | (p)-[:FRIENDS_WITH*..4]-(q)  |             13 |    0 |      38 |            952 |                        |           |            |                     |
| |                                 +----+------------------------------+----------------+------+---------+----------------+                        |           |            |                     |
| +NodeByLabelScan                  |  4 | p:Person                     |             10 |   10 |      11 |            248 |                    3/0 |     4.662 | p ASC      | Fused in Pipeline 0 |
+-----------------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+

Total database accesses: 49, total allocated memory: 1200

Repeat (Trail)

给定一个起点节点,Repeat(Trail) 运算符将遍历 量化路径模式,这些模式无法用 VarLengthExpand(All) 运算符解决(或无法有效解决)。类似于 Apply 运算符,它从左侧获取一行,并应用右侧的操作符。但是,与 Apply 不同的是,它会根据量化路径模式上的量词重复应用这些操作符。在以下示例中,运算符将重复两次,并为两次重复生成行。

示例 68. Repeat(Trail)
查询
PROFILE
MATCH (me:Person) ((a)-[:FRIENDS_WITH]-(b)-[:FRIENDS_WITH]-(c) WHERE a.name <> b.name AND a.name <> c.name AND b.name <> c.name){1,2} (friend:Person)
RETURN me, friend
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Id | Details                                                                                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |  0 | me, friend                                                                                           |              2 |   34 |     136 |              0 |                        |           |                     |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter          |  1 | friend:Person                                                                                        |              2 |   34 |      68 |                |                        |           |                     |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NullifyMetadata |  9 |                                                                                                      |              2 |   34 |       0 |                |                        |           |                     |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Repeat(Trail)   |  2 | (me) (...){1, 2} (friend)                                                                            |              2 |   34 |       0 |          29792 |                    0/0 |     1.696 | Fused in Pipeline 2 |
| |\               +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Filter        |  3 | NOT anon_5 = anon_3 AND (NOT cache[a.name] = cache[c.name] AND NOT cache[b.name] = cache[c.name]) AN |              1 |   34 |      92 |                |                        |           |                     |
| | |              |    | D isRepeatTrailUnique(anon_5)                                                                        |                |      |         |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)   |  4 | (b)-[anon_5:FRIENDS_WITH]-(c)                                                                        |              3 |   92 |     138 |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Filter        |  5 | NOT cache[a.name] = cache[b.name] AND isRepeatTrailUnique(anon_3)                                    |              5 |   46 |     198 |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)   |  6 | (a)-[anon_3:FRIENDS_WITH]-(b)                                                                        |             10 |   66 |     100 |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument      |  7 | a                                                                                                    |             15 |   34 |       0 |          15672 |                    2/0 |     3.245 | Fused in Pipeline 1 |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan |  8 | me:Person                                                                                            |             14 |   14 |      15 |            376 |                    1/0 |     0.107 | In Pipeline 0       |
+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 747, total allocated memory: 45832

Nullify Metadata

NullifyMetadata 负责清理 Repeat(Trail) 生成的状态。它仅在 Repeat(Trail) 之后直接被规划。

示例 69. NullifyMetadata
查询
PROFILE
MATCH (me:Person) ((a)-[:FRIENDS_WITH]-(b)-[:FRIENDS_WITH]-(c) WHERE a.name <> b.name AND a.name <> c.name AND b.name <> c.name){1,2} (friend:Person)
RETURN me, friend
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Id | Details                                                                                              | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |  0 | me, friend                                                                                           |              2 |   34 |     136 |              0 |                        |           |                     |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter          |  1 | friend:Person                                                                                        |              2 |   34 |      68 |                |                        |           |                     |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NullifyMetadata |  9 |                                                                                                      |              2 |   34 |       0 |                |                        |           |                     |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Repeat(Trail)   |  2 | (me) (...){1, 2} (friend)                                                                            |              2 |   34 |       0 |          29792 |                    0/0 |     1.696 | Fused in Pipeline 2 |
| |\               +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Filter        |  3 | NOT anon_5 = anon_3 AND (NOT cache[a.name] = cache[c.name] AND NOT cache[b.name] = cache[c.name]) AN |              1 |   34 |      92 |                |                        |           |                     |
| | |              |    | D isRepeatTrailUnique(anon_5)                                                                        |                |      |         |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)   |  4 | (b)-[anon_5:FRIENDS_WITH]-(c)                                                                        |              3 |   92 |     138 |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Filter        |  5 | NOT cache[a.name] = cache[b.name] AND isRepeatTrailUnique(anon_3)                                    |              5 |   46 |     198 |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Expand(All)   |  6 | (a)-[anon_3:FRIENDS_WITH]-(b)                                                                        |             10 |   66 |     100 |                |                        |           |                     |
| | |              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument      |  7 | a                                                                                                    |             15 |   34 |       0 |          15672 |                    2/0 |     3.245 | Fused in Pipeline 1 |
| |                +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan |  8 | me:Person                                                                                            |             14 |   14 |      15 |            376 |                    1/0 |     0.107 | In Pipeline 0       |
+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 747, total allocated memory: 45832

Assert Same Node

AssertSameNode 运算符用于确保在插槽式和解释式运行时不会违反任何节点属性唯一性约束。此示例查找是否存在具有提供的名称和 ID 的团队节点,如果不存在,则会创建它。由于在 :Team(name):Team(id) 上存在两个节点属性唯一性约束,因此,任何由 UniqueIndexSeek 运算符找到的节点都必须是同一个节点,否则约束将被违反。

示例 70. AssertSameNode
查询
PROFILE
CYPHER runtime=slotted
MERGE (t:Team {name: 'Engineering', id: 42})
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+---------------------------------+-------------------------------------------------------+----------------+------+---------+------------------------+
| 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

Assert Same Relationship

AssertSameRelationship 运算符用于确保在插槽式和解释式运行时不会违反任何关系属性唯一性约束。此示例查找是否存在具有提供的 idbadgeNumberWORKS_IN 关系。如果找不到,则会创建它。由于在 :WORKS_IN(id):WORKS_IN(badgeNumber) 上存在两个属性唯一性约束,因此,任何由 DirectedRelationshipUniqueIndexSeek 运算符找到的关系都必须是同一个关系,否则约束将被违反。

示例 71. AssertSameRelationship
查询
PROFILE
CYPHER runtime=slotted
MERGE (person)-[work:WORKS_IN {id: 0, badgeNumber: 4332}]->(location)
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-------------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| Operator                                        | Id | Details                                                                                              | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-------------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults                                 |  0 |                                                                                                      |              1 |    0 |       0 |                    0/0 |
| |                                               +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +EmptyResult                                    |  1 |                                                                                                      |              1 |    0 |       0 |                    0/0 |
| |                                               +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +Merge                                          |  2 | CREATE (person), (location), (person)-[work:WORKS_IN {id: $autoint_0, badgeNumber: $autoint_1}]->(lo |              1 |    1 |       0 |                    0/0 |
| |                                               |    | cation)                                                                                              |                |      |         |                        |
| |                                               +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +AssertSameRelationship                         |  3 | work                                                                                                 |              0 |    1 |       0 |                    0/0 |
| |\                                              +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| | +DirectedRelationshipUniqueIndexSeek(Locking) |  4 | RANGE INDEX (person)-[work:WORKS_IN(badgeNumber)]->(location) WHERE badgeNumber = $autoint_1         |              1 |    1 |       1 |                    0/1 |
| |                                               +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| +DirectedRelationshipUniqueIndexSeek(Locking)   |  5 | RANGE INDEX (person)-[work:WORKS_IN(id)]->(location) WHERE id = $autoint_0                           |              1 |    1 |       1 |                    1/1 |
+-------------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 2, total allocated memory: 64

Empty Result

EmptyResult 运算符会急切地加载所有传入数据并丢弃它。

示例 72. EmptyResult
查询
PROFILE
CREATE (:Person)
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

ProduceResults 运算符准备结果,使其可供用户使用,例如将内部值转换为用户值。它存在于每个向用户返回数据的查询中,对性能优化影响很小。

示例 73. ProduceResults
查询
PROFILE
MATCH (n)
RETURN n
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

LoadCSV 运算符将数据从 CSV 源加载到查询中。只要在查询中使用 LOAD CSV 子句,就会使用它。

示例 74. LoadCSV
查询
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
RETURN line
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

哈希连接有两个输入:构建输入和探测输入。查询规划器分配这些角色,以便两个输入中较小的一个成为构建输入。构建输入会急切地拉入,并用于构建探测表。完成后,将针对来自探测输入侧的每一行检查探测表。

在查询计划中,构建输入始终是左侧操作数,探测输入是右侧操作数。

有四种哈希连接运算符

Node Hash Join

NodeHashJoin 运算符是 哈希连接 的变体。NodeHashJoin 在节点 ID 上执行哈希连接。由于可以使用基本类型和数组,因此可以非常有效地完成此操作。

示例 75. NodeHashJoin
查询
PROFILE
MATCH (bob:Person {name: 'Bob'})-[:WORKS_IN]->(loc)<-[:WORKS_IN]-(matt:Person {name: 'Mattias'})
USING JOIN ON loc
RETURN loc.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

ValueHashJoin 运算符是 哈希连接 的变体。此运算符允许使用任意值作为连接键。它最常用于解决以下形式的谓词:n.prop1 = m.prop2(即两个属性列之间的相等谓词)。

示例 76. ValueHashJoin
查询
PROFILE
MATCH
  (p:Person),
  (q:Person)
WHERE p.age = q.age
RETURN p, q
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

NodeLeftOuterHashJoinNodeRightOuterHashJoin 运算符是 哈希连接 的变体。 下面的查询可以使用左外连接或右外连接进行规划。 决策取决于左右两侧的基数;即分别为 (a:Person)(a)-→(b:Person) 返回多少行。 如果 (a:Person) 返回的结果少于 (a)-→(b:Person),则计划使用左外连接(由 NodeLeftOuterHashJoin 指示)。 另一方面,如果 (a:Person) 返回的结果多于 (a)-→(b:Person),则计划使用右外连接(由 NodeRightOuterHashJoin 指示)。

示例 77. NodeRightOuterHashJoin
查询
PROFILE
MATCH (a:Person)
OPTIONAL MATCH (a)-->(b:Person)
USING JOIN ON a
RETURN a.name, b.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

三元选择

TriadicSelection 运算符用于解决三角形查询,例如非常常见的“查找我的朋友的朋友,他们不是我的朋友”。 它通过将所有朋友放入一个集合中来做到这一点,并使用该集合来检查朋友的朋友是否已经与我连接。 该示例查找所有朋友的朋友的姓名,他们不是我的朋友。

示例 78. TriadicSelection
查询
PROFILE
CYPHER runtime=slotted
MATCH (me:Person)-[:FRIENDS_WITH]-()-[:FRIENDS_WITH]-(other)
WHERE NOT (me)-[:FRIENDS_WITH]-(other)
RETURN other.name
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-------------------+----------------------------------------+----------------+------+---------+------------------------+
| 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

三元构建

TriadicBuild 运算符与 TriadicFilter 一起使用来解决三角形查询,例如非常常见的“查找我的朋友的朋友,他们不是我的朋友”。 这两个运算符特定于管道运行时,并且一起执行与 TriadicSelection 对其他运行时所做的相同的逻辑。 TriadicBuild 构建所有朋友的集合,该集合稍后由 TriadicFilter 使用。 该示例查找所有朋友的朋友的姓名,他们不是我的朋友。

示例 79. TriadicBuild
查询
PROFILE
CYPHER runtime=pipelined
MATCH (me:Person)-[:FRIENDS_WITH]-()-[:FRIENDS_WITH]-(other)
WHERE NOT (me)-[:FRIENDS_WITH]-(other)
RETURN other.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

三元过滤器

TriadicFilter 运算符与 TriadicBuild 一起使用来解决三角形查询,例如非常常见的“查找我的朋友的朋友,他们不是我的朋友”。 这两个运算符特定于管道运行时,并且一起执行与 TriadicSelection 对其他运行时所做的相同的逻辑。 TriadicFilter 使用 TriadicBuild 之前构建的朋友集合来检查朋友的朋友是否已经与我连接。 该示例查找所有朋友的朋友的姓名,他们不是我的朋友。

示例 80. TriadicFilter
查询
PROFILE
CYPHER runtime=pipelined
MATCH (me:Person)-[:FRIENDS_WITH]-()-[:FRIENDS_WITH]-(other)
WHERE NOT (me)-[:FRIENDS_WITH]-(other)
RETURN other.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

笛卡尔积

CartesianProduct 运算符生成两个输入的笛卡尔积——来自左子运算符的每一行将与来自右子运算符的所有行组合。 CartesianProduct 通常表现出较差的性能,如果可能,应该避免使用。

示例 81. CartesianProduct
查询
PROFILE
MATCH
  (p:Person),
  (t:Team)
RETURN p, t
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Foreach 运算符在左子运算符和右子运算符之间执行嵌套循环。 与 Apply 运算符类似,它从左侧获取一行,并使用 Argument 运算符将其提供给右侧的运算符树。 Foreach 将产生来自左侧的所有行;来自右侧的所有结果都被拉入并丢弃。

示例 82. Foreach
查询
PROFILE
FOREACH (value IN [1,2,3] | CREATE (:Person {age: value}))
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+---------------------------------------------------------+----------------+------+---------+------------------------+
| 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

TransactionForeach

TransactionForeach 的工作原理类似于 Foreach 运算符,但将在指定数量的行后提交当前事务。

示例 83. TransactionForeach
以下查询使用 变量作用域子句(在 Neo4j 5.23 中引入)将变量导入 CALL 子查询。如果您使用的是较旧版本的 Neo4j,请改为使用 导入 WITH 子句
查询
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
CALL (line) {
  CREATE (a: Artist {name: line[0]})
} IN TRANSACTIONS OF 100 ROWS
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

++---------------------+----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
 | Operator            | Id | Details                                          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
 +---------------------+----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
 | +ProduceResults     |  0 |                                                  |             10 |    0 |       0 |              0 |                        |           |                     |
 | |                   +----+--------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
 | +EmptyResult        |  1 |                                                  |             10 |    0 |       0 |                |                    0/0 |     0.000 | Fused in Pipeline 3 |
 | |                   +----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
 | +TransactionForeach |  2 | IN TRANSACTIONS OF $autoint_1 ROWS ON ERROR FAIL |             10 |    4 |       0 |           4856 |                        |           |                     |
 | |\                  +----+--------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
 | | +Create           |  3 | (a:Artist {name: line[$autoint_0]})              |             10 |    4 |      12 |                |                        |           |                     |
 | | |                 +----+--------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
 | | +Argument         |  4 | line                                             |             10 |    4 |       0 |           3472 |                    0/0 |     0.712 | Fused in Pipeline 2 |
 | |                   +----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
 | +LoadCSV            |  5 | line                                             |             10 |    4 |       0 |            328 |                        |           | In Pipeline 1       |
 +---------------------+----+--------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

 Total database accesses: 12, total allocated memory: 5704

SubqueryForeach

SubqueryForeach 的工作原理类似于 Foreach 运算符,但它仅用于执行子查询。

示例 84. SubqueryForeach
以下查询使用 变量作用域子句(在 Neo4j 5.23 中引入)将变量导入 CALL 子查询。如果您使用的是较旧版本的 Neo4j,请改为使用 导入 WITH 子句
查询
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
CALL (line) {
  CREATE (a: Artist {name: line[0]})
}
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Id | Details                             | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |  0 |                                     |             10 |    0 |       0 |              0 |                        |           |                     |
| |                +----+-------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult     |  1 |                                     |             10 |    0 |       0 |                |                    0/0 |     0.000 | Fused in Pipeline 3 |
| |                +----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +SubqueryForeach |  2 |                                     |             10 |    4 |       0 |           4080 |                        |           |                     |
| |\               +----+-------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Create        |  3 | (a:Artist {name: line[$autoint_0]}) |             10 |    4 |      12 |                |                        |           |                     |
| | |              +----+-------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument      |  4 | line                                |             10 |    4 |       0 |           3472 |                    0/0 |     0.852 | Fused in Pipeline 2 |
| |                +----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +LoadCSV         |  5 | line                                |             10 |    4 |       0 |            328 |                        |           | In Pipeline 1       |
+------------------+----+-------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 12, total allocated memory: 4928

Eager

Eager 运算符会导致所有前面的运算符在继续执行之前完全执行整个数据集。 这样做是为了确保查询计划中可能相互影响的部分之间的隔离。

从图中获取的值以延迟方式获取;即模式匹配可能在应用更新之前不会完全耗尽。 为了保持正确的语义,查询规划器将在查询计划中插入 Eager 运算符以防止更新影响模式匹配或其他读取操作。 下面的查询说明了这种情况,其中 DELETE 子句否则会影响 MATCH 子句和 MERGE 子句。 有关 Eager 运算符如何确保正确语义的更多信息,请参阅有关 子句组合 的部分。

在导入数据或迁移图形结构时,Eager 运算符会导致高内存使用率。 在这种情况下,操作应拆分为更简单的步骤;例如,分别导入节点和关系。 或者,可以返回要更新的记录,然后是更新语句。

示例 85. Eager
查询
PROFILE
MATCH (a:Person {name: 'me'}), (b:Person {name: 'Bob'})
DETACH DELETE a, b
MERGE (:Person {name: 'me'})
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+---------------------+----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator            | Id | Details                                                                                        | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------+----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults     |  0 |                                                                                                |              0 |    0 |       0 |              0 |                        |           |                     |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult        |  1 |                                                                                                |              0 |    0 |       0 |                |                        |           |                     |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply              |  2 |                                                                                                |              0 |    1 |       0 |                |                        |           |                     |
| |\                  +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Merge            |  3 | CREATE (anon_0:Person {name: $autostring_2})                                                   |              0 |    1 |       3 |                |                        |           |                     |
| | |                 +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +NodeIndexSeek    |  4 | RANGE INDEX anon_0:Person(name) WHERE name = $autostring_2                                     |              0 |    0 |       1 |           3304 |                    1/0 |     0.663 | Fused in Pipeline 3 |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Eager              |  5 | read/delete conflict for variable: anon_0 (Operator: 6 vs 4, and 1 more conflicting operators) |              0 |    1 |       0 |            360 |                    0/0 |     0.008 | In Pipeline 2       |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +DetachDelete       |  6 | b                                                                                              |              0 |    1 |       4 |                |                        |           |                     |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +DetachDelete       |  7 | a                                                                                              |              0 |    1 |       5 |                |                        |           |                     |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Eager              |  8 | read/delete conflict for variable: b (Operator: 6 vs 10, and 1 more conflicting operators),    |              0 |    1 |       0 |            360 |                    1/0 |     0.226 | Fused in Pipeline 1 |
| |                   |    | read/set conflict for label: Person (Operator: 3 vs 10),                                       |                |      |         |                |                        |           |                     |
| |                   |    | read/set conflict for property: name (Operator: 3 vs 10)                                       |                |      |         |                |                        |           |                     |
| |                   +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +MultiNodeIndexSeek |  9 | RANGE INDEX a:Person(name) WHERE name = $autostring_0,                                         |              0 |    1 |       4 |            376 |                    2/0 |     0.218 | In Pipeline 0       |
|                     |    | RANGE INDEX b:Person(name) WHERE name = $autostring_1                                          |                |      |         |                |                        |           |                     |
+---------------------+----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 17, total allocated memory: 4184

Eager 聚合

EagerAggregation 运算符评估分组表达式并使用结果将行分组到不同的分组中。 对于每个分组,EagerAggregation 然后将评估所有聚合函数并返回结果。 为此,EagerAggregation 如其名称所示,需要从其源中急切地拉入所有数据并建立状态,这会导致系统中的内存压力增加。

示例 86. EagerAggregation
查询
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN
  l.name AS location,
  collect(p.name) AS people
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

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

Total database accesses: 117, total allocated memory: 2664

有序聚合

OrderedAggregation 运算符是 EagerAggregation 运算符的优化,它利用了传入行的排序。 此运算符使用延迟评估,并且与 EagerAggregation 运算符相比,系统中的内存压力更低。

示例 87. OrderedAggregation
查询
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p.name, count(*) AS count
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

从计数存储中获取节点计数

NodeCountFromCountStore 运算符使用计数存储来回答有关节点计数的问题。 这比 EagerAggregation 运算符快得多,后者通过实际计数来实现相同的结果。 但是,由于计数存储仅存储有限范围的组合,因此 EagerAggregation 仍将用于更复杂的查询。 例如,我们可以获取所有节点的计数以及具有标签的节点的计数,但不能获取具有多个标签的节点的计数。

示例 88. NodeCountFromCountStore
查询
PROFILE
MATCH (p:Person)
RETURN count(p) AS people
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

从计数存储中获取关系计数

RelationshipCountFromCountStore 运算符使用计数存储来回答有关关系计数的问题。 这比 EagerAggregation 运算符快得多,后者通过实际计数来实现相同的结果。 但是,由于计数存储仅存储有限范围的组合,因此 EagerAggregation 仍将用于更复杂的查询。 例如,我们可以获取所有关系的计数、具有类型的关系的计数、在一端具有标签的关系的计数,但不能获取两端节点上都有标签的关系的计数。

示例 89. RelationshipCountFromCountStore
查询
PROFILE
MATCH (p:Person)-[r:WORKS_IN]->()
RETURN count(r) AS jobs
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Distinct 运算符从传入的行流中删除重复行。 为了确保仅返回不同的元素,Distinct 将从其源中延迟地拉入数据并建立状态。 这可能会导致系统中的内存压力增加。

示例 90. Distinct
查询
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN DISTINCT p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+----+-----------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Id | Details               | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----+-----------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |  0 | p                     |             14 |   14 |      28 |                |                        |           |                     |
| |                +----+-----------------------+----------------+------+---------+----------------+                        |           |                     |
| +Distinct        |  1 | p                     |             14 |   14 |       0 |            352 |                        |           |                     |
| |                +----+-----------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter          |  2 | p:Person              |             15 |   15 |      30 |                |                        |           |                     |
| |                +----+-----------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)     |  3 | (l)<-[r:WORKS_IN]-(p) |             15 |   15 |      26 |                |                        |           |                     |
| |                +----+-----------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan |  4 | l:Location            |             10 |   10 |      11 |            120 |                    4/0 |     0.287 | Fused in Pipeline 0 |
+------------------+----+-----------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 95, total allocated memory: 432

有序 Distinct

OrderedDistinct 运算符是 Distinct 运算符的优化,它利用了传入行的排序。 此运算符与 Distinct 运算符相比,系统中的内存压力更低。

示例 91. OrderedDistinct
查询
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN DISTINCT p.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Filter 运算符过滤来自子运算符的每一行,仅将评估谓词为 true 的行传递。

示例 92. Filter
查询
PROFILE
MATCH (p:Person)
WHERE p.name =~ '^a.*'
RETURN p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Limit 运算符从传入的输入中返回前 n 行。

示例 93. Limit
查询
PROFILE
MATCH (p:Person)
RETURN p
LIMIT 3
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Skip 运算符从传入的行中跳过 n 行。

示例 94. Skip
查询
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.id
SKIP 1
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Sort 运算符按提供的键对行进行排序。 为了对数据进行排序,需要从源运算符中急切地拉入所有数据并将其保存在查询状态中,这会导致系统中的内存压力增加。

示例 95. Sort
查询
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| Operator         | Details            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline            |
+------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+
| +ProduceResults  | 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

部分排序

PartialSort 运算符是 Sort 运算符的优化,它利用了传入行的排序。 此运算符使用延迟评估,并且与 Sort 运算符相比,系统中的内存压力更低。 部分排序仅在按多列排序时适用。

示例 96. PartialSort
查询
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p
ORDER BY p.name, p.age
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Top 运算符按提供的键返回排序后的前 n 行。 它不会排序整个输入,而仅保留前 n 行。

示例 97. Top
查询
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
LIMIT 2
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

部分 Top

PartialTop 运算符是 Top 运算符的优化,它利用了传入行的排序。 此运算符使用延迟评估,并且与 Top 运算符相比,系统中的内存压力更低。 部分 Top 仅在按多列排序时适用。

示例 98. PartialTop
查询
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p
ORDER BY p.name, p.age
LIMIT 2
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

Union 运算符将右子运算符的结果与左子运算符的结果连接起来。

示例 99. Union
查询
PROFILE
MATCH (p:Location)
  RETURN p.name
UNION ALL
MATCH (p:Country)
  RETURN p.name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+--------------------+----+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator           | Id | Details            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+--------------------+----+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults    |  0 | `p.name`           |             20 |    0 |       0 |                |                        |           |                     |
| |                  +----+--------------------+----------------+------+---------+----------------+                        |           |                     |
| +Union             |  1 |                    |             20 |    0 |       0 |              0 |                    0/0 |     0.000 | Fused in Pipeline 2 |
| |\                 +----+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Projection      |  2 | `p.name`           |             10 |    0 |       0 |                |                        |           |                     |
| | |                +----+--------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Projection      |  3 | p.name AS `p.name` |             10 |    0 |       0 |                |                        |           |                     |
| | |                +----+--------------------+----------------+------+---------+----------------+                        |           |                     |
| | +NodeByLabelScan |  4 | p:Country          |             10 |    0 |       0 |            120 |                    0/0 |     0.049 | Fused in Pipeline 1 |
| |                  +----+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Projection        |  5 | `p.name`           |             10 |    0 |       0 |                |                        |           |                     |
| |                  +----+--------------------+----------------+------+---------+----------------+                        |           |                     |
| +Projection        |  6 | p.name AS `p.name` |             10 |    0 |       0 |                |                        |           |                     |
| |                  +----+--------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan   |  7 | p:Location         |             10 |    0 |       0 |            120 |                    0/0 |     0.077 | Fused in Pipeline 0 |
+--------------------+----+--------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 0, total allocated memory: 320

Unwind

Unwind 运算符为列表中的每个项目返回一行。

示例 100. Unwind
查询
PROFILE
UNWIND range(1, 5) AS value
RETURN value
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

分区 Unwind

PartitionedUnwindUnwind 运算符的一种变体,由 并行运行时 使用。它允许将索引划分为不同的段,每个段可以独立并行扫描。

示例 101. PartitionedUnwind
查询
CYPHER runtime=parallel
PROFILE
UNWIND range(1, 5) AS value
RETURN value
查询计划
Planner COST

Runtime PARALLEL

Runtime version 5.25

Batch size 128

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

Total database accesses: 0

完全限制

ExhaustiveLimit 运算符类似于 Limit 运算符,但它将始终耗尽输入。在组合 LIMIT 和更新时使用。

示例 102. ExhaustiveLimit
查询
PROFILE
MATCH (p:Person)
SET p.seen = true
RETURN p
LIMIT 3
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+----+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Id | Details       | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |  0 | p             |              3 |    3 |      10 |              0 |                        |           |                     |
| |                +----+---------------+----------------+------+---------+----------------+                        |           |                     |
| +ExhaustiveLimit |  1 | 3             |              3 |    3 |       0 |             32 |                        |           |                     |
| |                +----+---------------+----------------+------+---------+----------------+                        |           |                     |
| +SetProperty     |  2 | p.seen = true |             17 |   17 |      34 |                |                        |           |                     |
| |                +----+---------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan |  3 | p:Person      |             17 |   17 |      18 |            240 |                    3/0 |     1.966 | Fused in Pipeline 0 |
+------------------+----+---------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 62, total allocated memory: 304

可选

Optional 运算符用于解决某些 OPTIONAL MATCH 查询。它将从其源中提取数据,如果存在任何数据,则简单地将其传递。但是,如果其源未返回任何数据,则 Optional 将生成一个所有列都设置为 null 的单行。

示例 103. Optional
查询
PROFILE
MATCH (p:Person {name: 'me'})
OPTIONAL MATCH (q:Person {name: 'Lulu'})
RETURN p, q
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

投影端点

ProjectEndpoints 运算符投影关系的起始节点和结束节点。

示例 104. ProjectEndpoints
查询
PROFILE
CREATE (n)-[p:KNOWS]->(m)
WITH p AS r
MATCH (u)-[r]->(v)
RETURN u, v
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+---------------------+----+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator            | Id | Details                                 | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+---------------------+----+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults     |  0 | u, v                                    |              1 |    1 |       2 |              0 |                        |           |                     |
| |                   +----+-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Apply              |  1 |                                         |              1 |    1 |       0 |                |                        |           |                     |
| |\                  +----+-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +ProjectEndpoints |  2 | (u)-[r]->(v)                            |              1 |    1 |       0 |                |                        |           |                     |
| | |                 +----+-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| | +Argument         |  3 | r                                       |              1 |    1 |       0 |           4328 |                    0/0 |     0.194 | Fused in Pipeline 2 |
| |                   +----+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Eager              |  4 | read/create conflict (Operator: 6 vs 2) |              1 |    1 |       0 |            368 |                    0/0 |     0.025 | In Pipeline 1       |
| |                   +----+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Projection         |  5 | p AS r                                  |              1 |    1 |       0 |                |                        |           |                     |
| |                   +----+-----------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Create             |  6 | (n), (m), (n)-[p:KNOWS]->(m)            |              1 |    1 |       3 |                |                    0/0 |     0.000 | Fused in Pipeline 0 |
+---------------------+----+-----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 5, total allocated memory: 4920

投影

对于每个传入行,Projection 运算符都会评估一组表达式,并生成一个包含表达式结果的行。

示例 105. Projection
查询
PROFILE
RETURN 'hello' AS greeting
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

最短路径

ShortestPath 运算符在两个先前匹配的节点变量之间查找一个或所有最短路径。此运算符用于 shortestPath()allShortestPaths 函数。

示例 106. ShortestPath
查询
PROFILE
MATCH
  (andy:Person {name: 'Andy'}),
  (mattias:Person {name: 'Mattias'}),
  p = shortestPath((andy)-[*]-(mattias))
RETURN p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

StatefulShortestPath(Into)

StatefulShortestPath(Into) 运算符查找从起始节点到单个目标节点的最短路径。它使用双向广度优先搜索 (BFS) 算法,该算法同时执行两次 BFS 调用,一次从左侧边界节点,一次从右侧边界节点。一旦两个 BFS 调用都找到一个节点,这表明它可以从两个边界节点到达,算法将成功终止。如果其中一个 BFS 调用在相交之前耗尽了其搜索,无论是由于无法再到达任何其他节点还是因为已达到最大跳数,那么在边界节点之间不存在有效路径,算法将终止。

示例 107. StatefulShortestPath(Into)
查询
PROFILE
MATCH
  p = ALL SHORTEST (chris:Person {name: 'Chris'})(()-[]-()-[]-()){1,}(stefan:Person {name: 'Stefan'})
RETURN p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------------------+----+--------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator                    | Id | Details                                                                                          | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+-----------------------------+----+--------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults             |  0 | p                                                                                                |              2 |    2 |       0 |              0 |                    0/0 |     0.039 |               |
| |                           +----+--------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+               |
| +Projection                 |  1 | (chris) ((anon_12)-[anon_14]-(anon_13)-[anon_11]-())* (stefan) AS p                              |              2 |    2 |       0 |                |                    0/0 |     1.365 |               |
| |                           +----+--------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+               |
| +StatefulShortestPath(Into) |  2 | SHORTEST 1 GROUPS (chris) ((`anon_5`)-[`anon_6`]-(`anon_7`)-[`anon_8`]-(`anon_9`)){1, } (stefan) |              2 |    2 |      39 |          22237 |                    1/0 |    37.376 | In Pipeline 1 |
| |                           +----+--------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +MultiNodeIndexSeek         |  3 | UNIQUE chris:Person(name) WHERE name = $autostring_0,                                            |              1 |    1 |       4 |            376 |                    1/1 |    10.245 | In Pipeline 0 |
|                             |    | UNIQUE stefan:Person(name) WHERE name = $autostring_1                                            |                |      |         |                |                        |           |               |
+-----------------------------+----+--------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 43, total allocated memory: 22557

StatefulShortestPath(All)

StatefulShortestPath(All) 运算符查找从单个节点到多个目标节点的最短路径。它使用广度优先搜索算法。

示例 108. StatefulShortestPath(All)
查询
PROFILE
MATCH
  p = ALL SHORTEST (chris:Person {name:'Chris'})(()-[]-()-[]-()){1,}(location:Location)
RETURN length(p) AS pathLength, location.name AS locationName
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+----------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| Operator                   | Id | Details                                                                                            | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline      |
+----------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +ProduceResults            |  0 | pathLength, locationName                                                                           |             14 |   20 |       0 |              0 |                    0/0 |     0.074 |               |
| |                          +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+               |
| +Projection                |  1 | length((chris) ((anon_12)-[anon_14]-(anon_13)-[anon_11]-())* (location)) AS pathLength,            |             14 |   20 |      40 |                |                    1/0 |     6.828 |               |
| |                          |    | location.name AS locationName                                                                      |                |      |         |                |                        |           |               |
| |                          +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+               |
| +StatefulShortestPath(All) |  2 | SHORTEST 1 GROUPS (chris) ((`anon_5`)-[`anon_6`]-(`anon_7`)-[`anon_8`]-(`anon_9`)){1, } (location) |             14 |   20 |     179 |          37663 |                    1/0 |    52.849 | In Pipeline 1 |
| |                          |    |         expanding from: chris                                                                      |                |      |         |                |                        |           |               |
| |                          |    |     inlined predicates: location:Location                                                          |                |      |         |                |                        |           |               |
| |                          +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+
| +NodeUniqueIndexSeek       |  3 | UNIQUE chris:Person(name) WHERE name = $autostring_0                                               |              1 |    1 |       2 |            376 |                    0/1 |     9.078 | In Pipeline 0 |
+----------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+

Total database accesses: 221, total allocated memory: 37983

空行

EmptyRow 运算符返回一个没有列的单行。

示例 109. EmptyRow
查询
PROFILE
CYPHER runtime=slotted
FOREACH (value IN [1,2,3] | MERGE (:Person {age: value}))
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+--------------------------------------+----------------+------+---------+------------------------+
| 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

过程调用

ProcedureCall 运算符表示对过程的调用。

示例 110. ProcedureCall
查询
PROFILE
CALL db.labels() YIELD label
RETURN *
ORDER BY label
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

缓存属性

CacheProperties 运算符读取节点和关系属性,并将它们缓存在当前行中。将来访问这些属性可以避免从存储中读取,这将加快查询速度。在下面的计划中,我们将在 Expand(All) 之前缓存 l.name,因为那里只有几行。

示例 111. CacheProperties
查询
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN
  l.name AS location,
  p.name AS name
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+------------------+----+-------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator         | Id | Details                                   | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+------------------+----+-------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults  |  0 | location, name                            |             13 |   13 |       0 |                |                        |           |                     |
| |                +----+-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Projection      |  1 | cache[l.name] AS location, p.name AS name |             13 |   13 |      26 |                |                        |           |                     |
| |                +----+-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Filter          |  2 | p:Person                                  |             13 |   13 |      26 |                |                        |           |                     |
| |                +----+-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Expand(All)     |  3 | (l)<-[anon_0:WORKS_IN]-(p)                |             13 |   13 |      24 |                |                        |           |                     |
| |                +----+-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +CacheProperties |  4 | cache[l.name]                             |             10 |   10 |      20 |                |                        |           |                     |
| |                +----+-------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeByLabelScan |  5 | l:Location                                |             10 |   10 |      11 |            120 |                    4/0 |     0.344 | Fused in Pipeline 0 |
+------------------+----+-------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 107, total allocated memory: 200

创建(节点和关系)

Create 运算符用于创建节点和关系。

示例 112. Create
查询
PROFILE
CREATE
  (max:Person {name: 'Max'}),
  (chris:Person {name: 'Chris'})
CREATE (max)-[:FRIENDS_WITH]->(chris)
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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 运算符用于删除节点或关系。

示例 113. Delete
查询
PROFILE
MATCH (you:Person {name: 'you'})
DELETE you
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Id | Details                                                | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |  0 |                                                        |              0 |    0 |       0 |                |                        |           |                     |
| |               +----+--------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |  1 |                                                        |              0 |    0 |       0 |                |                        |           |                     |
| |               +----+--------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +Delete         |  2 | you                                                     |              0 |    0 |       0 |                |                        |           |                     |
| |               +----+--------------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +NodeIndexSeek  |  3 | RANGE INDEX you:Person(name) WHERE name = $autostring_0 |              0 |    0 |       1 |            120 |                    1/0 |     0.330 | Fused in Pipeline 0 |
+-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 13, total allocated memory: 216

分离删除

DetachDelete 运算符在所有包含 DETACH DELETE 子句的查询中使用,用于删除节点及其关系。

示例 114. DetachDelete
查询
PROFILE
MATCH (p:Person)
DETACH DELETE p
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

设置标签

SetLabels 运算符用于在节点上设置标签。

示例 115. SetLabels
查询
PROFILE
MATCH (n)
SET n:Person
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

删除标签

RemoveLabels 运算符用于从节点中删除标签。

示例 116. RemoveLabels
查询
PROFILE
MATCH (n)
REMOVE n:Person
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

从映射设置节点属性

SetNodePropertiesFromMap 运算符用于在节点上从映射设置属性。

示例 117. SetNodePropertiesFromMap
查询
PROFILE
MATCH (n)
SET n = {weekday: 'Monday', meal: 'Lunch'}
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

从映射设置关系属性

SetRelationshipPropertiesFromMap 运算符用于在关系上从映射设置属性。

示例 118. SetRelationshipPropertiesFromMap
查询
PROFILE
MATCH (n)-[r]->(m)
SET r = {weight: 5, unit: 'kg'}
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

设置属性

SetProperty 运算符用于在节点或关系上设置属性。

示例 119. SetProperty
查询
PROFILE
MATCH (n)
SET n.checked = true
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

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

设置属性

SetProperties 运算符用于在节点或关系上设置多个属性。

示例 120. SetProperties
查询
PROFILE
MATCH (n)
SET n.weekDay = 'Monday', n.meal = 'Lunch'
查询计划
Planner COST

Runtime PIPELINED

Runtime version 5.25

Batch size 128

+-----------------+----+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator        | Id | Details                                           | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline            |
+-----------------+----+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults |  0 |                                                   |             35 |    0 |       0 |              0 |                        |           |                     |
| |               +----+---------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +EmptyResult    |  1 |                                                   |             35 |    0 |       0 |                |                        |           |                     |
| |               +----+---------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +SetProperties  |  2 | n.weekDay = $autostring_0, n.meal = $autostring_1 |             35 |   35 |     105 |                |                        |           |                     |
| |               +----+---------------------------------------------------+----------------+------+---------+----------------+                        |           |                     |
| +AllNodesScan   |  3 | n                                                 |             35 |   35 |      36 |            248 |                    3/0 |   152.289 | Fused in Pipeline 0 |
+-----------------+----+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+

Total database accesses: 141, total allocated memory: 312

创建约束

CreateConstraint 运算符创建约束。

此约束可以具有任何可用的约束类型。

  • 属性唯一性约束

  • 属性存在约束 企业版

  • 属性类型约束 企业版

  • 节点或关系键约束 企业版

以下查询将在具有 Country 标签的节点的 name 属性上创建名称为 uniqueness 的属性唯一性约束。

示例 121. CreateConstraint
查询
PROFILE
CREATE CONSTRAINT uniqueness
FOR (c:Country) REQUIRE c.name is UNIQUE
查询计划
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.25

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

Total database accesses: ?

如果存在(约束)则不执行任何操作

为了避免在创建相同的约束时出现错误,我们对约束使用 DoNothingIfExists 运算符。这将确保在特定 CreateConstraint 运算符创建约束之前,不存在具有给定名称的其他约束或具有相同类型和架构的其他约束。如果找到具有给定名称或具有相同类型和架构的约束,它将停止执行,并且不会创建新约束。以下查询将在具有 Country 标签的节点的 name 属性上创建名称为 uniqueness 的属性唯一性约束,前提是在 (:Country {name}) 上不存在名为 uniqueness 或属性唯一性约束的其他约束。

示例 122. DoNothingIfExists(约束)
查询
PROFILE
CREATE CONSTRAINT uniqueness IF NOT EXISTS
FOR (c:Country) REQUIRE c.name is UNIQUE
查询计划
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.25

+--------------------------------+------------------------------------------------------------------+
| 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: ?

删除约束

DropConstraint 运算符使用约束的名称删除约束,无论其类型如何。

示例 123. DropConstraint
查询
PROFILE
DROP CONSTRAINT uniqueness IF EXISTS
查询计划
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.25

+-----------------+---------------------------------+
| Operator        | Details                         |
+-----------------+---------------------------------+
| +DropConstraint | CONSTRAINT uniqueness IF EXISTS |
+-----------------+---------------------------------+

Total database accesses: ?

显示约束

ShowConstraints 运算符列出约束。它可能包括对约束类型的过滤,并且可以具有默认输出或完整输出。

示例 124. ShowConstraints
查询
PROFILE
SHOW CONSTRAINTS
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+
| 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

创建索引

CreateIndex 运算符创建索引。

此索引可以是全文索引、点索引、范围索引、文本索引、向量索引或查找索引。

示例 125. CreateIndex

以下查询将在具有 Country 标签的节点的 name 属性上创建名称为 my_index 的索引。

查询
PROFILE
CREATE INDEX my_index
FOR (c:Country) ON (c.name)
查询计划
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.25

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

Total database accesses: ?

如果存在(索引)则不执行任何操作

为了避免在创建相同的索引时出现错误,我们对索引使用 DoNothingIfExists 运算符。这将确保在 CreateIndex 运算符创建索引之前,不存在具有给定名称或架构的其他索引。如果找到具有给定名称或架构的索引,它将停止执行,并且不会创建新索引。以下查询将在具有 KNOWS 关系类型的关系的 since 属性上创建名称为 my_index 的索引,前提是不存在此类索引。

示例 126. DoNothingIfExists(索引)
查询
PROFILE
CREATE INDEX my_index IF NOT EXISTS
FOR ()-[k:KNOWS]-() ON (k.since)
查询计划
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.25

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

Total database accesses: ?

删除索引

DropIndex 运算符使用索引的名称删除索引。

示例 127. DropIndex
查询
PROFILE
DROP INDEX my_index
查询计划
Planner ADMINISTRATION

Runtime SCHEMA

Runtime version 5.25

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

Total database accesses: ?

显示索引

ShowIndexes 运算符列出索引。它可能包括对索引类型的过滤,并且可以具有默认输出或完整输出。

示例 128. ShowIndexes
查询
PROFILE
SHOW INDEXES
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| 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

显示函数

ShowFunctions 运算符列出函数。它可能包括对内置函数与用户定义函数的过滤,以及给定用户是否可以执行该函数的过滤。输出可以是默认输出或完整输出。

示例 129. ShowFunctions
查询
PROFILE
SHOW FUNCTIONS
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+
| 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

显示过程

ShowProcedures 运算符列出过程。它可能包括对给定用户是否可以执行该过程的过滤,并且可以具有默认输出或完整输出。

示例 130. ShowProcedures
查询
PROFILE
SHOW PROCEDURES
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+----------------------------------------+----------------+------+---------+------------------------+
| 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

显示设置

ShowSettings 运算符列出配置设置。

示例 131. ShowSettings
查询
PROFILE
SHOW SETTINGS
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-----------------+---------------------------------------------------+----------------+------+---------+------------------------+
| Operator        | Details                                           | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses |
+-----------------+---------------------------------------------------+----------------+------+---------+------------------------+
| +ProduceResults | name, value, isDynamic, defaultValue, description |             10 |  264 |       0 |                    0/0 |
| |               +---------------------------------------------------+----------------+------+---------+------------------------+
| +ShowSettings   | allSettings, defaultColumns                       |             10 |  264 |       0 |                    0/0 |
+-----------------+---------------------------------------------------+----------------+------+---------+------------------------+

Total database accesses: 0, total allocated memory: 64

显示事务

ShowTransactions 运算符列出事务。它可能包括对给定 ID 的过滤,并且可以具有默认输出或完整输出。

示例 132. ShowTransactions
查询
PROFILE
SHOW TRANSACTIONS
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| 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

终止事务

TerminateTransactions 运算符按 ID 终止事务。

示例 133. TerminateTransactions
查询
PROFILE
TERMINATE TRANSACTIONS 'database-transaction-123'
查询计划
Planner COST

Runtime SLOTTED

Runtime version 5.25

+------------------------+--------------------------------------------------------+----------------+------+---------+------------------------+
| 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