运算符详解
理解执行计划中不同操作符的作用,是提高查询效率的重要一步。本页面包含了 Cypher® 规划器所使用的每个操作符的详细信息和示例。关于 Cypher 规划器如何使用操作符的概述,请参阅 理解执行计划 → 阅读执行计划。
操作符根据其在执行 Cypher 查询时所履行的职责分为多个类别:
| 某些操作符仅由特定的 运行时 (runtime) 使用。如果是这样,示例查询将以运行时选择作为前缀。 |
叶子操作符(扫描与查找)
叶子操作符是查询执行计划中的初始操作,它们直接访问数据。之所以被称为“叶子”,是因为它们处于查询执行树的最外层,下方没有其他操作。一旦这些操作符检索到必要的数据,结果就会传递给随后执行更复杂操作的操作符。
查找 (Seek) 操作符针对特定的数据项(索引或其他),而扫描 (Scan) 操作符则遍历数据(索引或其他)以查找匹配项。
所有节点扫描 (All Nodes Scan)
AllNodesScan 操作符从节点存储中读取所有节点。包含这些节点的变量可以在参数中看到。在非平凡数据库上,任何使用此操作符的查询都可能遇到性能问题。
PROFILE
MATCH (n)
RETURN n
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区所有节点扫描 (Partitioned All Nodes Scan)
PartitionedAllNodesScan 是 并行运行时 使用的 AllNodesScan 操作符的一种变体。它允许将存储分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (n)
RETURN n
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按标签节点扫描 (Node By Label Scan)
NodeByLabelScan 操作符从节点标签索引中获取所有具有特定标签的节点。
PROFILE
MATCH (person:Person)
RETURN person
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按标签节点扫描 (Partitioned Node By Label Scan)
PartitionedNodeByLabelScan 是 并行运行时 使用的 NodeByLabelScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (person:Person)
RETURN person
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按标签交集节点扫描 (Intersection Node By Labels Scan)
IntersectionNodeByLabelsScan 操作符从节点标签索引中获取所有包含所提供所有标签的节点。
PROFILE
MATCH (countryAndLocation:Country&Location)
RETURN countryAndLocation
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按标签交集节点扫描 (Partitioned Intersection Node By Labels Scan)
PartitionedIntersectionNodeByLabelsScan 是 并行运行时 使用的 IntersectionNodeByLabelsScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (countryAndLocation:Country&Location)
RETURN countryAndLocation
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按标签差集节点扫描 (Subtraction Node By Labels Scan)
SubtractionNodeByLabelsScan 操作符从节点标签索引中获取所有包含第一组所提供标签,但不包含第二组所提供标签的节点。在下面的示例中,SubtractionNodeByLabelsScan 检索所有具有 Location 标签但没有 Country 标签的节点。
PROFILE
MATCH (locationNotCountry:Location&!Country)
RETURN locationNotCountry
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按标签差集节点扫描 (Partitioned Subtraction Node By Labels Scan)
PartitionedSubtractionNodeByLabelsScan 是 并行运行时 使用的 SubtractionNodeByLabelsScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (locationNotCountry:Location&!Country)
RETURN locationNotCountry
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按标签并集节点扫描 (Union Node By Labels Scan)
UnionNodeByLabelsScan 操作符从节点标签索引中获取所有至少包含一个所提供标签的节点。
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按标签并集节点扫描 (Partitioned Union Node By Labels Scan)
PartitionedUnionNodeByLabelsScan 是 并行运行时 使用的 UnionNodeByLabelsScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
Planner COST Runtime PARALLEL Runtime version 2026.03 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
节点索引包含扫描 (Node Index Contains Scan)
NodeIndexContainsScan 操作符检查存储在索引中的所有值,搜索包含特定 STRING 的条目;例如在包含 CONTAINS 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但仍然比使用 NodeByLabelScan 进行标签扫描加上属性存储过滤所导致的间接寻址要快。
PROFILE
MATCH (l:Location)
WHERE l.name CONTAINS 'al'
RETURN l
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | l | 0 | 2 | 0 | | | | | | | +---------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeIndexContainsScan | TEXT INDEX l:Location(name) WHERE name CONTAINS $autostring_0 | 0 | 2 | 3 | 120 | 2/0 | 1.305 | Fused in Pipeline 0 | +------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 3, total allocated memory: 184
节点索引以…结尾扫描 (Node Index Ends With Scan)
NodeIndexEndsWithScan 操作符检查存储在索引中的所有值,搜索以特定 STRING 结尾的条目;例如在包含 ENDS WITH 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但仍然比使用 NodeByLabelScan 进行标签扫描加上属性存储过滤所导致的间接寻址要快。
PROFILE
MATCH (l:Location)
WHERE l.name ENDS WITH 'al'
RETURN l
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | l | 0 | 0 | 0 | | | | | | | +----------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeIndexEndsWithScan | TEXT INDEX l:Location(name) WHERE name ENDS WITH $autostring_0 | 0 | 0 | 1 | 120 | 0/0 | 4.409 | Fused in Pipeline 0 | +------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
节点索引扫描 (Node Index Scan)
NodeIndexScan 操作符检查存储在索引中的所有值,返回所有具有特定标签和指定属性的节点。
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区节点索引扫描 (Partitioned Node Index Scan)
PartitionedNodeIndexScan 是 并行运行时 使用的 NodeIndexScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按元素ID查找节点 (Node By ElementId Seek)
NodeByElementIdSeek 操作符通过函数 elementId() 指定的 ID,从节点存储中读取一个或多个节点。
PROFILE
MATCH (n)
WHERE elementId(n) = 0
RETURN n
Planner COST Runtime PIPELINED Runtime version 2026.03 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查找节点 (Node By Id Seek)
NodeByIdSeek 操作符通过函数 id() 指定的 ID,从节点存储中读取一个或多个节点。
PROFILE
MATCH (n)
WHERE id(n) = 0
RETURN n
Planner COST Runtime PIPELINED Runtime version 2026.03 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
节点索引查找 (Node Index Seek)
NodeIndexSeek 操作符使用索引查找来查找节点。节点变量和使用的索引显示在操作符的参数中。如果索引支持 属性唯一性约束,则该操作符称为 NodeUniqueIndexSeek。
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区节点索引查找 (Partitioned Node Index Seek)
PartitionedNodeIndexSeek 是 并行运行时 使用的 NodeIndexSeek 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
Planner COST Runtime PARALLEL Runtime version 2026.03 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
节点唯一索引查找 (Node Unique Index Seek)
NodeUniqueIndexSeek 操作符在一个支持 属性唯一性约束 的索引内使用索引查找来查找节点。节点变量和使用的索引显示在操作符的参数中。如果索引不支持属性唯一性约束,则该操作符称为 NodeIndexSeek。如果使用索引查找来求解 MERGE 子句,它也会被标记为 (Locking)。这表明从索引返回的任何节点都将被锁定,以防止并发冲突更新。
PROFILE
MATCH (t:Team {name: 'Malmo'})
RETURN t
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | t | 1 | 0 | 0 | | | | | | | +------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeUniqueIndexSeek | UNIQUE t:Team(name) WHERE name = $autostring_0 | 1 | 0 | 1 | 120 | 0/1 | 0.280 | Fused in Pipeline 0 | +----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
多节点索引查找 (Multi Node Index Seek)
MultiNodeIndexSeek 操作符使用多个索引查找来查找节点。它支持在查询中为不同节点使用多个不同的索引。节点变量和使用的索引显示在操作符的参数中。
该操作符产生所有索引查找的笛卡尔积。例如,如果操作符执行了两次查找,第一次查找找到节点 a1, a2,第二次找到 b1, b2, b3,则 MultiNodeIndexSeek 将产生行 (a1, b1), (a1, b2), (a1, b3), (a2, b1), (a2, b2), (a2, b3)。
PROFILE
CYPHER runtime=pipelined
MATCH
(location:Location {name: 'Malmo'}),
(person:Person {name: 'Bob'})
RETURN location, person
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | location, person | 1 | 1 | 0 | | | | | | | +-----------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +MultiNodeIndexSeek | RANGE INDEX location:Location(name) WHERE name = $autostring_0, | 1 | 0 | 0 | 120 | 2/2 | 1.910 | Fused in Pipeline 0 | | | RANGE INDEX person:Person(name) WHERE name = $autostring_1 | | | | | | | | +---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 0, total allocated memory: 184
断言多节点索引查找 (Asserting Multi Node Index Seek)
AssertingMultiNodeIndexSeek 操作符用于确保不违反任何 属性唯一性约束。该示例查找具有所提供名称和 ID 的团队,如果不存在,则创建一个。由于 :Team(name) 和 :Team(id) 上存在两个属性唯一性约束,因此 UniqueIndexSeek 操作符找到的任何节点必须是同一个节点,否则将违反约束。
PROFILE
MERGE (t:Team {name: 'Engineering', id: 42})
Planner COST
Runtime PIPELINED
Runtime version 2026.03
Batch size 128
+------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline |
+------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | | 1 | 0 | 0 | | | | |
| | +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| +EmptyResult | | 1 | 0 | 0 | | | | |
| | +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| +Merge | CREATE (t:Team {name: $autostring_0, id: $autoint_1}) | 1 | 1 | 0 | | | | |
| | +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| +AssertingMultiNodeIndexSeek | UNIQUE t:Team(name) WHERE name = $autostring_0, UNIQUE t:Team(id) WHERE id = $autoint_1 | 0 | 2 | 4 | 120 | 0/2 | 1.584 | Fused in Pipeline 0 |
+------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
Total database accesses: 4, total allocated memory: 184
按范围节点索引查找 (Node Index Seek By Range)
NodeIndexSeekByRange 操作符使用索引查找来查找节点,其中属性值与给定的前缀 STRING 匹配。NodeIndexSeekByRange 可用于 STARTS WITH 以及比较运算符,如 <, >, <= 和 >=。如果索引是唯一索引,则该操作符称为 NodeUniqueIndexSeekByRange。
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按范围节点索引查找 (Partitioned Node Index Seek By Range)
PartitionedNodeIndexSeekByRange 是 并行运行时 使用的 NodeIndexSeekByRange 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按范围节点唯一索引查找 (Node Unique Index Seek By Range)
NodeUniqueIndexSeekByRange 操作符在唯一索引内使用索引查找来查找节点,其中属性值与给定的前缀 STRING 匹配。NodeUniqueIndexSeekByRange 用于 STARTS WITH 以及比较运算符,如 <, >, <= 和 >=。如果索引不是唯一的,则该操作符称为 NodeIndexSeekByRange。
PROFILE
MATCH (t:Team)
WHERE t.name STARTS WITH 'Ma'
RETURN t
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | t | 2 | 0 | 0 | | | | | | | +----------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeUniqueIndexSeekByRange | UNIQUE t:Team(name) WHERE name STARTS WITH $autostring_0 | 2 | 0 | 1 | 120 | 1/0 | 0.623 | Fused in Pipeline 0 | +-----------------------------+----------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
节点向量索引搜索 (Node Vector Index Search)
NodeVectorIndexSearch 操作符在向量索引中搜索相似的向量嵌入。
PROFILE
MATCH (movie:Movie)
SEARCH movie IN (
VECTOR INDEX moviePlots
FOR vector([1, 2, 3], 3, INTEGER)
LIMIT 4
)
RETURN movie.title AS title
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+---------------+ | +ProduceResults | 0 | title | 10 | 0 | 0 | 0 | | | | | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +---------------+ | +Projection | 1 | movie.title AS title | 10 | 0 | 0 | | | | | | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +---------------+ | +NodeVectorIndexSearch | 2 | SEARCH movie IN (VECTOR INDEX moviePlots FOR RuntimeConstant(vector($autolist_0, $autoint_1, INTEGER | 10 | 0 | 1 | 248 | 0/0 | 1.364 | Fused in Pipeline 0 | moviePlots: 1 | | | | NOT NULL)) LIMIT 4) | | | | | | | | | +------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+---------------+ Total database accesses: 1, total allocated memory: 312
有向所有关系扫描 (Directed All Relationships Scan)
DirectedAllRelationshipsScan 操作符获取数据库中的所有关系及其起始节点和终止节点。
PROFILE
MATCH ()-[r]->() RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区有向所有关系扫描 (Partitioned Directed All Relationships Scan)
PartitionedDirectedAllRelationshipsScan 是 并行运行时 使用的 DirectedAllRelationshipsScan 操作符的一种变体。它允许将存储分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r]->() RETURN r
Planner COST Runtime PARALLEL Runtime version 2026.03 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
无向所有关系扫描 (Undirected All Relationships Scan)
UndirectedAllRelationshipsScan 操作符获取数据库中的所有关系及其起始节点和终止节点。
PROFILE
MATCH ()-[r]-() RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区无向所有关系扫描 (Partitioned Undirected All Relationships Scan)
PartitionedUndirectedAllRelationshipsScan 是 并行运行时 使用的 UndirectedAllRelationshipsScan 操作符的一种变体。它允许将存储分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r]-() RETURN r
Planner COST Runtime PARALLEL Runtime version 2026.03 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
有向关系类型扫描 (Directed Relationship Type Scan)
DirectedRelationshipTypeScan 操作符从关系类型索引中获取所有具有特定类型的关系及其起始节点和终止节点。
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区有向关系类型扫描 (Partitioned Directed Relationship Type Scan)
PartitionedDirectedRelationshipTypeScan 是 并行运行时 使用的 DirectedRelationshipTypeScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
Planner COST Runtime PARALLEL Runtime version 2026.03 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
无向关系类型扫描 (Undirected Relationship Type Scan)
UndirectedRelationshipTypeScan 操作符从关系类型索引中获取所有具有特定类型的关系及其起始节点和终止节点。
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区无向关系类型扫描 (Partitioned Undirected Relationship Type Scan)
PartitionedUndirectedRelationshipTypeScan 是 并行运行时 使用的 UndirectedRelationshipTypeScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
Planner COST Runtime PARALLEL Runtime version 2026.03 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
有向关系索引搜索 (Directed Relationship Index Search)
DirectedRelationshipVectorIndexSearch 操作符在向量索引中搜索相似的向量嵌入。
PROFILE
MATCH ()-[r:REVIEWED]->()
SEARCH r IN (
VECTOR INDEX reviews
FOR vector([1, 2, 3], 3, INTEGER)
WHERE r.rating >= 3
LIMIT 4
)
RETURN r.content AS content, r.rating AS rating
Planner COST Runtime PIPELINED Runtime version 2026.04 Batch size 128 +----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ | +ProduceResults | 0 | content, rating | 1 | 0 | 0 | 0 | | | | | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +--------------+ | +Projection | 1 | r.content AS content, cache[r.rating] AS rating | 1 | 0 | 0 | | | | | | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +--------------+ | +DirectedRelationshipVectorIndexSearch | 2 | SEARCH ()-[r:REVIEWED]->() IN (VECTOR INDEX reviews FOR RuntimeConstant(vector($autolist_0, $autoint | 1 | 0 | 1 | 248 | 0/0 | 0.548 | Fused in Pipeline 0 | reviews: 1 | | | | _1, INTEGER NOT NULL)) WHERE rating >= $autoint_2 LIMIT 4) | | | | | | | | | +----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ Total database accesses: 1, total allocated memory: 312
无向关系索引搜索 (Undirected Relationship Index Search)
UndirectedRelationshipVectorIndexSearch 操作符在向量索引中搜索相似的向量嵌入。
PROFILE
MATCH ()-[r:REVIEWED]-()
SEARCH r IN (
VECTOR INDEX reviews
FOR vector([1, 2, 3], 3, INTEGER)
WHERE r.rating >= 3
LIMIT 4
)
RETURN r.content AS content, r.rating AS rating
Planner COST Runtime PIPELINED Runtime version 2026.04 Batch size 128 +------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ | +ProduceResults | 0 | content, rating | 2 | 0 | 0 | 0 | | | | | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +--------------+ | +Projection | 1 | r.content AS content, cache[r.rating] AS rating | 2 | 0 | 0 | | | | | | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +--------------+ | +UndirectedRelationshipVectorIndexSearch | 2 | SEARCH ()-[r:REVIEWED]-() IN (VECTOR INDEX reviews FOR RuntimeConstant(vector($autolist_0, $autoint_ | 2 | 0 | 1 | 248 | 0/0 | 0.553 | Fused in Pipeline 0 | reviews: 1 | | | | 1, INTEGER NOT NULL)) WHERE rating >= $autoint_2 LIMIT 4) | | | | | | | | | +------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ Total database accesses: 1, total allocated memory: 312
有向联合关系类型扫描 (Directed Union Relationship Types Scan)
DirectedUnionRelationshipTypesScan 操作符从关系类型索引中获取所有至少具有一个所提供类型的关系及其起始节点和终止节点。
| 随着块存储格式成为默认格式,此操作符将停止用于生成计划。请参考 操作手册 → 存储格式 以获取有关可用各种存储格式的详细信息。 |
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区有向联合关系类型扫描 (Partitioned Directed Union Relationship Types Scan)
PartitionedDirectedUnionRelationshipTypeScan 是 并行运行时 使用的 DirectedUnionRelationshipTypesScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
| 随着块存储格式成为默认格式,此操作符将停止用于生成计划。请参考 操作手册 → 存储格式 以获取有关可用各种存储格式的详细信息。 |
CYPHER runtime=parallel
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
Planner COST Runtime PARALLEL Runtime version 2026.03 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
无向联合关系类型扫描 (Undirected Union Relationship Types Scan)
UndirectedUnionRelationshipTypesScan 操作符从关系类型索引中获取所有至少具有一个所提供类型的关系及其起始节点和终止节点。
| 随着块存储格式成为默认格式,此操作符将停止用于生成计划。请参考 操作手册 → 存储格式 以获取有关可用各种存储格式的详细信息。 |
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区无向联合关系类型扫描 (Partitioned Undirected Union Relationship Types Scan)
PartitionedUndirectedUnionRelationshipTypeScan 是 并行运行时 使用的 UndirectedUnionRelationshipTypesScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
| 随着块存储格式成为默认格式,此操作符将停止用于生成计划。请参考 操作手册 → 存储格式 以获取有关可用各种存储格式的详细信息。 |
CYPHER runtime=parallel
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
Planner COST Runtime PARALLEL Runtime version 2026.03 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
有向关系索引扫描 (Directed Relationship Index Scan)
DirectedRelationshipIndexScan 操作符检查存储在索引中的所有值,返回所有具有特定关系类型和指定属性的关系及其起始节点和终止节点。
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区有向关系索引扫描 (Partitioned Directed Relationship Index Scan)
PartitionedDirectedRelationshipIndexScan 是 并行运行时 使用的 DirectedRelationshipIndexScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PARALLEL Runtime version 2026.03 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
无向关系索引扫描 (Undirected Relationship Index Scan)
UndirectedRelationshipIndexScan 操作符检查存储在索引中的所有值,返回所有具有特定关系类型和指定属性的关系及其起始节点和终止节点。
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区无向关系索引扫描 (Partitioned Undirected Relationship Index Scan)
PartitionedUndirectedRelationshipIndexScan 是 并行运行时 使用的 UndirectedRelationshipIndexScan 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PARALLEL Runtime version 2026.03 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
有向关系索引包含扫描 (Directed Relationship Index Contains Scan)
DirectedRelationshipIndexContainsScan 操作符检查存储在索引中的所有值,搜索包含特定 STRING 的条目;例如在包含 CONTAINS 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但仍然比使用 DirectedRelationshipTypeScan 进行类型扫描加上属性存储过滤所导致的间接寻址要快。
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title CONTAINS 'senior'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 4 | 0 | | | | | | | +--------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +DirectedRelationshipIndexContainsScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title CONTAINS $autostring_0 | 0 | 4 | 5 | 120 | 3/0 | 1.051 | Fused in Pipeline 0 | +----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 5, total allocated memory: 184
无向关系索引包含扫描 (Undirected Relationship Index Contains Scan)
UndirectedRelationshipIndexContainsScan 操作符检查存储在索引中的所有值,搜索包含特定 STRING 的条目;例如在包含 CONTAINS 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但仍然比使用 DirectedRelationshipTypeScan 进行类型扫描加上属性存储过滤所导致的间接寻址要快。
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title CONTAINS 'senior'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 8 | 0 | | | | | | | +-------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +UndirectedRelationshipIndexContainsScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title CONTAINS $autostring_0 | 0 | 8 | 5 | 120 | 3/0 | 2.684 | Fused in Pipeline 0 | +------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 5, total allocated memory: 184
有向关系索引以…结尾扫描 (Directed Relationship Index Ends With Scan)
DirectedRelationshipIndexEndsWithScan 操作符检查存储在索引中的所有值,搜索以特定 STRING 结尾的条目;例如在包含 ENDS WITH 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但仍然比使用 NodeByLabelScan 进行标签扫描加上属性存储过滤所导致的间接寻址要快。
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title ENDS WITH 'developer'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 8 | 0 | | | | | | | +---------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +DirectedRelationshipIndexEndsWithScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title ENDS WITH $autostring_0 | 0 | 8 | 9 | 120 | 3/0 | 1.887 | Fused in Pipeline 0 | +----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 9, total allocated memory: 184
无向关系索引以…结尾扫描 (Undirected Relationship Index Ends With Scan)
UndirectedRelationshipIndexEndsWithScan 操作符检查存储在索引中的所有值,搜索以特定 STRING 结尾的条目;例如在包含 ENDS WITH 的查询中。虽然这比索引查找慢(因为需要检查所有条目),但仍然比使用 NodeByLabelScan 进行标签扫描加上属性存储过滤所导致的间接寻址要快。
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title ENDS WITH 'developer'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 16 | 0 | | | | | | | +--------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +UndirectedRelationshipIndexEndsWithScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title ENDS WITH $autostring_0 | 0 | 16 | 9 | 120 | 3/0 | 1.465 | Fused in Pipeline 0 | +------------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 9, total allocated memory: 184
有向关系索引查找 (Directed Relationship Index Seek)
DirectedRelationshipIndexSeek 操作符使用索引查找来查找关系及其起始节点和终止节点。关系变量和使用的索引显示在操作符的参数中。
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区有向关系索引查找 (Partitioned Directed Relationship Index Seek)
PartitionedDirectedRelationshipIndexSeek 是 并行运行时 使用的 DirectedRelationshipIndexSeek 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PARALLEL Runtime version 2026.03 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
无向关系索引查找 (Undirected Relationship Index Seek)
UndirectedRelationshipIndexSeek 操作符使用索引查找来查找关系及其起始节点和终止节点。关系变量和使用的索引显示在操作符的参数中。
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区无向关系索引查找 (Partitioned Undirected Relationship Index Seek)
PartitionedUndirectedRelationshipIndexSeek 操作符使用索引查找来查找关系及其起始节点和终止节点。关系变量和使用的索引显示在操作符的参数中。
CYPHER runtime=parallel
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PARALLEL Runtime version 2026.03 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查找关系 (Directed Relationship By Element Id Seek)
DirectedRelationshipByElementIdSeek 操作符通过元素 ID 从关系存储中读取一个或多个关系(通过函数 elementId() 指定),并产生关系以及关系的源节点和目标节点。
PROFILE
MATCH (n1)-[r]->()
WHERE elementId(r) = 0
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2026.03 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查找关系 (Directed Relationship By Id Seek)
DirectedRelationshipByIdSeek 操作符通过 ID 从关系存储中读取一个或多个关系,并产生关系以及关系的源节点和目标节点。
PROFILE
MATCH (n1)-[r]->()
WHERE id(r) = 0
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2026.03 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查找关系 (Undirected Relationship By Element Id Seek)
UndirectedRelationshipByElementIdSeek 操作符通过元素 ID 从关系存储中读取一个或多个关系(通过函数 elementId() 指定)。由于方向未指定,因此通过交替起始节点和终止节点的组合,每个关系会产生两行结果。
PROFILE
MATCH (n1)-[r]-()
WHERE elementId(r) = 1
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2026.03 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查找关系 (Undirected Relationship By Id Seek)
UndirectedRelationshipByIdSeek 操作符通过 ID 从关系存储中读取一个或多个关系(通过函数 Id() 指定)。由于方向未指定,因此通过交替起始节点和终止节点的组合,每个关系会产生两行结果。
PROFILE
MATCH (n1)-[r]-()
WHERE id(r) = 1
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2026.03 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
按范围有向关系索引查找 (Directed Relationship Index Seek By Range)
DirectedRelationshipIndexSeekByRange 操作符使用索引查找来查找关系及其起始节点和终止节点,其中属性值与给定的前缀 STRING 匹配。DirectedRelationshipIndexSeekByRange 可用于 STARTS WITH 以及比较运算符,如 <, >, <= 和 >=。
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]->(location)
WHERE r.duration > 100
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按范围有向关系索引查找 (Partitioned Directed Relationship Index Seek By Range)
PartitionedDirectedRelationshipIndexSeekByRange 是 并行运行时 使用的 DirectedRelationshipIndexSeekByRange 操作符的一种变体。它允许将索引分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]->(location)
WHERE r.duration > 100
RETURN candidate
Planner COST Runtime PARALLEL Runtime version 2026.03 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
按范围无向关系索引查找 (Undirected Relationship Index Seek By Range)
UndirectedRelationshipIndexSeekByRange 操作符使用索引查找来查找关系及其起始节点和终止节点,其中属性值与给定的前缀 STRING 匹配。UndirectedRelationshipIndexSeekByRange 可用于 STARTS WITH 以及比较运算符,如 <, >, <= 和 >=。
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]-(location)
WHERE r.duration > 100
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区按范围无向关系索引查找 (Partitioned Undirected Relationship Index Seek By Range)
PartitionedUndirectedRelationshipIndexSeekByRange 是 并行运行时 使用的 UndirectedRelationshipIndexSeekByRange 操作符的一种变体。它允许将存储分区为不同的段,其中每个段都可以独立且并行地进行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]-(location)
WHERE r.duration > 100
RETURN candidate
Planner COST Runtime PARALLEL Runtime version 2026.03 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
动态标签节点查找 (Dynamic Label Node Lookup)引入于 2025.08
PROFILE
WITH "Person" AS label
MATCH (people:$(label))
RETURN people.name
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +---------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +---------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | `people.name` | 26 | 14 | 0 | 0 | | | | | | +----+------------------------------+----------------+------+---------+----------------+ | | | | +Projection | 1 | people.name AS `people.name` | 26 | 14 | 28 | | | | | | | +----+------------------------------+----------------+------+---------+----------------+ | | | | +Apply | 2 | | 26 | 14 | 0 | | | | | | |\ +----+------------------------------+----------------+------+---------+----------------+ | | | | | +DynamicLabelNodeLookup | 3 | people:$all(label) | 26 | 14 | 15 | 1832 | 2/0 | 0.366 | Fused in Pipeline 1 | | | +----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Projection | 4 | $autostring_0 AS label | 1 | 1 | 0 | | | | Fused in Pipeline 0 | +---------------------------+----+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
动态有向关系类型查找 (Dynamic Directed Relationship Type Lookup)引入于 2025.08
PROFILE
WITH "FRIENDS_WITH" AS relType
MATCH ()-[r:$(relType)]->()
RETURN count(r) as relCount
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | relCount | 1 | 1 | 0 | 0 | 0/0 | 0.022 | In Pipeline 2 | | | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +EagerAggregation | 1 | count(r) AS relCount | 1 | 1 | 0 | 40 | | | | | | +----+--------------------------+----------------+------+---------+----------------+ | | | | +Apply | 2 | | 21 | 12 | 0 | | | | | | |\ +----+--------------------------+----------------+------+---------+----------------+ | | | | | +DynamicDirectedRelationshipTypeLookup | 3 | ()-[r:$all(relType)]->() | 21 | 12 | 13 | 1968 | 2/0 | 0.359 | Fused in Pipeline 1 | | | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Projection | 4 | $autostring_0 AS relType | 1 | 1 | 0 | | | | Fused in Pipeline 0 | +------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
动态无向关系类型查找 (Dynamic Undirected Relationship Type Lookup)引入于 2025.08
允许 Cypher 在无向关系模式中使用动态关系类型规划查询时使用 令牌查找索引。
PROFILE
WITH "FRIENDS_WITH" AS relType
MATCH ()-[r:$(relType)]-()
RETURN count(r) as relCount
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +--------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | relCount | 1 | 1 | 0 | 0 | 0/0 | 0.011 | In Pipeline 2 | | | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +EagerAggregation | 1 | count(r) AS relCount | 1 | 1 | 0 | 40 | | | | | | +----+--------------------------+----------------+------+---------+----------------+ | | | | +Apply | 2 | | 42 | 24 | 0 | | | | | | |\ +----+--------------------------+----------------+------+---------+----------------+ | | | | | +DynamicUndirectedRelationshipTypeLookup | 3 | ()-[r:$all(relType)]-() | 42 | 24 | 13 | 1968 | 2/0 | 0.121 | Fused in Pipeline 1 | | | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Projection | 4 | $autostring_0 AS relType | 1 | 1 | 0 | | | | Fused in Pipeline 0 | +--------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
嵌套循环与连接操作符
嵌套循环操作符通过遍历右侧 (RHS) 来处理数据,对于左侧 (LHS) 的每一行。LHS 中的每一行都会触发 RHS 的执行,实际上是为每个 LHS 元素创建一个对 RHS 的循环。
Apply
所有不同的 Apply 操作符(列在下面)共享相同的基本功能:它们通过从左侧获取单行并使用右侧的 Argument 操作符来执行嵌套循环,从而执行右侧的操作符树。Apply 操作符的版本在结果的管理方式上有所不同。Apply 操作符(即标准版本)获取由右侧产生的结果——此时包含来自左右两侧的数据——并将其产生。
PROFILE
MATCH (p:Person {name: 'me'})
MATCH (q:Person {name: p.secondName})
RETURN p, q
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | p, q | 1 | 0 | 0 | | | | | | | +-------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Apply | | 1 | 0 | 0 | | | | | | |\ +-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +NodeIndexSeek | RANGE INDEX q:Person(name) WHERE name = p.secondName | 1 | 0 | 0 | 2152 | 0/0 | 0.219 | Fused in Pipeline 1 | | | +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +NodeIndexSeek | RANGE INDEX p:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 120 | 0/1 | 0.236 | In Pipeline 0 | +------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 2, total allocated memory: 2216
半连接应用 (Semi Apply)
SemiApply 操作符测试模式谓词的存在性,是 Apply 操作符的一种变体。如果右侧操作符产生至少一行,则左侧操作符的行将由 SemiApply 操作符产生。这使得 SemiApply 成为一个过滤操作符,主要用于查询中的模式谓词。
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
WHERE (p)-[:FRIENDS_WITH]->(:Person)
RETURN p.name
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+-------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+-------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | `p.name` | 11 | 10 | 0 | 0/0 | | | +-------------------------------------+----------------+------+---------+------------------------+ | +Projection | p.name AS `p.name` | 11 | 10 | 10 | 1/0 | | | +-------------------------------------+----------------+------+---------+------------------------+ | +SemiApply | | 11 | 10 | 0 | 0/0 | | |\ +-------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_3:Person | 12 | 0 | 10 | 0/0 | | | | +-------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (p)-[anon_2:FRIENDS_WITH]->(anon_3) | 12 | 10 | 51 | 28/0 | | | | +-------------------------------------+----------------+------+---------+------------------------+ | | +Argument | p | 14 | 14 | 0 | 0/0 | | | +-------------------------------------+----------------+------+---------+------------------------+ | +NodeByLabelScan| p:Person | 14 | 14 | 35 | 1/0 | +-----------------+-------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 142, total allocated memory: 64
反半连接应用 (Anti Semi Apply)
AntiSemiApply 操作符测试模式的缺失,是 Apply 操作符的一种变体。如果右侧操作符没有产生任何行,则左侧操作符的行将由 AntiSemiApply 操作符产生。这使得 AntiSemiApply 成为一个过滤操作符,用于查询中的模式谓词。
PROFILE
CYPHER runtime=slotted
MATCH
(me:Person {name: 'me'})-[:WORKS_IN]->(location),
(other:Person)-[:WORKS_IN]->(location)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Indexes Used | +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +ProduceResults | 0 | `other.name` | 0 | 5 | 0 | | 0/0 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +Projection | 1 | other.name AS `other.name` | 0 | 5 | 5 | | 0/0 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +AntiSemiApply | 2 | | 0 | 5 | 0 | | 0/0 | | | |\ +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | | +Expand(Into) | 3 | (me)-[:FRIENDS_WITH]->(other) | 0 | 0 | 7 | 592 | 0/0 | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | | +Argument | 4 | me, other | 0 | 6 | 0 | | 0/0 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +Filter | 5 | NOT anon_0 = anon_1 AND other:Person | 0 | 6 | 6 | | 0/0 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +Expand(All) | 6 | (location)<-[anon_1:WORKS_IN]-(other) | 0 | 7 | 8 | | 1/0 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +Expand(All) | 7 | (me)-[anon_0:WORKS_IN]->(location) | 1 | 1 | 2 | | 1/0 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ | +NodeIndexSeek | 8 | RANGE INDEX me:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | | 0/1 | range_person_name: 1 | +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+----------------------+ Total database accesses: 166, total allocated memory: 976
Let 半连接应用 (Let Semi Apply)
LetSemiApply 操作符测试模式谓词的存在性,是 Apply 操作符的一种变体。当查询包含多个由 OR 分隔的模式谓词时,LetSemiApply 将用于评估其中的第一个。它将记录评估谓词的结果,但将过滤留给另一个操作符。在该示例中,LetSemiApply 将用于检查每个人是否存在 FRIENDS_WITH 关系。
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 2026.03 +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | `other.name` | 13 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +Projection | other.name AS `other.name` | 13 | 14 | 14 | 1/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +SelectOrSemiApply | anon_9 | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_7:Location | 14 | 0 | 4 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_6:WORKS_IN]->(anon_7) | 14 | 4 | 15 | 8/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 4 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +LetSemiApply | | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_5:Person | 12 | 0 | 10 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_4:FRIENDS_WITH]->(anon_5) | 12 | 10 | 51 | 28/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +NodeByLabelScan | other:Person | 14 | 14 | 35 | 1/0 | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 165, total allocated memory: 64
Let 反半连接应用 (Let Anti Semi Apply)
LetAntiSemiApply 操作符测试模式的缺失,是 Apply 操作符的一种变体。当查询包含多个否定模式谓词(即由 OR 分隔的谓词,其中至少一个谓词包含 NOT)时,LetAntiSemiApply 将用于评估其中的第一个。它将记录评估谓词的结果,但将过滤留给另一个操作符。在该示例中,LetAntiSemiApply 将用于检查每个人是否不存在 FRIENDS_WITH 关系。
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 2026.03 +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | `other.name` | 11 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +Projection | other.name AS `other.name` | 11 | 14 | 14 | 1/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +SelectOrSemiApply | anon_9 | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_7:Location | 14 | 0 | 10 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_6:WORKS_IN]->(anon_7) | 14 | 10 | 38 | 20/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 10 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +LetAntiSemiApply | | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_5:Person | 12 | 0 | 10 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_4:FRIENDS_WITH]->(anon_5) | 12 | 10 | 51 | 28/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +NodeByLabelScan | p:Person | 14 | 14 | 35 | 1/0 | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 142, total allocated memory: 64
选择或半连接应用 (Select Or Semi Apply)
SelectOrSemiApply 操作符测试模式谓词的存在性并评估谓词,是 Apply 操作符的一种变体。该操作符允许混合正常谓词和检查模式存在性的模式谓词。首先评估正常的表达式谓词,仅当它返回 false 时,才评估昂贵的模式谓词。
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
Planner COST Runtime PIPELINED Runtime version 2026.03 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,则不测试模式谓词。如果谓词返回 false 或 null,SelectOrAntiSemiApply 将改而测试模式谓词。
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR NOT (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
Planner COST Runtime PIPELINED Runtime version 2026.03 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 选择或半连接应用 (Let Select Or Semi Apply)
LetSelectOrSemiApply 操作符是为与使用 OR 的其他谓词组合的模式谓词而规划的。这是 Apply 操作符的一种变体。
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 2026.03 +-----------------------+-----------------------------------------+----------------+------+---------+------------------------+ | 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 选择或反半连接应用 (Let Select Or Anti Semi Apply)
LetSelectOrAntiSemiApply 操作符是为否定模式谓词(即前面带有 NOT 的模式谓词)规划的,这些谓词与使用 OR 的其他谓词组合。该操作符是 Apply 操作符的一种变体。
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 2026.03 +---------------------------+-----------------------------------------+----------------+------+---------+------------------------+ | 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
汇总应用 (Roll Up Apply)
RollUpApply 操作符用于执行一个以模式作为输入的表达式,并返回一个包含来自匹配模式的内容的列表;例如,当在查询中使用模式表达式或模式推导时。该操作符是 Apply 操作符的一种变体。
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
RETURN p.name, [(p)-[:WORKS_IN]->(location) | location.name] AS cities
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+-----------------------------------+----------------+------+---------+------------------------+ | 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
事务应用 (TransactionApply)
TransactionApply 的工作方式与 Apply 操作符类似,但在指定数量的行之后将提交当前事务。
下面的查询使用 变量作用域子句 将变量导入 CALL 子查询中。 |
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 2026.03
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
参数 (Argument)
Argument 操作符指示要用作 Apply 操作符右侧参数的变量。
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +ProduceResults | 0 | | 1 | 0 | 0 | 0 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +EmptyResult | 1 | | 1 | 0 | 0 | | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +Apply | 2 | | 1 | 1 | 0 | | | | | | | |\ +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | | +MergeInto | 3 | MERGE (s)-[anon_0:FRIENDS_WITH]->(s) | 1 | 1 | 1 | | | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | | +Argument | 4 | s | 1 | 1 | 0 | 2288 | 1/0 | 0.673 | Fused in Pipeline 1 | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +NodeIndexSeek | 5 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 1/0 | 0.256 | In Pipeline 0 | range_person_name: 1 | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ Total database accesses: 15, total allocated memory: 2232
参数追踪器 (Argument Tracker)
ArgumentTracker 操作符用于确保逐行语义。这限制 Cypher 运行时 不将操作分批成更大的块。
下面的查询使用 变量作用域子句 将变量导入 CALL 子查询中。 |
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 2026.03 +--------------------+----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | 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
笛卡尔积 (Cartesian Product)
CartesianProduct 操作符产生两个输入的笛卡尔积——来自左侧子操作符的每一行都将与来自右侧子操作符的所有行组合。CartesianProduct 通常性能较差,如果可能的话应该避免。
PROFILE
MATCH
(p:Person),
(t:Team)
RETURN p, t
Planner COST Runtime PIPELINED Runtime version 2026.03 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
通用哈希连接 (Hash joins in general)
哈希连接有两个输入:构建输入和探测输入。查询规划器分配这些角色,以便两个输入中较小的一个成为构建输入。构建输入被急切地拉取,并用于构建探测表。一旦完成,就会针对来自探测输入侧的每一行检查探测表。
在查询计划中,构建输入始终是左操作符,探测输入是右操作符。
节点哈希连接 (Node Hash Join)
NodeHashJoin 操作符是 哈希连接 的一种变体。NodeHashJoin 在节点 ID 上执行哈希连接。由于可以使用原始类型和数组,因此可以非常高效地完成。
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 2026.03 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(即两个属性列之间的相等谓词)。
PROFILE
MATCH
(p:Person),
(q:Person)
WHERE p.age = q.age
RETURN p, q
Planner COST Runtime PIPELINED Runtime version 2026.03 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)
NodeLeftOuterHashJoin 和 NodeRightOuterHashJoin 操作符是 哈希连接 的变体。下面的查询可以规划为左外连接或右外连接。该决定取决于左侧和右侧的基数;即对于 (a:Person) 和 (a)-→(b:Person) 分别会返回多少行。如果 (a:Person) 返回的结果少于 (a)-→(b:Person),则规划左外连接——由 NodeLeftOuterHashJoin 指示。另一方面,如果 (a:Person) 返回的结果多于 (a)-→(b:Person),则规划右外连接——由 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 2026.03 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
遍历操作符
反 (Anti)
Anti 操作符测试模式的缺失。如果有传入行,Anti 操作符将不产生行。如果没有传入行,Anti 操作符将产生单行。
PROFILE
CYPHER runtime=pipelined
MATCH
(me:Person {name: 'me'})-[:WORKS_IN]->(location),
(other:Person)-[:WORKS_IN]->(location)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +ProduceResults | 0 | `other.name` | 0 | 5 | 0 | 0 | 0/0 | 0.080 | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ +----------------------+ | +Projection | 1 | other.name AS `other.name` | 0 | 5 | 10 | | 0/0 | 0.114 | In Pipeline 2 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +Apply | 2 | | 0 | 5 | 0 | | 0/0 | | | | | |\ +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | | +Anti | 10 | | 0 | 5 | 0 | 936 | 0/0 | 0.096 | In Pipeline 2 | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | | +Limit | 9 | 1 | 0 | 1 | 0 | 752 | | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | | +Expand(Into) | 3 | (me)-[:FRIENDS_WITH]->(other) | 0 | 1 | 7 | 592 | | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | | +Argument | 4 | me, other | 0 | 6 | 0 | 6520 | 0/0 | 0.533 | Fused in Pipeline 1 | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +Filter | 5 | NOT anon_0 = anon_1 AND other:Person | 0 | 6 | 12 | | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +Expand(All) | 6 | (location)<-[anon_1:WORKS_IN]-(other) | 0 | 7 | 8 | | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +Expand(All) | 7 | (me)-[anon_0:WORKS_IN]->(location) | 1 | 1 | 2 | | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +NodeIndexSeek | 8 | RANGE INDEX me:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 3/0 | 0.866 | Fused in Pipeline 0 | range_person_name: 1 | +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ 09:13:20 E Total database accesses: 178, total allocated memory: 6744
可选 (Optional)
Optional 操作符用于求解某些 OPTIONAL MATCH 查询。它将从其源拉取数据,如果存在任何数据,则简单地将其传递。但是,如果其源没有返回数据,Optional 将产生单行,并将所有列设置为 null。
PROFILE
MATCH (p:Person {name: 'me'})
OPTIONAL MATCH (q:Person {name: 'Lulu'})
RETURN p, q
Planner COST Runtime PIPELINED Runtime version 2026.03 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
全部展开 (Expand All)
给定一个起始节点,并根据模式关系,Expand(All) 操作符将遍历传入或传出关系。
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)
RETURN fof
Planner COST Runtime PIPELINED Runtime version 2026.03 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) 操作符用于查找连接这两个节点的所有关系。由于关系的起始节点和终止节点都在作用域内,因此将使用度数最小的节点。当密集节点作为端点出现时,这会产生明显的差异。
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)-->(p)
RETURN fof
Planner COST Runtime PIPELINED Runtime version 2026.03 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。
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 2026.03 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。由于关系的起始节点和终止节点都在作用域内,因此将使用度数最小的节点。当密集节点作为端点出现时,这会产生明显的差异。
PROFILE
MATCH (p:Person)-[works_in:WORKS_IN]->(l)
OPTIONAL MATCH (l)-->(p)
RETURN p
Planner COST Runtime PIPELINED Runtime version 2026.03 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) 操作符将遍历可变长度和量化关系。
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(q:Person)
RETURN p, q
Planner COST Runtime PIPELINED Runtime version 2026.03 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) 操作符用于查找连接这两个节点的所有可变长度和量化关系。
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(p:Person)
RETURN p
Planner COST Runtime PIPELINED Runtime version 2026.03 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) 操作符保证产生的所有终止节点都是唯一的。
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *3..4]-(q:Person)
RETURN DISTINCT p, q
Planner COST Runtime PIPELINED Runtime version 2026.03 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),并且在展开时,如果保证产生已找到(通过先前的路径遍历)的终止节点,则不探索某些路径。这仅用于单个路径不感兴趣的情况。
仅当以下情况时,才规划此种展开:
-
单个路径不感兴趣。
-
下限为
0或1(默认)。
此操作符保证产生的所有终止节点都是唯一的。
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *..4]-(q:Person)
RETURN DISTINCT p, q
Planner COST Runtime PIPELINED Runtime version 2026.03 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)
给定一个起始节点,Repeat 操作符将遍历 量化路径模式,这些模式无法通过 VarLengthExpand(All) 操作符求解(或有效求解)。与 Apply 操作符类似,它从左侧获取单行并将操作符应用于右侧。然而,与 Apply 相比,它根据量化路径模式上的量词重复应用这些操作符。在下面的示例中,操作符将重复两次,并为两次重复产生行。
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 2026.03
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 | 30112 | 0/0 | 4.943 | 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 | 15992 | 2/0 | 5.253 | Fused in Pipeline 1 |
| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan | 8 | me:Person | 14 | 14 | 15 | 376 | 1/0 | 1.130 | In Pipeline 0 |
+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
Total database accesses: 747, total allocated memory: 45832
空化元数据 (Nullify Metadata)
NullifyMetadata 负责清理 Repeat 产生状态。它仅在 Repeat 之后立即规划。
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 2026.03
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 | 30112 | 0/0 | 4.824 | 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 | 15992 | 2/0 | 5.307 | Fused in Pipeline 1 |
| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeByLabelScan | 8 | me:Person | 14 | 14 | 15 | 376 | 1/0 | 0.183 | In Pipeline 0 |
+------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
Total database accesses: 747, total allocated memory: 45832
最短路径 (Shortest path)
ShortestPath 操作符查找两个先前匹配的节点变量之间的一条或所有最短路径。此操作符用于 shortestPath() 和 allShortestPaths 函数。
PROFILE
MATCH
(andy:Person {name: 'Andy'}),
(mattias:Person {name: 'Mattias'}),
p = shortestPath((andy)-[*]-(mattias))
RETURN p
Planner COST Runtime PIPELINED Runtime version 2026.03 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 调用在相交之前耗尽了其搜索(要么是因为无法到达更多节点,要么是因为已达到最大跳数),则边界节点之间没有有效路径,算法终止。
PROFILE
MATCH
p = ALL SHORTEST (chris:Person {name: 'Chris'})(()-[]-()-[]-()){1,}(stefan:Person {name: 'Stefan'})
RETURN p
Planner COST
Runtime PIPELINED
Runtime version 2026.03
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) 操作符查找从单个节点到多个目标节点的最短路径。它使用广度优先搜索算法。
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 2026.03
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
三元选择 (Triadic Selection)
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 2026.03 +-------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | +-------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | +ProduceResults | 0 | `other.name` | 15 | 24 | 0 | 0 | 0/0 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | +Projection | 1 | other.name AS `other.name` | 15 | 24 | 24 | | 0/0 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | +Filter | 2 | NOT anon_2 = anon_0 | 15 | 24 | 0 | | 0/0 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | +TriadicSelection | 3 | WHERE NOT (me)--(other) | 15 | 48 | 0 | | 0/0 | | |\ +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | | +Expand(All) | 4 | (anon_1)-[anon_2:FRIENDS_WITH]-(other) | 16 | 48 | 72 | | 0/0 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | | +Argument | 5 | anon_1, anon_0 | 24 | 24 | 0 | | 0/0 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | +Expand(All) | 6 | (me)-[anon_0:FRIENDS_WITH]-(anon_1) | 24 | 24 | 38 | | 2/0 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | +NodeByLabelScan | 7 | me:Person | 14 | 14 | 15 | | 1/0 | +-------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+ Total database accesses: 246, total allocated memory: 64
三元构建 (Triadic Build)
TriadicBuild 操作符与 TriadicFilter 结合使用,以求解三角形查询,例如非常常见的“查找我的朋友的朋友,且其不是我的朋友”。这两个操作符特定于 Pipelined 运行时,它们共同执行与 TriadicSelection 为其他运行时执行的相同逻辑。TriadicBuild 构建所有朋友的集合,该集合稍后由 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 2026.03 Batch size 128 +------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | `other.name` | 15 | 24 | 0 | 0 | 0/0 | 0.172 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +Projection | 1 | other.name AS `other.name` | 15 | 24 | 48 | | 0/0 | 0.162 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +Filter | 2 | NOT anon_2 = anon_0 | 15 | 24 | 0 | | 0/0 | 0.134 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +TriadicFilter | 10 | WHERE NOT (me)--(other) | 15 | 48 | 0 | 7216 | 0/0 | 0.251 | In Pipeline 3 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Apply | 9 | | 16 | 48 | 0 | | 0/0 | | | | |\ +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | | +Expand(All) | 4 | (anon_1)-[anon_2:FRIENDS_WITH]-(other) | 16 | 48 | 72 | | | | | | | | +----+----------------------------------------+----------------+------+---------+----------------+ | | | | | +Argument | 5 | anon_1, anon_0 | 24 | 24 | 0 | 4464 | 0/0 | 0.384 | Fused in Pipeline 2 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +TriadicBuild | 8 | (me)--(anon_1) | 24 | 24 | 0 | 1080 | 0/0 | 1.670 | In Pipeline 1 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Expand(All) | 6 | (me)-[anon_0:FRIENDS_WITH]-(anon_1) | 24 | 24 | 38 | | | | | | | +----+----------------------------------------+----------------+------+---------+----------------+ | | | | +NodeByLabelScan | 7 | me:Person | 14 | 14 | 15 | 376 | 3/0 | 0.361 | Fused in Pipeline 0 | +------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 256, total allocated memory: 7376
三元过滤 (Triadic Filter)
TriadicFilter 操作符与 TriadicBuild 结合使用,以求解三角形查询,例如非常常见的“查找我的朋友的朋友,且其不是我的朋友”。这两个操作符特定于 Pipelined 运行时,它们共同执行与 TriadicSelection 为其他运行时执行的相同逻辑。TriadicFilter 使用先前由 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 2026.03 Batch size 128 +------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | `other.name` | 15 | 24 | 0 | 0 | 0/0 | 0.413 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +Projection | 1 | other.name AS `other.name` | 15 | 24 | 48 | | 0/0 | 0.302 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +Filter | 2 | NOT anon_2 = anon_0 | 15 | 24 | 0 | | 0/0 | 0.268 | | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +TriadicFilter | 10 | WHERE NOT (me)--(other) | 15 | 48 | 0 | 7216 | 0/0 | 0.298 | In Pipeline 3 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Apply | 9 | | 16 | 48 | 0 | | 0/0 | | | | |\ +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | | +Expand(All) | 4 | (anon_1)-[anon_2:FRIENDS_WITH]-(other) | 16 | 48 | 72 | | | | | | | | +----+----------------------------------------+----------------+------+---------+----------------+ | | | | | +Argument | 5 | anon_1, anon_0 | 24 | 24 | 0 | 4464 | 0/0 | 0.563 | Fused in Pipeline 2 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +TriadicBuild | 8 | (me)--(anon_1) | 24 | 24 | 0 | 1080 | 0/0 | 0.403 | In Pipeline 1 | | | +----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Expand(All) | 6 | (me)-[anon_0:FRIENDS_WITH]-(anon_1) | 24 | 24 | 38 | | | | | | | +----+----------------------------------------+----------------+------+---------+----------------+ | | | | +NodeByLabelScan | 7 | me:Person | 14 | 14 | 15 | 376 | 3/0 | 0.530 | Fused in Pipeline 0 | +------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 256, total allocated memory: 7376
联合操作符 (Union operators)
Cypher 中的联合操作符通过合并行来组合来自多个查询部分的结果。有关更多信息,请参阅关于 UNION 子句的页面。
联合 (Union)
Union 操作符将右侧子操作符的结果与左侧子操作符的结果连接起来。
PROFILE
MATCH (p:Location)
RETURN p.name
UNION ALL
MATCH (p:Country)
RETURN p.name
Planner COST Runtime PIPELINED Runtime version 2026.03 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
聚合操作符 (Aggregation operators)
聚合操作符用于计算图数据组上的汇总统计信息,从而实现诸如计数节点、关系或属性等操作。
急切聚合 (Eager Aggregation)
EagerAggregation 操作符评估分组表达式,并使用结果将行分组为不同的分组。对于这些分组中的每一个,EagerAggregation 然后将评估所有聚合函数并返回结果。要做到这一点,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 2026.03 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
有序聚合 (Ordered Aggregation)
OrderedAggregation 操作符是 EagerAggregation 操作符的一种优化,它利用了传入行的排序。该操作符使用延迟评估,并且在系统中的内存压力比 EagerAggregation 操作符低。
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p.name, count(*) AS count
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline | +-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ | +ProduceResults | `p.name`, count | 0 | 2 | 0 | | 0/0 | 0.045 | | | | | +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | | +OrderedAggregation | cache[p.name] AS `p.name`, count(*) AS count | 0 | 2 | 0 | 288 | 0/0 | 0.175 | `p.name` ASC | In Pipeline 1 | | | +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ | +NodeIndexSeekByRange | RANGE INDEX p:Person(name) WHERE name STARTS WITH $autostring_0, cache[p.name] | 0 | 2 | 3 | 120 | 0/1 | 0.529 | p.name ASC | In Pipeline 0 | +-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ Total database accesses: 3, total allocated memory: 352
从计数存储节点计数 (Node Count From Count Store)
NodeCountFromCountStore 操作符使用计数存储来回答关于节点计数的问题。这比通过实际计数实现相同结果的 EagerAggregation 操作符快得多。然而,由于计数存储仅存储有限范围的组合,EagerAggregation 仍将用于更复杂的查询。例如,我们可以获取所有节点的计数,以及具有标签的节点的计数,但不能获取具有多个标签的节点的计数。
PROFILE
MATCH (p:Person)
RETURN count(p) AS people
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | people | 1 | 1 | 0 | | | | | | | +------------------------------+----------------+------+---------+----------------+ | | | | +NodeCountFromCountStore | count( (:Person) ) AS people | 1 | 1 | 1 | 120 | 0/0 | 0.169 | Fused in Pipeline 0 | +--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
从计数存储关系计数 (Relationship Count From Count Store)
RelationshipCountFromCountStore 操作符使用计数存储来回答关于关系计数的问题。这比通过实际计数实现相同结果的 EagerAggregation 操作符快得多。然而,由于计数存储仅存储有限范围的组合,EagerAggregation 仍将用于更复杂的查询。例如,我们可以获取所有关系的计数、具有类型的关系的计数、一端具有标签的关系的计数,但不能获取两端节点都具有标签的关系的计数。
PROFILE
MATCH (p:Person)-[r:WORKS_IN]->()
RETURN count(r) AS jobs
Planner COST Runtime PIPELINED Runtime version 2026.03 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
过滤、排序与投影操作符
此组中的操作符处理数据行如何转换、过滤并最终确定为查询结果。它们负责构建返回数据的结构。
空结果 (Empty Result)
EmptyResult 操作符急切地加载所有传入数据并将其丢弃。
PROFILE
CREATE (:Person)
Planner COST Runtime PIPELINED Runtime version 2026.03 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 操作符准备结果,以便用户可以消费,例如将内部值转换为用户值。它存在于每一个向用户返回数据的查询中,对性能优化几乎没有影响。
PROFILE
MATCH (n)
RETURN n
Planner COST Runtime PIPELINED Runtime version 2026.03 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
过滤 (Filter)
Filter 操作符过滤来自子操作符的每一行,仅传递将谓词评估为 true 的行。
PROFILE
MATCH (p:Person)
WHERE p.name =~ '^a.*'
RETURN p
Planner COST Runtime PIPELINED Runtime version 2026.03 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
空行 (Empty Row)
EmptyRow 操作符返回没有列的单行。
PROFILE
CYPHER runtime=slotted
FOREACH (value IN [1,2,3] | MERGE (:Person {age: value}))
Planner COST
Runtime SLOTTED
Runtime version 2026.03
+-----------------+--------------------------------------+----------------+------+---------+------------------------+
| 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
缓存属性 (Cache Properties)
CacheProperties 操作符读取节点和关系属性并将它们缓存在当前行中。将来对这些属性的访问可以避免从存储中读取,这将加快查询速度。在下面的计划中,我们将在行数较少的 Expand(All) 之前缓存 l.name。
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN
l.name AS location,
p.name AS name
Planner COST Runtime PIPELINED Runtime version 2026.03 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
投影 (Projection)
对于每一传入行,Projection 操作符评估一组表达式并产生一行结果。
PROFILE
RETURN 'hello' AS greeting
Planner COST Runtime PIPELINED Runtime version 2026.03 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
投影端点 (Project Endpoints)
ProjectEndpoints 操作符投影关系的起始节点和终止节点。
PROFILE
CREATE (n)-[p:KNOWS]->(m)
WITH p AS r
MATCH (u)-[r]->(v)
RETURN u, v
Planner COST Runtime PIPELINED Runtime version 2026.03 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
去重 (Distinct)
Distinct 操作符从传入的行流中删除重复的行。为了确保仅返回不同的元素,Distinct 将从其源中延迟拉取数据并建立状态。这可能会导致系统中的内存压力增加。
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN DISTINCT p
Planner COST Runtime PIPELINED Runtime version 2026.03 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 | 29 | 0 | | | | | | +----+----------------------------+----------------+------+---------+----------------+ | | | | +Distinct | 1 | p | 14 | 14 | 0 | 352 | | | | | | +----+----------------------------+----------------+------+---------+----------------+ | | | | +Filter | 2 | p:Person | 15 | 15 | 30 | | | | | | | +----+----------------------------+----------------+------+---------+----------------+ | | | | +Expand(All) | 3 | (l)<-[anon_0:WORKS_IN]-(p) | 15 | 15 | 25 | | | | | | | +----+----------------------------+----------------+------+---------+----------------+ | | | | +NodeByLabelScan | 4 | l:Location | 10 | 10 | 11 | 248 | 8/0 | 0.758 | Fused in Pipeline 0 | +------------------+----+----------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 95, total allocated memory: 432
有序去重 (Ordered Distinct)
OrderedDistinct 操作符是 Distinct 操作符的一种优化,它利用了传入行的排序。该操作符在系统中的内存压力比 Distinct 操作符低。
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN DISTINCT p.name
Planner COST Runtime PIPELINED Runtime version 2026.03 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
过程调用 (Procedure Call)
ProcedureCall 操作符指示对过程的调用。
PROFILE
CALL db.labels() YIELD label
RETURN *
ORDER BY label
Planner COST Runtime PIPELINED Runtime version 2026.03 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
展开 (Unwind)
Unwind 操作符为列表中的每个项目返回一行。
PROFILE
UNWIND range(1, 5) AS value
RETURN value
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分区展开 (Partitioned Unwind)
CYPHER runtime=parallel
PROFILE
UNWIND range(1, 5) AS value
RETURN value
Planner COST Runtime PARALLEL Runtime version 2026.03 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
排序与限制操作符 (Sort and limit operators)
此组中的操作符管理结果集排序,并通过限制或跳过行来控制数据流。它们优化查询性能,并确保用户以所需的顺序和数量接收结果。
排序 (Sort)
Sort 操作符按提供的键对行进行排序。为了对数据进行排序,需要从源操作符中急切地拉取所有数据并保持在查询状态中,这将导致系统中的内存压力增加。
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
Planner COST Runtime PIPELINED Runtime version 2026.03 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
部分排序 (Partial Sort)
PartialSort 操作符是 Sort 操作符的一种优化,它利用了传入行的排序。该操作符使用延迟评估,并且在系统中的内存压力比 Sort 操作符低。部分排序仅适用于对多列进行排序时。
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p
ORDER BY p.name, p.age
Planner COST Runtime PIPELINED Runtime version 2026.03 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 行。
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
LIMIT 2
Planner COST Runtime PIPELINED Runtime version 2026.03 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 (Partial Top)
PartialTop 操作符是 Top 操作符的一种优化,它利用了传入行的排序。该操作符使用延迟评估,并且在系统中的内存压力比 Top 操作符低。部分 top 仅适用于对多列进行排序时。
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 2026.03 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
限制 (Limit)
Limit 操作符返回传入输入的前 n 行。
PROFILE
MATCH (p:Person)
RETURN p
LIMIT 3
Planner COST Runtime PIPELINED Runtime version 2026.03 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
穷尽限制 (Exhaustive Limit)
ExhaustiveLimit 操作符类似于 Limit 操作符,但将始终耗尽输入。当结合 LIMIT 和更新时使用。
PROFILE
MATCH (p:Person)
SET p.seen = true
RETURN p
LIMIT 3
Planner COST Runtime PIPELINED Runtime version 2026.03 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
跳过 (Skip)
Skip 操作符跳过传入行中的 n 行。
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.id
SKIP 1
Planner COST Runtime PIPELINED Runtime version 2026.03 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
数据修改操作符 (Data modification operators)
此组中的操作符通过创建、删除和更改节点、关系和属性来修改图数据。
创建 (Create)
Create 操作符用于创建节点和关系。
PROFILE
CREATE
(max:Person {name: 'Max'}),
(chris:Person {name: 'Chris'})
CREATE (max)-[:FRIENDS_WITH]->(chris)
Planner COST
Runtime PIPELINED
Runtime version 2026.03
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)
Delete 操作符用于删除节点或关系。
PROFILE
MATCH (you:Person {name: 'you'})
DELETE you
Planner COST Runtime PIPELINED Runtime version 2026.03 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
分离删除 (Detach Delete)
DetachDelete 操作符用于所有包含 DETACH DELETE 子句的查询,用于删除节点及其关系。
PROFILE
MATCH (p:Person)
DETACH DELETE p
Planner COST Runtime PIPELINED Runtime version 2026.03 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
合并 (Merge)
Merge 操作符将读取或创建节点和/或关系。
如果找到匹配项,它将为每一传入行执行提供的 ON MATCH 操作。如果没有找到匹配项,则创建节点和关系,并运行所有 ON CREATE 操作。
PROFILE
MERGE (p:Person {name: 'Andy'})
ON MATCH SET p.existed = true
ON CREATE SET p.existed = false
Planner COST
Runtime PIPELINED
Runtime version 2026.03
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
合并进入 (Merge Into)引入于 2025.11
MergeInto 操作符类似于 Merge 操作符,但当模式的起始节点和终止节点在 MERGE 模式之外匹配时使用。
如果有必要,操作符会在创建关系之前锁定模式节点,以避免在节点之间创建多个关系。
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +ProduceResults | 0 | | 1 | 0 | 0 | 0 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +EmptyResult | 1 | | 1 | 0 | 0 | | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | +Apply | 2 | | 1 | 1 | 0 | | | | | | | |\ +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | | +MergeInto | 3 | MERGE (s)-[anon_0:FRIENDS_WITH]->(s) | 1 | 1 | 1 | | | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+ | | +Argument | 4 | s | 1 | 1 | 0 | 2288 | 1/0 | 0.673 | Fused in Pipeline 1 | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ | +NodeIndexSeek | 5 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 1/0 | 0.256 | In Pipeline 0 | range_person_name: 1 | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+ Total database accesses: 15, total allocated memory: 2232
合并唯一节点 (Merge Unique Node)2026.02 中引入
|
|
MergeUniqueNode 操作符类似于 Merge 操作符,但在 MERGE 语句中使用的属性上存在属性唯一性约束时使用。
PROFILE
MERGE (t:Team {name: 'Engineering'})
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +------------------+----+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used | +------------------+----+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ | +ProduceResults | 0 | | 1 | 0 | 0 | 0 | | | | | | | +----+---------------------------------------------------+----------------+------+---------+----------------+ | | +--------------+ | +EmptyResult | 1 | | 1 | 0 | 0 | | | | | | | | +----+---------------------------------------------------+----------------+------+---------+----------------+ | | +--------------+ | +MergeUniqueNode | 2 | UNIQUE t:Team(name) WHERE name = $autostring_0, | 1 | 1 | 2 | 248 | 1/0 | 2.922 | Fused in Pipeline 0 | team_name: 1 | +------------------+----+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+--------------+ Total database accesses: 2, total allocated memory: 312
锁定合并 (Locking Merge)
LockingMerge 操作符类似于 Merge 操作符,但在创建关系时如果有必要,将锁定起始节点和终止节点。
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(:Person {name: 'you'})
Planner COST
Runtime PIPELINED
Runtime version 2026.03
Batch size 128
+------------------+----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+
| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | Indexes Used |
+------------------+----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+
| +ProduceResults | 0 | | 0 | 0 | 0 | | | | | |
| | +----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+
| +EmptyResult | 1 | | 0 | 0 | 0 | | | | | |
| | +----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+
| +Apply | 2 | | 0 | 0 | 0 | | | | | |
| |\ +----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+
| | +LockingMerge | 3 | CREATE (anon_1:Person {name: $autostring_1}), (s)-[anon_0:FRIENDS_WITH]->(anon_1), LOCK(s) | 0 | 0 | 0 | | | | | |
| | | +----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+
| | +Expand(Into) | 4 | (s)-[anon_0:FRIENDS_WITH]->(anon_1) | 0 | 0 | 0 | | | | | |
| | | +----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | +----------------------+
| | +NodeIndexSeek | 5 | RANGE INDEX anon_1:Person(name) WHERE name = $autostring_1 | 0 | 0 | 0 | 128 | 0/0 | 0.000 | Fused in Pipeline 1 | |
| | +----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+
| +NodeIndexSeek | 6 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 0 | 0 | 1 | 376 | 1/0 | 0.186 | In Pipeline 0 | range_person_name: 1 |
+------------------+----+--------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+----------------------+
Total database accesses: 1, total allocated memory: 584
锁定节点 (Lock Nodes)引入于 2025.09
LockNodes 操作符有时与 LockingMerge 操作符结合使用来锁定节点。
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(t:Person {size: size([()-->()|1])})
Planner COST
Runtime PIPELINED
Runtime version 2026.03
Batch size 4
+----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline |
+----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | 0 | | 1 | 0 | 0 | 0 | 0/0 | 0.018 | |
| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ |
| +EmptyResult | 1 | | 1 | 0 | 0 | | 0/0 | 0.016 | In Pipeline 7 |
| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +Apply | 2 | | 1 | 0 | 0 | | 0/0 | | |
| |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +ArgumentTracker | 19 | | 1 | 0 | 0 | 240 | 0/0 | 0.000 | |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ |
| | +LockingMerge | 3 | CREATE (t:Person {size: COUNT { MATCH (`anon_2`)-[`anon_3`]->(`anon_4`) RETURN $`autoint_1` AS ` | 1 | 1 | 3 | 400 | 0/0 | 15.340 | In Pipeline 7 |
| | | | | anon_0` }}), (s)-[anon_1:FRIENDS_WITH]->(t), LOCK(s) | | | | | | | |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +AntiConditionalApply | 18 | | | 0 | 0 | 384 | | 0.010 | In Pipeline 6 |
| | |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | | +Filter | 17 | t.size = anon_5 AND t:Person | 0 | 0 | 4 | | | | |
| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | | +Apply | 16 | | 1 | 2 | 0 | | | | |
| | | |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | | | +RelationshipCountFromCountStore | 15 | count( ()-[]->() ) AS anon_5 | 1 | 2 | 2 | 608 | 0/0 | 0.113 | Fused in Pipeline 5 |
| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | | +Expand(All) | 14 | (s)-[anon_1:FRIENDS_WITH]->(t) | 1 | 2 | 3 | | | | |
| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | | +LockNodes | 13 | s | 1 | 1 | 0 | | | | |
| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | | +Argument | 12 | s | 1 | 1 | 0 | 584 | 0/0 | 1.494 | Fused in Pipeline 4 |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Optional | 11 | s | 0 | 1 | 0 | 528 | 0/0 | 2.057 | In Pipeline 3 |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Filter | 5 | t.size = anon_5 AND t:Person | 0 | 0 | 4 | | | | |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | +Apply | 6 | | 1 | 2 | 0 | | | | |
| | |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | | +RelationshipCountFromCountStore | 7 | count( ()-[]->() ) AS anon_5 | 1 | 2 | 2 | 528 | 0/0 | 4.220 | Fused in Pipeline 2 |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| | +Expand(All) | 8 | (s)-[anon_1:FRIENDS_WITH]->(t) | 1 | 2 | 3 | | | | |
| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | |
| | +Argument | 9 | s | 1 | 1 | 0 | 432 | 1/0 | 0.184 | Fused in Pipeline 1 |
| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +NodeIndexSeek | 10 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 0/1 | 9.263 | In Pipeline 0 |
+----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
Total database accesses: 23, total allocated memory: 3248
遍历 (Foreach)
Foreach 操作符在左侧子操作符和右侧子操作符之间执行嵌套循环。以类似于 Apply 操作符的方式,它从左侧获取一行,并使用 Argument 操作符,将其提供给右侧的操作符树。Foreach 将产生来自左侧的所有行;来自右侧的所有结果都被拉取并丢弃。
PROFILE
FOREACH (value IN [1,2,3] | CREATE (:Person {age: value}))
Planner COST
Runtime SLOTTED
Runtime version 2026.03
+-----------------+---------------------------------------------------------+----------------+------+---------+------------------------+
| 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
子查询遍历 (SubqueryForeach)
SubqueryForeach 的工作方式与 Foreach 操作符类似,但它仅用于执行子查询。
下面的查询使用 变量作用域子句 将变量导入 CALL 子查询中。 |
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 2026.03
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
事务遍历 (TransactionForeach)
TransactionForeach 的工作方式与 Foreach 操作符类似,但在指定数量的行之后将提交当前事务。
下面的查询使用 变量作用域子句 将变量导入 CALL 子查询中。 |
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 2026.03
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
设置标签 (Set Labels)
SetLabels 操作符用于在节点上设置标签时。
PROFILE
MATCH (n)
SET n:Person
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +SetLabels | n:Person | 35 | 35 | 22 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +AllNodesScan | n | 35 | 35 | 36 | 120 | 3/0 | 0.873 | Fused in Pipeline 0 | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 58, total allocated memory: 184
移除标签 (Remove Labels)
RemoveLabels 操作符用于从节点删除标签时。
PROFILE
MATCH (n)
REMOVE n:Person
Planner COST Runtime PIPELINED Runtime version 2026.03 Batch size 128 +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +RemoveLabels | n:Person | 35 | 35 | 15 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +AllNodesScan | n | 35 | 35 | 36 | 120 | 3/0 | 0.765 | Fused in Pipeline 0 | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 51, total allocated memory: 184
从映射设置节点属性 (Set Node Properties From Map)
SetNodePropertiesFromMap 操作符用于从映射在节点上设置属性时。
PROFILE
MATCH (n)
SET n = {weekday: 'Monday', meal: 'Lunch'}
Planner COST
Runtime PIPELINED
Runtime version 2026.03
Batch size 128
+---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline |
+---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | | 35 | 0 | 0 | | | | |
| | +---------------------------------------------------+----------------+------+---------+----------------+ | | |
| +EmptyResult | | 35 | 0 | 0 | | | | |
| | +---------------------------------------------------+----------------+------+---------+----------------+ | | |
| +SetNodePropertiesFromMap | n = {weekday: $autostring_0, meal: $autostring_1} | 35 | 35 | 105 | | | | |
| | +---------------------------------------------------+----------------+------+---------+----------------+ | | |
| +AllNodesScan | n | 35 | 35 | 36 | 120 | 5/0 | 3.954 | Fused in Pipeline 0 |
+---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
Total database accesses: 141, total allocated memory: 184
从映射设置关系属性 (Set Relationship Properties From Map)
SetRelationshipPropertiesFromMap 操作符用于从映射在关系上设置属性时。
PROFILE
MATCH (n)-[r]->(m)
SET r = {weight: 5, unit: 'kg'}
Planner COST
Runtime PIPELINED
Runtime version 2026.03
Batch size 128
+-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline |
+-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +ProduceResults | | 28 | 0 | 0 | | | | |
| | +-----------------------------------------------+----------------+------+---------+----------------+ | | |
| +EmptyResult | | 28 | 0 | 0 | | | | |
| | +-----------------------------------------------+----------------+------+---------+----------------+ | | |
| +SetRelationshipPropertiesFromMap | r = {weight: $autoint_0, unit: $autostring_1} | 28 | 28 | 84 | | | | |
| | +-----------------------------------------------+----------------+------+---------+----------------+ | | |
| +DirectedAllRelationshipsScan | (n)-[r]->(m) | 28 | 28 | 28 | 120 | 5/0 | 15.278 | Fused in Pipeline 0 |
+-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
Total database accesses: 112, total allocated memory: 184
设置属性 (Set Property)
SetProperty 操作符用于在节点或关系上设置属性时。
PROFILE
MATCH (n)
SET n.checked = true
Planner COST Runtime PIPELINED Runtime version 2026.03 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
设置多个属性 (Set Properties)
SetProperties 操作符用于在节点或关系上设置多个属性时。
PROFILE
MATCH (n)
SET n.weekDay = 'Monday', n.meal = 'Lunch'
Planner COST Runtime PIPELINED Runtime version 2026.03 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
加载 CSV (Load CSV)
LoadCSV 操作符将数据从 CSV 源加载到查询中。只要查询中使用 LOAD CSV 子句,就会使用它。
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 2026.03 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
急切 (Eager)
Eager 操作符导致所有前面的操作符在继续执行之前,针对整个数据集完全执行。这样做是为了确保查询计划中可能相互影响的部分之间的隔离。
图中的值以延迟方式获取;即在应用更新之前,模式匹配可能不会完全耗尽。为了保持正确的语义,查询规划器将在查询计划中插入 Eager 操作符,以防止更新影响模式匹配或其他读取操作。此场景由下方的查询示例说明,其中 DELETE 子句否则会影响 MATCH 子句和 MERGE 子句。有关 Eager 操作符如何确保正确语义的更多信息,请参阅关于 子句组合 的部分。
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 2026.03
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 9, 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 9), | | | | | | | |
| | | | read/set conflict for property: name (Operator: 3 vs 9) | | | | | | | |
| | +----+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+
| +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
断言相同节点 (Assert Same Node)
AssertSameNode 操作符用于确保在槽位和解释运行时中不违反节点属性唯一性约束。该示例查找具有所提供名称和 ID 的团队节点,如果不存在,则创建一个。由于 :Team(name) 和 :Team(id) 上存在两个节点属性唯一性约束,因此 UniqueIndexSeek 操作符找到的任何节点必须是同一个节点,否则将违反约束。
PROFILE
CYPHER runtime=slotted
MERGE (t:Team {name: 'Engineering', id: 42})
Planner COST
Runtime SLOTTED
Runtime version 2026.03
+---------------------------------+-------------------------------------------------------+----------------+------+---------+------------------------+
| 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 操作符用于确保在槽位和解释运行时中不违反关系属性唯一性约束。该示例查找具有所提供 id 和 badgeNumber 的 WORKS_IN 关系。如果找不到,则将其创建。由于 :WORKS_IN(id) 和 :WORKS_IN(badgeNumber) 上存在两个属性唯一性约束,因此 DirectedRelationshipUniqueIndexSeek 操作符找到的任何关系必须是同一个关系,否则将违反约束。
PROFILE
CYPHER runtime=slotted
MERGE (person)-[work:WORKS_IN {id: 0, badgeNumber: 4332}]->(location)
Planner COST
Runtime SLOTTED
Runtime version 2026.03
+-------------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+
| 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
模式与系统操作符 (Schema and system operators)
此组中的操作符管理数据库中的模式和系统级操作。它们处理诸如创建或删除约束和索引、显示或终止事务,以及列出可用过程、函数和设置等任务。
创建约束 (Create Constraint)
CreateConstraint 操作符创建一个约束。
此约束可以具有任何可用的约束类型
-
属性唯一性约束
-
属性存在性约束 企业版
-
属性类型约束 企业版
-
节点或关系键约束 企业版
以下查询将在具有 Country 标签的节点的 name 属性上创建一个名为 uniqueness 的属性唯一性约束。
PROFILE
CREATE CONSTRAINT uniqueness
FOR (c:Country) REQUIRE c.name is UNIQUE
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2026.03 +-------------------+------------------------------------------------------------------+ | Operator | Details | +-------------------+------------------------------------------------------------------+ | +CreateConstraint | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE | +-------------------+------------------------------------------------------------------+ Total database accesses: ?
存在则无操作(约束) (Do Nothing If Exists (constraint))
为了避免因重复创建相同约束而报错,我们对约束使用 DoNothingIfExists 算子。在特定的 CreateConstraint 算子创建约束之前,该算子会确保不存在具有给定名称或具有相同类型和模式的其他约束。如果它发现已经存在具有给定名称或具有相同类型和模式的约束,它将停止执行,且不会创建新的约束。以下查询将仅在不存在名为 uniqueness 的约束,或不存在关于 (:Country {name}) 的属性唯一性约束时,为带有 Country 标签的节点的 name 属性创建一个名为 uniqueness 的属性唯一性约束。
PROFILE
CREATE CONSTRAINT uniqueness IF NOT EXISTS
FOR (c:Country) REQUIRE c.name is UNIQUE
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2026.03 +--------------------------------+------------------------------------------------------------------+ | Operator | Details | +--------------------------------+------------------------------------------------------------------+ | +CreateConstraint | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE | | | +------------------------------------------------------------------+ | +DoNothingIfExists(CONSTRAINT) | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE | +--------------------------------+------------------------------------------------------------------+ Total database accesses: ?
删除约束 (Drop Constraint)
DropConstraint 算子使用约束名称删除约束,无论其类型如何。
PROFILE
DROP CONSTRAINT uniqueness IF EXISTS
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2026.03 +-----------------+---------------------------------+ | Operator | Details | +-----------------+---------------------------------+ | +DropConstraint | CONSTRAINT uniqueness IF EXISTS | +-----------------+---------------------------------+ Total database accesses: ?
显示约束 (Show Constraints)
ShowConstraints 算子用于列出约束。它可以包含针对约束类型的过滤,并支持默认输出或完整输出。
PROFILE
SHOW CONSTRAINTS
Planner COST Runtime SLOTTED Runtime version 2026.03 +------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | id, name, type, entityType, labelsOrTypes, properties, ownedIndex | 10 | 3 | 0 | 0/0 | | | +-------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ShowConstraints | allConstraints, defaultColumns | 10 | 3 | 2 | 0/0 | +------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 2, total allocated memory: 64
创建索引 (Create Index)
CreateIndex 算子用于创建索引。
此索引可以是全文索引、点索引、范围索引、文本索引、向量索引或查找索引。
以下查询将在带有 Country 标签的节点的 name 属性上创建一个名为 my_index 的索引。
PROFILE
CREATE INDEX my_index
FOR (c:Country) ON (c.name)
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2026.03 +--------------+-----------------------------------------------+ | Operator | Details | +--------------+-----------------------------------------------+ | +CreateIndex | RANGE INDEX my_index FOR (:Country) ON (name) | +--------------+-----------------------------------------------+ Total database accesses: ?
如果存在则不做任何操作 (索引)
为了避免因重复创建相同索引而报错,我们对索引使用 DoNothingIfExists 算子。在 CreateIndex 算子创建索引之前,该算子会确保不存在具有给定名称或模式的其他索引。如果它发现已经存在具有给定名称或模式的索引,它将停止执行,且不会创建新的索引。以下查询将仅在不存在此类索引时,为类型为 KNOWS 的关系的 since 属性创建一个名为 my_index 的索引。
PROFILE
CREATE INDEX my_index IF NOT EXISTS
FOR ()-[k:KNOWS]-() ON (k.since)
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2026.03 +---------------------------+----------------------------------------------------+ | Operator | Details | +---------------------------+----------------------------------------------------+ | +CreateIndex | RANGE INDEX my_index FOR ()-[:KNOWS]-() ON (since) | | | +----------------------------------------------------+ | +DoNothingIfExists(INDEX) | RANGE INDEX my_index FOR ()-[:KNOWS]-() ON (since) | +---------------------------+----------------------------------------------------+ Total database accesses: ?
删除索引 (Drop Index)
DropIndex 算子使用索引名称删除索引。
PROFILE
DROP INDEX my_index
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2026.03 +------------+---------------+ | Operator | Details | +------------+---------------+ | +DropIndex | INDEX my_index| +------------+---------------+ Total database accesses: ?
显示索引 (Show Indexes)
ShowIndexes 算子用于列出索引。它可以包含针对索引类型的过滤,并支持默认输出或完整输出。
PROFILE
SHOW INDEXES
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | id, name, state, populationPercent, type, entityType, labelsOrTypes, properties, indexProvider, | 10 | 9 | 0 | 0/0 | | | | owningConstraint | | | | | | | +-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ShowIndexes | allIndexes, defaultColumns | 10 | 9 | 2 | 0/0 | +-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 2, total allocated memory: 64
显示函数 (Show Functions)
ShowFunctions 算子用于列出函数。它可以包含针对内置函数与用户定义函数的过滤,以及特定用户是否可以执行该函数。输出可以是默认输出或完整输出。
PROFILE
SHOW FUNCTIONS
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | name, category, description | 10 | 147 | 0 | 0/0 | | | +-----------------------------------------------------+----------------+------+---------+------------------------+ | +ShowFunctions | allFunctions, functionsForUser(all), defaultColumns | 10 | 147 | 0 | 0/0 | +-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
显示存储过程 (Show Procedures)
ShowProcedures 算子用于列出存储过程。它可以包含针对特定用户是否可以执行该存储过程的过滤,并支持默认输出或完整输出。
PROFILE
SHOW PROCEDURES
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+----------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+----------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | name, description, mode, worksOnSystem | 10 | 55 | 0 | 0/0 | | | +----------------------------------------+----------------+------+---------+------------------------+ | +ShowProcedures | proceduresForUser(all), defaultColumns | 10 | 55 | 0 | 0/0 | +-----------------+----------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
显示设置 (Show Settings)
ShowSettings 算子用于列出配置设置。
PROFILE
SHOW SETTINGS
Planner COST Runtime SLOTTED Runtime version 2026.03 +-----------------+---------------------------------------------------+----------------+------+---------+------------------------+ | 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
显示事务 (Show Transactions)
ShowTransactions 算子用于列出事务。它可以包含针对给定 ID 的过滤,并支持默认输出或完整输出。
PROFILE
SHOW TRANSACTIONS
Planner COST Runtime SLOTTED Runtime version 2026.03 +-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | database, transactionId, currentQueryId, connectionId, clientAddress, username, currentQuery, | 10 | 1 | 0 | 0/0 | | | | startTime, status, elapsedTime | | | | | | | +-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ShowTransactions | defaultColumns, allTransactions | 10 | 1 | 0 | 0/0 | +-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
终止事务 (Terminate Transactions)
TerminateTransactions 算子通过 ID 终止事务。
PROFILE
TERMINATE TRANSACTIONS 'database-transaction-123'
Planner COST Runtime SLOTTED Runtime version 2026.03 +------------------------+--------------------------------------------------------+----------------+------+---------+------------------------+ | 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