操作符详解
理解执行计划中不同操作符的角色是提高查询效率的重要一步。本页面包含 Cypher® 规划器使用的每个操作符的详细信息和示例。有关 Cypher 规划器如何使用操作符的概述,请参阅理解执行计划 → 阅读执行计划。
操作符根据其在执行 Cypher 查询时所扮演的角色进行分类
某些操作符仅由特定的运行时使用。如果是这样,示例查询将以运行时选择作为前缀。 |
叶子操作符(扫描和查找)
叶子操作符是查询执行计划中直接访问数据的初始操作。它们被称为“叶子”,因为它们位于查询执行树的最外层,其下方没有其他操作。一旦这些操作符检索到所需数据,结果将传递给执行更复杂操作的后续操作符。
查找操作符(Seek operators)针对特定的数据项(索引或非索引),而扫描操作符(scan operators)则遍历数据(索引或非索引)以查找匹配项。
所有节点扫描
AllNodesScan
操作符从节点存储中读取所有节点。将包含节点的变量显示在参数中。任何使用此操作符的查询都可能在非小型数据库上遇到性能问题。
PROFILE
MATCH (n)
RETURN n
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区所有节点扫描
PartitionedAllNodesScan
是 AllNodesScan
操作符的一种变体,由并行运行时使用。它允许将存储分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (n)
RETURN n
Planner COST Runtime PARALLEL Runtime version 2025.05 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
按标签扫描节点
NodeByLabelScan
操作符从节点标签索引中获取所有具有特定标签的节点。
PROFILE
MATCH (person:Person)
RETURN person
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区按标签扫描节点
PartitionedNodeByLabelScan
是 NodeByLabelScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (person:Person)
RETURN person
Planner COST Runtime PARALLEL Runtime version 2025.05 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
标签交集节点扫描
IntersectionNodeByLabelsScan
操作符从节点标签索引中获取所有具有所提供标签的节点。
PROFILE
MATCH (countryAndLocation:Country&Location)
RETURN countryAndLocation
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区标签交集节点扫描
PartitionedIntersectionNodeByLabelsScan
是 IntersectionNodeByLabelsScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (countryAndLocation:Country&Location)
RETURN countryAndLocation
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 ------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | countryAndLocation | 3 | 0 | 0 | 0/0 | 0.018 | In Pipeline 1 | | | +----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedIntersectionNodeByLabelsScan | 1 | countryAndLocation:Country&Location | 3 | 0 | 13 | 2/0 | 0.770 | In Pipeline 0 | +------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 13
标签差集节点扫描
SubtractionNodeByLabelsScan
操作符从节点标签索引中获取所有具有第一组提供标签但没有第二组提供标签的节点。在下面的示例中,SubtractionNodeByLabelsScan
检索所有具有 Location
标签但没有 Country
标签的节点。
PROFILE
MATCH (locationNotCountry:Location&!Country)
RETURN locationNotCountry
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区标签差集节点扫描
PartitionedSubtractionNodeByLabelsScan
是 SubtractionNodeByLabelsScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (locationNotCountry:Location&!Country)
RETURN locationNotCountry
Planner COST Runtime PARALLEL Runtime version 2025.05 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
标签联合节点扫描
UnionNodeByLabelsScan
操作符从节点标签索引中获取所有具有至少一个提供标签的节点。
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区标签联合节点扫描
PartitionedUnionNodeByLabelsScan
是 UnionNodeByLabelsScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (countryOrLocation:Country|Location)
RETURN countryOrLocation
Planner COST Runtime PARALLEL Runtime version 2025.05 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
节点索引包含扫描
NodeIndexContainsScan
操作符检查索引中存储的所有值,搜索包含特定 STRING
的条目;例如,在包含 CONTAINS
的查询中。尽管这比索引查找(因为它需要检查所有条目)慢,但它仍然比使用 NodeByLabelScan
进行标签扫描和属性存储过滤器所导致的间接性要快。
PROFILE
MATCH (l:Location)
WHERE l.name CONTAINS 'al'
RETURN l
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | l | 0 | 2 | 0 | | | | | | | +---------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeIndexContainsScan | TEXT INDEX l:Location(name) WHERE name CONTAINS $autostring_0 | 0 | 2 | 3 | 120 | 2/0 | 1.305 | Fused in Pipeline 0 | +------------------------+---------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 3, total allocated memory: 184
节点索引以...结束扫描
NodeIndexEndsWithScan
操作符检查索引中存储的所有值,搜索以特定 STRING
结尾的条目;例如,在包含 ENDS WITH
的查询中。尽管这比索引查找(因为它需要检查所有条目)慢,但它仍然比使用 NodeByLabelScan
进行标签扫描和属性存储过滤器所导致的间接性要快。
PROFILE
MATCH (l:Location)
WHERE l.name ENDS WITH 'al'
RETURN l
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | l | 0 | 0 | 0 | | | | | | | +----------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeIndexEndsWithScan | TEXT INDEX l:Location(name) WHERE name ENDS WITH $autostring_0 | 0 | 0 | 1 | 120 | 0/0 | 4.409 | Fused in Pipeline 0 | +------------------------+----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
节点索引扫描
NodeIndexScan
操作符检查索引中存储的所有值,返回所有具有特定标签和指定属性的节点。
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区节点索引扫描
PartitionedNodeIndexScan
是 NodeIndexScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (l:Location)
WHERE l.name IS NOT NULL
RETURN l
Planner COST Runtime PARALLEL Runtime version 2025.05 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
按 ElementId 查找节点
NodeByElementIdSeek
操作符通过函数 elementId() 从节点存储中按 ID 读取一个或多个节点。
PROFILE
MATCH (n)
WHERE elementId(n) = 0
RETURN n
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | n | 1 | 1 | 0 | | | | | | | +-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------- | | | | +NodeByElementIdSeek | n WHERE elementId(n) = $autoint_0 | 1 | 1 | 1 | 120 | 3/0 | 2.108 | Fused in Pipeline 0 | +------------------------+-----------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
按 Id 查找节点
NodeByIdSeek
操作符通过函数 id() 从节点存储中按 ID 读取一个或多个节点。
PROFILE
MATCH (n)
WHERE id(n) = 0
RETURN n
Planner COST Runtime PIPELINED Runtime version 2025.05 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
节点索引查找
NodeIndexSeek
操作符使用索引查找来查找节点。节点变量和使用的索引显示在操作符的参数中。如果该索引支持属性唯一性约束,则该操作符会被称为 NodeUniqueIndexSeek。
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区节点索引查找
PartitionedNodeIndexSeek
是 NodeIndexSeek
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (location:Location {name: 'Malmo'})
RETURN location
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +---------------------------+----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +---------------------------+----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | location | 0 | 1 | 2 | 2/0 | 0.179 | In Pipeline 1 | | | +----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedNodeIndexSeek | 1 | RANGE INDEX location:Location(name) WHERE name = $autostring_0 | 0 | 1 | 2 | 1/0 | 0.167 | In Pipeline 0 | +---------------------------+----+----------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 4
节点唯一索引查找
NodeUniqueIndexSeek
操作符在支持属性唯一性约束的索引中查找节点。节点变量和使用的索引显示在操作符的参数中。如果索引不支持属性唯一性约束,则该操作符会被称为 NodeIndexSeek。如果索引查找用于解决 MERGE 子句,它也将被标记为 (Locking)
。这表明从索引返回的任何节点都将被锁定,以防止并发冲突更新。
PROFILE
MATCH (t:Team {name: 'Malmo'})
RETURN t
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | t | 1 | 0 | 0 | | | | | | | +------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeUniqueIndexSeek | UNIQUE t:Team(name) WHERE name = $autostring_0 | 1 | 0 | 1 | 120 | 0/1 | 0.280 | Fused in Pipeline 0 | +----------------------+------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
多节点索引查找
MultiNodeIndexSeek
操作符使用多个索引查找来查找节点。它支持在查询中为不同节点使用多个独立的索引。节点变量和使用的索引显示在操作符的参数中。
该操作符产生所有索引查找的笛卡尔积。例如,如果该操作符执行两次查找,第一次查找找到节点 a1, a2
,第二次找到 b1, b2, b3
,则 MultiNodeIndexSeek
将生成行 (a1, b1), (a1, b2), (a1, b3), (a2, b1), (a2, b2), (a2, b3)
。
PROFILE
CYPHER runtime=pipelined
MATCH
(location:Location {name: 'Malmo'}),
(person:Person {name: 'Bob'})
RETURN location, person
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | location, person | 1 | 1 | 0 | | | | | | | +-----------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +MultiNodeIndexSeek | RANGE INDEX location:Location(name) WHERE name = $autostring_0, | 1 | 0 | 0 | 120 | 2/2 | 1.910 | Fused in Pipeline 0 | | | RANGE INDEX person:Person(name) WHERE name = $autostring_1 | | | | | | | | +---------------------+-----------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 0, total allocated memory: 184
断言多节点索引查找
AssertingMultiNodeIndexSeek
操作符用于确保没有违反属性唯一性约束。该示例查找是否存在具有所提供名称和 ID 的团队,如果不存在,则创建它。由于在 :Team(name)
和 :Team(id)
上存在两个属性唯一性约束,因此 UniqueIndexSeek
操作符找到的任何节点都必须是同一个节点,否则约束将被违反。
PROFILE
MERGE (t:Team {name: 'Engineering', id: 42})
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 1 | 0 | 0 | | | | | | | +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 1 | 0 | 0 | | | | | | | +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Merge | CREATE (t:Team {name: $autostring_0, id: $autoint_1}) | 1 | 1 | 0 | | | | | | | +-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +AssertingMultiNodeIndexSeek | UNIQUE t:Team(name) WHERE name = $autostring_0, UNIQUE t:Team(id) WHERE id = $autoint_1 | 0 | 2 | 4 | 120 | 0/2 | 1.584 | Fused in Pipeline 0 | +------------------------------+-----------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 4, total allocated memory: 184
按范围查找节点索引
NodeIndexSeekByRange
操作符使用索引查找来查找节点,其中属性值与给定的前缀 STRING
匹配。NodeIndexSeekByRange
可用于 STARTS WITH
和比较操作符,例如 <
、>
、<=
和 >=
。如果索引是唯一索引,则该操作符会被称为 NodeUniqueIndexSeekByRange
。
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区按范围查找节点索引
PartitionedNodeIndexSeekByRange
是 NodeIndexSeekByRange
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (l:Location)
WHERE l.name STARTS WITH 'Lon'
RETURN l
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +----------------------------------+----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------------------+----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | l | 0 | 1 | 2 | 2/0 | 0.191 | In Pipeline 1 | | | +----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedNodeIndexSeekByRange | 1 | RANGE INDEX l:Location(name) WHERE name STARTS WITH $autostring_0 | 0 | 1 | 2 | 1/0 | 0.087 | In Pipeline 0 | +----------------------------------+----+-------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 4
节点唯一索引按范围查找
NodeUniqueIndexSeekByRange
操作符在唯一索引中查找节点,其中属性值与给定的前缀 STRING
匹配。NodeUniqueIndexSeekByRange
用于 STARTS WITH
和比较操作符,例如 <
、>
、<=
和 >=
。如果索引不是唯一的,则该操作符会被称为 NodeIndexSeekByRange
。
PROFILE
MATCH (t:Team)
WHERE t.name STARTS WITH 'Ma'
RETURN t
Planner COST Runtime PIPELINED Runtime version 2025.05 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
有向所有关系扫描
DirectedAllRelationshipsScan
操作符获取数据库中所有关系及其起始节点和结束节点。
PROFILE
MATCH ()-[r]->() RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区有向所有关系扫描
PartitionedDirectedAllRelationshipsScan
是 DirectedAllRelationshipsScan
操作符的一种变体,由并行运行时使用。它允许将存储分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r]->() RETURN r
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+----+------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | r | 28 | 28 | 83 | 2/0 | 3.872 | In Pipeline 1 | | | +----+------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedDirectedAllRelationshipsScan | 1 | (anon_0)-[r]->(anon_1) | 28 | 28 | 28 | 3/0 | 1.954 | In Pipeline 0 | +------------------------------------------+----+------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 111
无向所有关系扫描
UndirectedAllRelationshipsScan
操作符获取数据库中所有关系及其起始节点和结束节点。
PROFILE
MATCH ()-[r]-() RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区无向所有关系扫描
PartitionedUndirectedAllRelationshipsScan
是 UndirectedAllRelationshipsScan
操作符的一种变体,由并行运行时使用。它允许将存储分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r]-() RETURN r
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +--------------------------------------------+----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------------------------+----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | r | 56 | 56 | 166 | 2/0 | 4.905 | In Pipeline 1 | | | +----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedUndirectedAllRelationshipsScan | 1 | (anon_0)-[r]-(anon_1) | 56 | 56 | 28 | 9/0 | 1.573 | In Pipeline 0 | +--------------------------------------------+----+-----------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 194
有向关系类型扫描
DirectedRelationshipTypeScan
操作符从关系类型索引中获取所有具有特定类型的关系及其起始节点和结束节点。
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区有向关系类型扫描
PartitionedDirectedRelationshipTypeScan
是 DirectedRelationshipTypeScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: FRIENDS_WITH]->()
RETURN r
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 ++------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | r | 12 | 12 | 12 | 0/0 | 0.560 | In Pipeline 1 | | | +----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedDirectedRelationshipTypeScan | 1 | (anon_0)-[r:FRIENDS_WITH]->(anon_1) | 12 | 12 | 13 | 2/0 | 0.167 | In Pipeline 0 | +------------------------------------------+----+-------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 25
无向关系类型扫描
UndirectedRelationshipTypeScan
操作符从关系类型索引中获取所有具有特定类型的关系及其起始节点和结束节点。
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区无向关系类型扫描
PartitionedUndirectedRelationshipTypeScan
是 UndirectedRelationshipTypeScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: FRIENDS_WITH]-()
RETURN r
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +--------------------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | r | 24 | 24 | 24 | 1/0 | 1.466 | In Pipeline 1 | | | +----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedUndirectedRelationshipTypeScan | 1 | (anon_0)-[r:FRIENDS_WITH]-(anon_1) | 24 | 24 | 13 | 2/0 | 0.171 | In Pipeline 0 | +--------------------------------------------+----+------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 37
有向联合关系类型扫描
DirectedUnionRelationshipTypesScan
操作符从关系类型索引中获取所有具有至少一种提供类型的关系及其起始节点和结束节点。
随着块存储格式成为默认,此操作符将不再用于生成计划。有关各种可用存储格式的更多详细信息,请参阅操作手册 → 存储格式。 |
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区有向联合关系类型扫描
PartitionedDirectedUnionRelationshipTypeScan
是 DirectedUnionRelationshipTypesScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
随着块存储格式成为默认,此操作符将不再用于生成计划。有关各种可用存储格式的更多详细信息,请参阅操作手册 → 存储格式。 |
CYPHER runtime=parallel
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]->()
RETURN friendOrFoe
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +------------------------------------------------+----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------------+----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | friendOrFoe | 15 | 12 | 12 | 0/0 | 0.570 | In Pipeline 1 | | | +----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedDirectedUnionRelationshipTypesScan | 1 | (anon_0)-[friendOrFoe:FRIENDS_WITH|FOE]->(anon_1) | 15 | 12 | 13 | 2/0 | 0.170 | In Pipeline 0 | +------------------------------------------------+----+---------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 25
无向联合关系类型扫描
UndirectedUnionRelationshipTypesScan
操作符从关系类型索引中获取所有具有至少一种提供类型的关系及其起始节点和结束节点。
随着块存储格式成为默认,此操作符将不再用于生成计划。有关各种可用存储格式的更多详细信息,请参阅操作手册 → 存储格式。 |
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区无向联合关系类型扫描
PartitionedUndirectedUnionRelationshipTypeScan
是 UndirectedUnionRelationshipTypesScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
随着块存储格式成为默认,此操作符将不再用于生成计划。有关各种可用存储格式的更多详细信息,请参阅操作手册 → 存储格式。 |
CYPHER runtime=parallel
PROFILE
MATCH ()-[friendOrFoe: FRIENDS_WITH|FOE]-()
RETURN friendOrFoe
Planner COST Runtime PARALLEL Runtime version 2025.05 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
有向关系索引扫描
DirectedRelationshipIndexScan
操作符检查索引中存储的所有值,返回所有具有特定关系类型和指定属性的关系及其起始节点和结束节点。
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区有向关系索引扫描
PartitionedDirectedRelationshipIndexScan
是 DirectedRelationshipIndexScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +-------------------------------------------+----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +-------------------------------------------+----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | r | 15 | 15 | 70 | 1/0 | 2.865 | In Pipeline 1 | | | +----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedDirectedRelationshipIndexScan | 1 | RANGE INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title IS NOT NULL | 15 | 15 | 16 | 2/0 | 0.527 | In Pipeline 0 | +-------------------------------------------+----+----------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 86
无向关系索引扫描
UndirectedRelationshipIndexScan
操作符检查索引中存储的所有值,返回所有具有特定关系类型和指定属性的关系及其起始节点和结束节点。
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区无向关系索引扫描
PartitionedUndirectedRelationshipIndexScan
是 UndirectedRelationshipIndexScan
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title IS NOT NULL
RETURN r
Planner COST Runtime PARALLEL Runtime version 2025.05 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
有向关系索引包含扫描
DirectedRelationshipIndexContainsScan
操作符检查索引中存储的所有值,搜索包含特定 STRING
的条目;例如,在包含 CONTAINS
的查询中。尽管这比索引查找(因为它需要检查所有条目)慢,但它仍然比使用 DirectedRelationshipTypeScan
进行类型扫描和属性存储过滤器所导致的间接性要快。
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title CONTAINS 'senior'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 4 | 0 | | | | | | | +--------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +DirectedRelationshipIndexContainsScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title CONTAINS $autostring_0 | 0 | 4 | 5 | 120 | 3/0 | 1.051 | Fused in Pipeline 0 | +----------------------------------------+--------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 5, total allocated memory: 184
无向关系索引包含扫描
UndirectedRelationshipIndexContainsScan
操作符检查索引中存储的所有值,搜索包含特定 STRING
的条目;例如,在包含 CONTAINS
的查询中。尽管这比索引查找(因为它需要检查所有条目)慢,但它仍然比使用 DirectedRelationshipTypeScan
进行类型扫描和属性存储过滤器所导致的间接性要快。
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title CONTAINS 'senior'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 8 | 0 | | | | | | | +-------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +UndirectedRelationshipIndexContainsScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]-(anon_1) WHERE title CONTAINS $autostring_0 | 0 | 8 | 5 | 120 | 3/0 | 2.684 | Fused in Pipeline 0 | +------------------------------------------+-------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 5, total allocated memory: 184
有向关系索引以...结束扫描
DirectedRelationshipIndexEndsWithScan
操作符检查索引中存储的所有值,搜索以特定 STRING
结尾的条目;例如,在包含 ENDS WITH
的查询中。尽管这比索引查找(因为它需要检查所有条目)慢,但它仍然比使用 NodeByLabelScan
进行标签扫描和属性存储过滤器所导致的间接性要快。
PROFILE
MATCH ()-[r: WORKS_IN]->()
WHERE r.title ENDS WITH 'developer'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r | 0 | 8 | 0 | | | | | | | +---------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +DirectedRelationshipIndexEndsWithScan | TEXT INDEX (anon_0)-[r:WORKS_IN(title)]->(anon_1) WHERE title ENDS WITH $autostring_0 | 0 | 8 | 9 | 120 | 3/0 | 1.887 | Fused in Pipeline 0 | +----------------------------------------+---------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 9, total allocated memory: 184
无向关系索引以...结束扫描
UndirectedRelationshipIndexEndsWithScan
操作符检查索引中存储的所有值,搜索以特定 STRING
结尾的条目;例如,在包含 ENDS WITH
的查询中。尽管这比索引查找(因为它需要检查所有条目)慢,但它仍然比使用 NodeByLabelScan
进行标签扫描和属性存储过滤器所导致的间接性要快。
PROFILE
MATCH ()-[r: WORKS_IN]-()
WHERE r.title ENDS WITH 'developer'
RETURN r
Planner COST Runtime PIPELINED Runtime version 2025.05 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
有向关系索引查找
DirectedRelationshipIndexSeek
操作符使用索引查找来查找关系及其起始节点和结束节点。关系变量和使用的索引显示在操作符的参数中。
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区有向关系索引查找
PartitionedDirectedRelationshipIndexSeek
是 DirectedRelationshipIndexSeek
操作符的一种变体,由并行运行时使用。它允许将索引分成不同的段,每个段可以独立并行扫描。
CYPHER runtime=parallel
PROFILE
MATCH (candidate)-[r:WORKS_IN]->()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PARALLEL Runtime version 2025.05 Batch size 128 +-------------------------------------------+----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +-------------------------------------------+----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +ProduceResults | 0 | candidate | 2 | 1 | 2 | 2/0 | 0.284 | In Pipeline 1 | | | +----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ | +PartitionedDirectedRelationshipIndexSeek | 1 | RANGE INDEX (candidate)-[r:WORKS_IN(title)]->(anon_0) WHERE title = $autostring_0 | 2 | 1 | 2 | 2/0 | 0.148 | In Pipeline 0 | +-------------------------------------------+----+-----------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------+ Total database accesses: 4
无向关系索引查找
UndirectedRelationshipIndexSeek
操作符使用索引查找来查找关系及其起始节点和结束节点。关系变量和使用的索引显示在操作符的参数中。
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +----------------------------------+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +----------------------------------+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | candidate | 4 | 2 | 0 | | | | | | | +----------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | | +UndirectedRelationshipIndexSeek | RANGE INDEX (candidate)-[r:WORKS_IN(title)]-(anon_0) WHERE title = $autostring_0 | 4 | 2 | 2 | 120 | 3/1 | 0.791 | Fused in Pipeline 0 | +----------------------------------+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 2, total allocated memory: 184
分区无向关系索引查找
PartitionedUndirectedRelationshipIndexSeek
操作符使用索引查找来查找关系及其起始节点和结束节点。关系变量和使用的索引显示在操作符的参数中。
CYPHER runtime=parallel
PROFILE
MATCH (candidate)-[r:WORKS_IN]-()
WHERE r.title = 'chief architect'
RETURN candidate
Planner COST Runtime PARALLEL Runtime version 2025.05 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
按 Element Id 查找有向关系
DirectedRelationshipByElementIdSeek
操作符从关系存储中按元素 ID 读取一个或多个关系(通过函数 elementId() 指定),并生成关系以及关系的源节点和目标节点。
PROFILE
MATCH (n1)-[r]->()
WHERE elementId(r) = 0
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +--------------------------------------+----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------------------+----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ | +ProduceResults | 0 | r, n1 | 1 | 0 | 0 | 0 | 0/0 | 0.314 | | | | +----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +DirectedRelationshipByElementIdSeek | 1 | (n1)-[r]->(anon_0) WHERE elementId(r) = $autoint_0 | 1 | 0 | 0 | 248 | 0/0 | 2.337 | In Pipeline 0 | +--------------------------------------+----+----------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ Total database accesses: 0, total allocated memory: 312
按 Id 查找有向关系
DirectedRelationshipByIdSeek
操作符从关系存储中按 ID 读取一个或多个关系,并生成关系以及关系的源节点和目标节点。
PROFILE
MATCH (n1)-[r]->()
WHERE id(r) = 0
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2025.05 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
按 Element Id 查找无向关系
UndirectedRelationshipByElementIdSeek
操作符从关系存储中按元素 ID 读取一个或多个关系(通过函数 elementId() 指定)。由于方向未指定,因此每个关系会生成两行,这是起始节点和结束节点组合交替的结果。
PROFILE
MATCH (n1)-[r]-()
WHERE elementId(r) = 1
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +---------------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +---------------------------------------+--------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | r, n1 | 2 | 2 | 0 | | | | | | | +--------------------------------------------+----------------+------+---------+----------------+ | | | | +UndirectedRelationshipByElementIdSeek| (n1)-[r]-(anon_0) WHERE elementId(r) = $autoint_0 | 2 | 2 | 1 | 120 | 4/0 | 0.332 | Fused in Pipeline 0 | +---------------------------------+--------------------------------------------+-----+---------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
按 Id 查找无向关系
UndirectedRelationshipByIdSeek
操作符从关系存储中按 ID 读取一个或多个关系(通过函数 Id() 指定)。由于方向未指定,因此每个关系会生成两行,这是起始节点和结束节点组合交替的结果。
PROFILE
MATCH (n1)-[r]-()
WHERE id(r) = 1
RETURN r, n1
Planner COST Runtime PIPELINED Runtime version 2025.05 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
有向关系索引按范围查找
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 2025.05 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
分区有向关系索引按范围查找
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 2025.05 Batch size 128 +--------------------------------------------------+----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------------------------------+----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | candidate | 4 | 15 | 30 | 1/0 | 1.031 | In Pipeline 1 | | | +----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+ | +Filter | 1 | candidate:Person | 4 | 15 | 30 | | | | | | +----+----------------------------------------------------------------------------------------+----------------+------+---------+ | | | | +PartitionedDirectedRelationshipIndexSeekByRange | 2 | RANGE INDEX (candidate)-[r:WORKS_IN(duration)]->(location) WHERE duration > $autoint_0 | 4 | 15 | 16 | 3/0 | 0.203 | Fused in Pipeline 0 | +--------------------------------------------------+----+----------------------------------------------------------------------------------------+----------------+------+---------+------------------------+-----------+---------------------+ Total database accesses: 76
无向关系索引按范围查找
UndirectedRelationshipIndexSeekByRange
操作符使用索引查找来查找关系及其起始节点和结束节点,其中属性值与给定的前缀 STRING
匹配。UndirectedRelationshipIndexSeekByRange
可用于 STARTS WITH
和比较操作符,例如 <
、>
、<=
和 >=
。
PROFILE
MATCH (candidate: Person)-[r:WORKS_IN]-(location)
WHERE r.duration > 100
RETURN candidate
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区无向关系索引按范围查找
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 2025.05 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
嵌套循环和连接操作符
嵌套循环操作符通过对左侧 (LHS) 的每一行迭代右侧 (RHS) 来处理数据。LHS 的每一行都会触发 RHS 的执行,从而为每个 LHS 元素有效地在 RHS 上创建一个循环。
应用
所有不同的 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 2025.05 Batch size 128 +------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | p, q | 1 | 0 | 0 | | | | | | | +-------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Apply | | 1 | 0 | 0 | | | | | | |\ +-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +NodeIndexSeek | RANGE INDEX q:Person(name) WHERE name = p.secondName | 1 | 0 | 0 | 2152 | 0/0 | 0.219 | Fused in Pipeline 1 | | | +-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +NodeIndexSeek | RANGE INDEX p:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 120 | 0/1 | 0.236 | In Pipeline 0 | +------------------+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 2, total allocated memory: 2216
半应用
SemiApply
操作符测试是否存在模式谓词,它是 Apply
操作符的一种变体。如果右侧操作符至少生成一行,则左侧操作符的行将由 SemiApply
操作符生成。这使得 SemiApply
成为一个过滤操作符,主要用于查询中的模式谓词。
PROFILE
CYPHER runtime=slotted
MATCH (p:Person)
WHERE (p)-[:FRIENDS_WITH]->(:Person)
RETURN p.name
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+-------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+-------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | `p.name` | 11 | 10 | 0 | 0/0 | | | +-------------------------------------+----------------+------+---------+------------------------+ | +Projection | p.name AS `p.name` | 11 | 10 | 10 | 1/0 | | | +-------------------------------------+----------------+------+---------+------------------------+ | +SemiApply | | 11 | 10 | 0 | 0/0 | | |\ +-------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_3:Person | 12 | 0 | 10 | 0/0 | | | | +-------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (p)-[anon_2:FRIENDS_WITH]->(anon_3) | 12 | 10 | 51 | 28/0 | | | | +-------------------------------------+----------------+------+---------+------------------------+ | | +Argument | p | 14 | 14 | 0 | 0/0 | | | +-------------------------------------+----------------+------+---------+------------------------+ | +NodeByLabelScan| p:Person | 14 | 14 | 35 | 1/0 | +-----------------+-------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 142, total allocated memory: 64
反半应用
AntiSemiApply
操作符测试模式是否不存在,它是 Apply
操作符的一种变体。如果右侧操作符不生成任何行,则左侧操作符的行将由 AntiSemiApply
操作符生成。这使得 AntiSemiApply
成为一个过滤操作符,用于查询中的模式谓词。
PROFILE
CYPHER runtime=slotted
MATCH
(me:Person {name: 'me'}),
(other:Person)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
Planner COST Runtime SLOTTED Runtime version 2025.05 +-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | +-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | +ProduceResults | `other.name` | 4 | 12 | 0 | | 0/0 | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | +Projection | other.name AS `other.name` | 4 | 12 | 12 | | 1/0 | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | +AntiSemiApply | | 4 | 12 | 0 | | 0/0 | | |\ +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | | +Expand(Into) | (me)-[anon_2:FRIENDS_WITH]->(other) | 1 | 0 | 81 | 896 | 28/0 | | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | | +Argument | me, other | 14 | 14 | 0 | | 0/0 | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | +CartesianProduct | | 14 | 14 | 0 | | 0/0 | | |\ +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | | +NodeByLabelScan| other:Person | 14 | 14 | 35 | | 1/0 | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ | +NodeIndexSeek | RANGE INDEX me:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | | 0/1 | +-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+ Total database accesses: 166, total allocated memory: 976
假定半应用
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 2025.05 +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | `other.name` | 13 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +Projection | other.name AS `other.name` | 13 | 14 | 14 | 1/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +SelectOrSemiApply | anon_9 | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_7:Location | 14 | 0 | 4 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_6:WORKS_IN]->(anon_7) | 14 | 4 | 15 | 8/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 4 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +LetSemiApply | | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_5:Person | 12 | 0 | 10 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_4:FRIENDS_WITH]->(anon_5) | 12 | 10 | 51 | 28/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +NodeByLabelScan | other:Person | 14 | 14 | 35 | 1/0 | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 165, total allocated memory: 64
假定反半应用
LetAntiSemiApply
操作符测试模式是否不存在,它是 Apply
操作符的一种变体。当查询包含多个否定模式谓词——即由 OR
分隔,并且至少一个谓词包含 NOT
的谓词——LetAntiSemiApply
将用于评估这些谓词中的第一个。它将记录评估谓词的结果,但将任何过滤操作留给另一个操作符。在示例中,LetAntiSemiApply
将用于检查每个人是否不存在 FRIENDS_WITH
关系。
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 2025.05 +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | `other.name` | 11 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +Projection | other.name AS `other.name` | 11 | 14 | 14 | 1/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +SelectOrSemiApply | anon_9 | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_7:Location | 14 | 0 | 10 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_6:WORKS_IN]->(anon_7) | 14 | 10 | 38 | 20/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 10 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +LetAntiSemiApply | | 14 | 14 | 0 | 0/0 | | |\ +-----------------------------------------+----------------+------+---------+------------------------+ | | +Filter | anon_5:Person | 12 | 0 | 10 | 0/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Expand(All) | (other)-[anon_4:FRIENDS_WITH]->(anon_5) | 12 | 10 | 51 | 28/0 | | | | +-----------------------------------------+----------------+------+---------+------------------------+ | | +Argument | other | 14 | 14 | 0 | 0/0 | | | +-----------------------------------------+----------------+------+---------+------------------------+ | +NodeByLabelScan | p:Person | 14 | 14 | 35 | 1/0 | +--------------------+-----------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 142, total allocated memory: 64
选择或半应用
SelectOrSemiApply
操作符测试是否存在模式谓词并评估谓词,它是 Apply
操作符的一种变体。此操作符允许混合使用普通谓词和检查模式是否存在的模式谓词。首先,评估普通表达式谓词,并且只有当它返回 false
时,才评估开销较大的模式谓词。
PROFILE
MATCH (other:Person)
WHERE other.age > 25 OR (other)-[:FRIENDS_WITH]->(:Person)
RETURN other.name
Planner COST Runtime PIPELINED Runtime version 2025.05 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
选择或反半应用
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 2025.05 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
假定选择或半应用
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 2025.05 +-----------------------+-----------------------------------------+----------------+------+---------+------------------------+ | 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
假定选择或反半应用
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 2025.05 +---------------------------+-----------------------------------------+----------------+------+---------+------------------------+ | 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
汇总应用
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 2025.05 +-----------------+-----------------------------------+----------------+------+---------+------------------------+ | 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
的工作方式与 Apply
操作符类似,但在指定行数后将提交当前事务。
以下查询使用变量作用域子句(在 Neo4j 5.23 中引入)将变量导入到 CALL 子查询中。如果您使用的是旧版 Neo4j,请改用导入 WITH 子句。 |
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
CALL (line) {
CREATE (a: Artist {name: line[0]})
RETURN a
} IN TRANSACTIONS OF 100 ROWS
RETURN a;
Planner COST Runtime PIPELINED Runtime version 2025.05 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
操作符指示用作 Apply
操作符右侧参数的变量。
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | | 1 | 0 | 0 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | 1 | | 1 | 0 | 0 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Apply | 2 | | 1 | 1 | 0 | | | | | | |\ +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +LockingMerge | 3 | CREATE (s)-[anon_0:FRIENDS_WITH]->(s), LOCK(s) | 1 | 1 | 1 | | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +Expand(Into) | 4 | (s)-[anon_0:FRIENDS_WITH]->(s) | 0 | 0 | 10 | 904 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +Argument | 5 | s | 1 | 3 | 0 | 2280 | 2/0 | 0.460 | Fused in Pipeline 1 | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +NodeIndexSeek | 6 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 1/0 | 0.211 | In Pipeline 0 | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 15, total allocated memory: 2232
参数跟踪器
ArgumentTracker
操作符用于确保逐行语义。这限制了 Cypher 运行时不能将操作分批处理成更大的块。
以下查询使用变量作用域子句(在 Neo4j 5.23 中引入)将变量导入到 CALL 子查询中。如果您使用的是旧版 Neo4j,请改用导入 WITH 子句。 |
PROFILE
MATCH (s:Person {name: 'me'})
CALL (s) {
SET s.seen = coalesce(s.seen + 1,1)
RETURN s.seen AS result
}
RETURN result;
Planner COST Runtime PIPELINED Runtime version 2025.05 +--------------------+----+---------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | 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
笛卡尔积
CartesianProduct
操作符生成两个输入的笛卡尔积——来自左子操作符的每一行将与来自右子操作符的所有行组合。CartesianProduct
通常表现出较差的性能,应尽可能避免使用。
PROFILE
MATCH
(p:Person),
(t:Team)
RETURN p, t
Planner COST Runtime PIPELINED Runtime version 2025.05 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
哈希连接概述
哈希连接有两个输入:构建输入和探测输入。查询规划器分配这些角色,使得两个输入中较小的一个成为构建输入。构建输入被急切地拉入,并用于构建探测表。完成此操作后,将对来自探测输入侧的每一行检查探测表。
在查询计划中,构建输入始终是左操作符,探测输入是右操作符。
节点哈希连接
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 2025.05 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
值哈希连接
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 2025.05 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
节点左/右外哈希连接
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 2025.05 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
操作符将产生单行。
PROFILE
CYPHER runtime=pipelined
MATCH
(me:Person {name: 'me'}),
(other:Person)
WHERE NOT (me)-[:FRIENDS_WITH]->(other)
RETURN other.name
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | `other.name` | 4 | 12 | 0 | | 0/0 | 0.068 | | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | +Projection | other.name AS `other.name` | 4 | 12 | 24 | | 2/0 | 0.111 | In Pipeline 4 | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +Apply | | 4 | 12 | 0 | | 0/0 | | | | |\ +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | | +Anti | | 4 | 12 | 0 | 1256 | 0/0 | 0.084 | In Pipeline 4 | | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | | +Limit | 1 | 11 | 2 | 0 | 752 | | | | | | | +--------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +Expand(Into) | (me)-[anon_2:FRIENDS_WITH]->(other) | 1 | 2 | 81 | 2632 | | | | | | | +--------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +Argument | me, other | 14 | 14 | 0 | 3192 | 1/0 | 0.904 | Fused in Pipeline 3 | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +CartesianProduct | | 14 | 14 | 0 | 3672 | | 1.466 | In Pipeline 2 | | |\ +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | | +NodeByLabelScan| other:Person | 14 | 14 | 35 | | | | | | | +--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +NodeIndexSeek | RANGE INDEX me:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 120 | 0/1 | 0.493 | In Pipeline 0 | +-------------------+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 178, total allocated memory: 6744
可选
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 2025.05 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)
操作符将遍历传入或传出关系。
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)
RETURN fof
Planner COST Runtime PIPELINED Runtime version 2025.05 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)
操作符用于查找连接这两个节点的所有关系。由于关系的起始节点和结束节点都已在作用域内,因此将使用度数最小的节点。当密集节点作为端点出现时,这可能会产生显著差异。
PROFILE
MATCH (p:Person {name: 'me'})-[:FRIENDS_WITH]->(fof)-->(p)
RETURN fof
Planner COST Runtime PIPELINED Runtime version 2025.05 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
可选展开所有
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 2025.05 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
可选展开到
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 2025.05 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
变长展开所有
给定一个起始节点,VarLengthExpand(All)
操作符将遍历可变长度和量化关系。
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(q:Person)
RETURN p, q
Planner COST Runtime PIPELINED Runtime version 2025.05 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
变长展开到
当起始节点和结束节点都已找到时,VarLengthExpand(Into)
操作符用于查找连接这两个节点的所有可变长度和量化关系。
PROFILE
MATCH (p:Person)-[:FRIENDS_WITH *1..2]-(p:Person)
RETURN p
Planner COST Runtime PIPELINED Runtime version 2025.05 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
变长展开剪枝
给定一个起始节点,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 2025.05 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
广度优先变长展开剪枝
给定一个起始节点,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 2025.05 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
重复 (Trail)
给定一个起始节点,Repeat(Trail)
操作符将遍历无法通过 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 2025.05 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
元数据置空
NullifyMetadata
负责清理由 Repeat(Trail)
产生的状态。它仅在 Repeat(Trail)
之后直接规划。
PROFILE
MATCH (me:Person) ((a)-[:FRIENDS_WITH]-(b)-[:FRIENDS_WITH]-(c) WHERE a.name <> b.name AND a.name <> c.name AND b.name <> c.name){1,2} (friend:Person)
RETURN me, friend
Planner COST Runtime PIPELINED Runtime version 2025.05 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
最短路径
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 2025.05 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
有状态最短路径 (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 2025.05 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
有状态最短路径 (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 2025.05 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
三元组选择
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 2025.05 +-------------------+----+----------------------------------------+----------------+------+---------+----------------+------------------------+ | 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
三元组构建
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 2025.05 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
三元组过滤
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 2025.05 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
联合操作符
Cypher 中的联合操作符通过合并行来组合多个查询部分的结果。有关更多信息,请参阅关于 UNION
子句的页面。
示例 79. Union
Union
操作符将右子操作符的结果与左子操作符的结果连接起来。
PROFILE
MATCH (p:Location)
RETURN p.name
UNION ALL
MATCH (p:Country)
RETURN p.name
Planner COST Runtime PIPELINED Runtime version 2025.05 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
聚合操作符
聚合操作符用于计算图数据组的摘要统计信息,从而实现诸如计数节点、关系或属性等操作。
急切聚合
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 2025.05 Batch size 128 +-------------------+----+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-------------------+----+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | location, people | 4 | 6 | 0 | | 0/0 | 0.022 | In Pipeline 1 | | | +----+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +EagerAggregation | 1 | cache[l.name] AS location, collect(p.name) AS people | 4 | 6 | 30 | 2584 | | | | | | +----+------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Filter | 2 | p:Person | 15 | 15 | 30 | | | | | | | +----+------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Expand(All) | 3 | (l)<-[anon_0:WORKS_IN]-(p) | 15 | 15 | 26 | | | | | | | +----+------------------------------------------------------+----------------+------+---------+----------------+ | | | | +CacheProperties | 4 | cache[l.name] | 10 | 10 | 20 | | | | | | | +----+------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeByLabelScan | 5 | l:Location | 10 | 10 | 11 | 120 | 4/0 | 0.813 | Fused in Pipeline 0 | +-------------------+----+------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 117, total allocated memory: 2664
有序聚合
OrderedAggregation
操作符是 EagerAggregation
操作符的一种优化,它利用了传入行的顺序。此操作符使用惰性评估,与 EagerAggregation
操作符相比,系统内存压力较低。
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p.name, count(*) AS count
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline | +-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ | +ProduceResults | `p.name`, count | 0 | 2 | 0 | | 0/0 | 0.045 | | | | | +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | | | +OrderedAggregation | cache[p.name] AS `p.name`, count(*) AS count | 0 | 2 | 0 | 288 | 0/0 | 0.175 | `p.name` ASC | In Pipeline 1 | | | +--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ | +NodeIndexSeekByRange | RANGE INDEX p:Person(name) WHERE name STARTS WITH $autostring_0, cache[p.name] | 0 | 2 | 3 | 120 | 0/1 | 0.529 | p.name ASC | In Pipeline 0 | +-----------------------+--------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+--------------+---------------+ Total database accesses: 3, total allocated memory: 352
从计数存储中获取节点计数
NodeCountFromCountStore
操作符使用计数存储来回答有关节点计数的问题。这比通过实际计数达到相同结果的 EagerAggregation
操作符快得多。然而,由于计数存储只存储有限范围的组合,对于更复杂的查询仍将使用 EagerAggregation
。例如,我们可以获取所有节点的计数,以及带有一个标签的节点的计数,但不能获取带有一个以上标签的节点的计数。
PROFILE
MATCH (p:Person)
RETURN count(p) AS people
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | people | 1 | 1 | 0 | | | | | | | +------------------------------+----------------+------+---------+----------------+ | | | | +NodeCountFromCountStore | count( (:Person) ) AS people | 1 | 1 | 1 | 120 | 0/0 | 0.169 | Fused in Pipeline 0 | +--------------------------+------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 1, total allocated memory: 184
从计数存储中获取关系计数
RelationshipCountFromCountStore
操作符使用计数存储来回答有关关系计数的问题。这比通过实际计数达到相同结果的 EagerAggregation
操作符快得多。然而,由于计数存储只存储有限范围的组合,对于更复杂的查询仍将使用 EagerAggregation
。例如,我们可以获取所有关系的计数、具有某种类型的关系的计数、一端带有标签的关系的计数,但不能获取两端都带有标签的关系的计数。
PROFILE
MATCH (p:Person)-[r:WORKS_IN]->()
RETURN count(r) AS jobs
Planner COST Runtime PIPELINED Runtime version 2025.05 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
过滤、排序和投影操作符
此组中的操作符处理数据行如何为查询结果进行转换、过滤和最终确定。它们负责构建返回数据的结构,
空结果
EmptyResult
操作符急切地加载所有传入数据并丢弃它。
PROFILE
CREATE (:Person)
Planner COST Runtime PIPELINED Runtime version 2025.05 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
生成结果
ProduceResults
操作符准备结果,使其可供用户消费,例如将内部值转换为用户值。它存在于每个向用户返回数据的查询中,对性能优化影响不大。
PROFILE
MATCH (n)
RETURN n
Planner COST Runtime PIPELINED Runtime version 2025.05 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
操作符过滤来自子操作符的每一行,只通过评估谓词为 true
的行。
PROFILE
MATCH (p:Person)
WHERE p.name =~ '^a.*'
RETURN p
Planner COST Runtime PIPELINED Runtime version 2025.05 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
空行
EmptyRow
操作符返回一个没有列的单行。
PROFILE
CYPHER runtime=slotted
FOREACH (value IN [1,2,3] | MERGE (:Person {age: value}))
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+--------------------------------------+----------------+------+---------+------------------------+ | 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
缓存属性
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 2025.05 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
操作符评估一组表达式,并生成一个包含表达式结果的行。
PROFILE
RETURN 'hello' AS greeting
Planner COST Runtime PIPELINED Runtime version 2025.05 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
投影端点
ProjectEndpoints
操作符投影关系的起始节点和结束节点。
PROFILE
CREATE (n)-[p:KNOWS]->(m)
WITH p AS r
MATCH (u)-[r]->(v)
RETURN u, v
Planner COST Runtime PIPELINED Runtime version 2025.05 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
将从其源惰性地拉取数据并建立状态。这可能会导致系统内存压力增加。
PROFILE
MATCH (l:Location)<-[:WORKS_IN]-(p:Person)
RETURN DISTINCT p
Planner COST Runtime PIPELINED Runtime version 2025.05 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
有序去重
OrderedDistinct
操作符是 Distinct
操作符的一种优化,它利用了传入行的顺序。此操作符在系统中的内存压力低于 Distinct
操作符。
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN DISTINCT p.name
Planner COST Runtime PIPELINED Runtime version 2025.05 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
过程调用
ProcedureCall
操作符表示对过程的调用。
PROFILE
CALL db.labels() YIELD label
RETURN *
ORDER BY label
Planner COST Runtime PIPELINED Runtime version 2025.05 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
操作符为列表中的每个项返回一行。
PROFILE
UNWIND range(1, 5) AS value
RETURN value
Planner COST Runtime PIPELINED Runtime version 2025.05 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
分区展开
CYPHER runtime=parallel
PROFILE
UNWIND range(1, 5) AS value
RETURN value
Planner COST Runtime PARALLEL Runtime version 2025.05 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
操作符根据提供的键对行进行排序。为了对数据进行排序,需要急切地拉取源操作符的所有数据并将其保留在查询状态中,这将导致系统中内存压力增加。
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Ordered by | Pipeline | +------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+ | +ProduceResults | p | 14 | 14 | 0 | | 2/0 | 0.178 | | | | | +--------------------+----------------+------+---------+----------------+------------------------+-----------+ | | | +Sort | `p.name` ASC | 14 | 14 | 0 | 1192 | 0/0 | 0.107 | p.name ASC | In Pipeline 1 | | | +--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+ | +Projection | p.name AS `p.name` | 14 | 14 | 14 | | | | | | | | +--------------------+----------------+------+---------+----------------+ | +------------+ | | +NodeByLabelScan |p:Person | 14 | 14 | 35 | 120 | 3/0 | 0,221 | | Fused in Pipeline 0 | +------------------+--------------------+----------------+------+---------+----------------+------------------------+-----------+------------+---------------------+ Total database accesses: 85, total allocated memory: 1272
部分排序
PartialSort
操作符是 Sort
操作符的优化,它利用了传入行的顺序。此操作符使用惰性求值,并且系统中内存压力低于 Sort
操作符。部分排序仅适用于按多个列排序的情况。
PROFILE
MATCH (p:Person)
WHERE p.name STARTS WITH 'P'
RETURN p
ORDER BY p.name, p.age
Planner COST Runtime PIPELINED Runtime version 2025.05 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
取前N行
Top
操作符返回按提供的键排序的前 n
行。它只保留前 n
行,而不是对整个输入进行排序。
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.name
LIMIT 2
Planner COST Runtime PIPELINED Runtime version 2025.05 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
部分取前N行
PartialTop
操作符是 Top
操作符的优化,它利用了传入行的顺序。此操作符使用惰性求值,并且系统中内存压力低于 Top
操作符。部分取前N行仅适用于按多个列排序的情况。
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 2025.05 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
操作符返回传入输入的前 n
行。
PROFILE
MATCH (p:Person)
RETURN p
LIMIT 3
Planner COST Runtime PIPELINED Runtime version 2025.05 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
穷尽式限制
ExhaustiveLimit
操作符与 Limit
操作符类似,但它会始终穷尽输入。在结合使用 LIMIT
和更新时使用。
PROFILE
MATCH (p:Person)
SET p.seen = true
RETURN p
LIMIT 3
Planner COST Runtime PIPELINED Runtime version 2025.05 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
操作符跳过传入行的前 n
行。
PROFILE
MATCH (p:Person)
RETURN p
ORDER BY p.id
SKIP 1
Planner COST Runtime PIPELINED Runtime version 2025.05 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
数据修改操作符
此组中的操作符通过创建、删除和修改节点、关系和属性来修改图数据。
创建
Create
操作符用于创建节点和关系。
PROFILE
CREATE
(max:Person {name: 'Max'}),
(chris:Person {name: 'Chris'})
CREATE (max)-[:FRIENDS_WITH]->(chris)
Planner COST Runtime PIPELINED Runtime version 2025.05 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
操作符用于删除节点或关系。
PROFILE
MATCH (you:Person {name: 'you'})
DELETE you
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | | 0 | 0 | 0 | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | 1 | | 0 | 0 | 0 | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Delete | 2 | you | 0 | 0 | 0 | | | | | | | +----+--------------------------------------------------------+----------------+------+---------+----------------+ | | | | +NodeIndexSeek | 3 | RANGE INDEX you:Person(name) WHERE name = $autostring_0 | 0 | 0 | 1 | 120 | 1/0 | 0.330 | Fused in Pipeline 0 | +-----------------+----+--------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 13, total allocated memory: 216
分离删除
DetachDelete
操作符用于所有包含 DETACH DELETE 子句的查询中,当删除节点及其关系时。
PROFILE
MATCH (p:Person)
DETACH DELETE p
Planner COST Runtime PIPELINED Runtime version 2025.05 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
操作符将读取或创建节点和/或关系。
如果找到匹配项,它将对每个传入行执行提供的 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 2025.05 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
锁定合并
LockingMerge
操作符与 Merge
操作符类似,但必要时在创建关系时会锁定起始节点和结束节点。
PROFILE
MATCH (s:Person {name: 'me'})
MERGE (s)-[:FRIENDS_WITH]->(s)
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | 0 | | 1 | 0 | 0 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | 1 | | 1 | 0 | 0 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | +Apply | 2 | | 1 | 1 | 0 | | | | | | |\ +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +LockingMerge | 3 | CREATE (s)-[anon_0:FRIENDS_WITH]->(s), LOCK(s) | 1 | 1 | 1 | | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +Expand(Into) | 4 | (s)-[anon_0:FRIENDS_WITH]->(s) | 0 | 0 | 10 | 904 | | | | | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+ | | | | | +Argument | 5 | s | 1 | 3 | 0 | 2280 | 2/0 | 0.460 | Fused in Pipeline 1 | | | +----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +NodeIndexSeek | 6 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 1/0 | 0.211 | In Pipeline 0 | +-----------------+----+-------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 15, total allocated memory: 2232
遍历
Foreach
操作符在左子操作符和右子操作符之间执行嵌套循环。以类似于 Apply 操作符的方式,它从左侧获取一行,并使用 Argument 操作符将其提供给右侧的操作符树。Foreach
将产生来自左侧的所有行;右侧的所有结果都被拉入并丢弃。
PROFILE
FOREACH (value IN [1,2,3] | CREATE (:Person {age: value}))
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+---------------------------------------------------------+----------------+------+---------+------------------------+ | 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
的工作方式与 Foreach
操作符相同,但仅用于执行子查询。
以下查询使用变量作用域子句(在 Neo4j 5.23 中引入)将变量导入到 CALL 子查询中。如果您使用的是旧版 Neo4j,请改用导入 WITH 子句。 |
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
CALL (line) {
CREATE (a: Artist {name: line[0]})
}
Planner COST Runtime PIPELINED Runtime version 2025.05 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
的工作方式与 Foreach
操作符相同,但在指定行数后将提交当前事务。
以下查询使用变量作用域子句(在 Neo4j 5.23 中引入)将变量导入到 CALL 子查询中。如果您使用的是旧版 Neo4j,请改用导入 WITH 子句。 |
PROFILE
LOAD CSV FROM 'https://neo4j.ac.cn/docs/cypher-refcard/3.3/csv/artists.csv' AS line
CALL (line) {
CREATE (a: Artist {name: line[0]})
} IN TRANSACTIONS OF 100 ROWS
Planner COST Runtime PIPELINED Runtime version 2025.05 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
设置标签
SetLabels
操作符用于设置节点的标签。
PROFILE
MATCH (n)
SET n:Person
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +SetLabels | n:Person | 35 | 35 | 22 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +AllNodesScan | n | 35 | 35 | 36 | 120 | 3/0 | 0.873 | Fused in Pipeline 0 | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 58, total allocated memory: 184
移除标签
RemoveLabels
操作符用于从节点删除标签。
PROFILE
MATCH (n)
REMOVE n:Person
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 35 | 0 | 0 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +RemoveLabels | n:Person | 35 | 35 | 15 | | | | | | | +----------+----------------+------+---------+----------------+ | | | | +AllNodesScan | n | 35 | 35 | 36 | 120 | 3/0 | 0.765 | Fused in Pipeline 0 | +-----------------+----------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 51, total allocated memory: 184
从映射设置节点属性
SetNodePropertiesFromMap
操作符用于从映射设置节点的属性。
PROFILE
MATCH (n)
SET n = {weekday: 'Monday', meal: 'Lunch'}
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 35 | 0 | 0 | | | | | | | +---------------------------------------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 35 | 0 | 0 | | | | | | | +---------------------------------------------------+----------------+------+---------+----------------+ | | | | +SetNodePropertiesFromMap | n = {weekday: $autostring_0, meal: $autostring_1} | 35 | 35 | 105 | | | | | | | +---------------------------------------------------+----------------+------+---------+----------------+ | | | | +AllNodesScan | n | 35 | 35 | 36 | 120 | 5/0 | 3.954 | Fused in Pipeline 0 | +---------------------------+---------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 141, total allocated memory: 184
从映射设置关系属性
SetRelationshipPropertiesFromMap
操作符用于从映射设置关系的属性。
PROFILE
MATCH (n)-[r]->(m)
SET r = {weight: 5, unit: 'kg'}
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 28 | 0 | 0 | | | | | | | +-----------------------------------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 28 | 0 | 0 | | | | | | | +-----------------------------------------------+----------------+------+---------+----------------+ | | | | +SetRelationshipPropertiesFromMap | r = {weight: $autoint_0, unit: $autostring_1} | 28 | 28 | 84 | | | | | | | +-----------------------------------------------+----------------+------+---------+----------------+ | | | | +DirectedAllRelationshipsScan | (n)-[r]->(m) | 28 | 28 | 28 | 120 | 5/0 | 15.278 | Fused in Pipeline 0 | +-----------------------------------+-----------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 112, total allocated memory: 184
设置属性
SetProperty
操作符用于设置节点或关系的属性。
PROFILE
MATCH (n)
SET n.checked = true
Planner COST Runtime PIPELINED Runtime version 2025.05 Batch size 128 +-----------------+------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +-----------------+------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ | +ProduceResults | | 35 | 0 | 0 | | | | | | | +------------------+----------------+------+---------+----------------+ | | | | +EmptyResult | | 35 | 0 | 0 | | | | | | | +------------------+----------------+------+---------+----------------+ | | | | +SetProperty | n.checked = true | 35 | 35 | 70 | | | | | | | +------------------+----------------+------+---------+----------------+ | | | | +AllNodesScan | n | 35 | 35 | 36 | 120 | 3/0 | 0.753 | Fused in Pipeline 0 | +-----------------+------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ Total database accesses: 106, total allocated memory: 184
设置多个属性
SetProperties
操作符用于在节点或关系上设置多个属性。
PROFILE
MATCH (n)
SET n.weekDay = 'Monday', n.meal = 'Lunch'
Planner COST Runtime PIPELINED Runtime version 2025.05 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
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 2025.05 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
操作符,以防止更新影响模式匹配或其他读取操作。下面的查询就体现了这种情况,其中 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 2025.05 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
断言相同节点
AssertSameNode
操作符用于确保在 slotted 和 interpreted 运行时中不违反任何节点属性唯一性约束。示例查找是否存在具有给定名称和 ID 的团队节点,如果不存在,则会创建它。由于在 :Team(name)
和 :Team(id)
上存在两个节点属性唯一性约束,因此 UniqueIndexSeek
操作符找到的任何节点都必须是同一个节点,否则将违反约束。
PROFILE
CYPHER runtime=slotted
MERGE (t:Team {name: 'Engineering', id: 42})
Planner COST Runtime SLOTTED Runtime version 2025.05 +---------------------------------+-------------------------------------------------------+----------------+------+---------+------------------------+ | 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
断言相同关系
AssertSameRelationship
操作符用于确保在 slotted 和 interpreted 运行时中不违反任何关系属性唯一性约束。示例查找是否存在具有给定 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 2025.05 +-------------------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | 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
模式和系统操作符
此组中的操作符管理数据库内的模式和系统级操作。它们处理创建或删除约束和索引、显示或终止事务以及列出可用过程、函数和设置等任务。
创建约束
CreateConstraint
操作符创建约束。
此约束可以具有任何可用的约束类型:
-
属性唯一性约束
-
属性存在性约束 企业版
-
属性类型约束 企业版
-
节点或关系键约束 企业版
以下查询将为带有 Country
标签的节点的 name
属性创建一个名为 uniqueness
的属性唯一性约束。
PROFILE
CREATE CONSTRAINT uniqueness
FOR (c:Country) REQUIRE c.name is UNIQUE
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2025.05 +-------------------+------------------------------------------------------------------+ | Operator | Details | +-------------------+------------------------------------------------------------------+ | +CreateConstraint | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE | +-------------------+------------------------------------------------------------------+ Total database accesses: ?
如果存在则不执行 (约束)
为了避免重复创建相同约束时出现错误,我们对约束使用 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 2025.05 +--------------------------------+------------------------------------------------------------------+ | Operator | Details | +--------------------------------+------------------------------------------------------------------+ | +CreateConstraint | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE | | | +------------------------------------------------------------------+ | +DoNothingIfExists(CONSTRAINT) | CONSTRAINT uniqueness FOR (c:Country) REQUIRE (c.name) IS UNIQUE | +--------------------------------+------------------------------------------------------------------+ Total database accesses: ?
删除约束
DropConstraint
操作符使用约束的名称移除约束,无论类型如何。
PROFILE
DROP CONSTRAINT uniqueness IF EXISTS
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2025.05 +-----------------+---------------------------------+ | Operator | Details | +-----------------+---------------------------------+ | +DropConstraint | CONSTRAINT uniqueness IF EXISTS | +-----------------+---------------------------------+ Total database accesses: ?
显示约束
ShowConstraints
操作符列出约束。它可以包括按约束类型进行过滤,并且可以有默认或完整输出。
PROFILE
SHOW CONSTRAINTS
Planner COST Runtime SLOTTED Runtime version 2025.05 +------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | id, name, type, entityType, labelsOrTypes, properties, ownedIndex | 10 | 3 | 0 | 0/0 | | | +-------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ShowConstraints | allConstraints, defaultColumns | 10 | 3 | 2 | 0/0 | +------------------+-------------------------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 2, total allocated memory: 64
创建索引
CreateIndex
操作符创建索引。
此索引可以是全文、点、范围、文本、向量或查找索引。
以下查询将为带有 Country
标签的节点的 name
属性创建一个名为 my_index
的索引。
PROFILE
CREATE INDEX my_index
FOR (c:Country) ON (c.name)
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2025.05 +--------------+-----------------------------------------------+ | 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 2025.05 +---------------------------+----------------------------------------------------+ | Operator | Details | +---------------------------+----------------------------------------------------+ | +CreateIndex | RANGE INDEX my_index FOR ()-[:KNOWS]-() ON (since) | | | +----------------------------------------------------+ | +DoNothingIfExists(INDEX) | RANGE INDEX my_index FOR ()-[:KNOWS]-() ON (since) | +---------------------------+----------------------------------------------------+ Total database accesses: ?
删除索引
DropIndex
操作符使用索引的名称移除索引。
PROFILE
DROP INDEX my_index
Planner ADMINISTRATION Runtime SCHEMA Runtime version 2025.05 +------------+---------------+ | Operator | Details | +------------+---------------+ | +DropIndex | INDEX my_index| +------------+---------------+ Total database accesses: ?
显示索引
ShowIndexes
操作符列出索引。它可以包括按索引类型进行过滤,并且可以有默认或完整输出。
PROFILE
SHOW INDEXES
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | id, name, state, populationPercent, type, entityType, labelsOrTypes, properties, indexProvider, | 10 | 9 | 0 | 0/0 | | | | owningConstraint | | | | | | | +-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ShowIndexes | allIndexes, defaultColumns | 10 | 9 | 2 | 0/0 | +-----------------+-------------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 2, total allocated memory: 64
显示函数
ShowFunctions
操作符列出函数。它可以包括按内置函数与用户定义函数进行过滤,以及给定用户是否可以执行该函数。输出可以是默认或完整输出。
PROFILE
SHOW FUNCTIONS
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | name, category, description | 10 | 147 | 0 | 0/0 | | | +-----------------------------------------------------+----------------+------+---------+------------------------+ | +ShowFunctions | allFunctions, functionsForUser(all), defaultColumns | 10 | 147 | 0 | 0/0 | +-----------------+-----------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
显示过程
ShowProcedures
操作符列出过程。它可以包括按给定用户是否可以执行该过程进行过滤,并且可以有默认或完整输出。
PROFILE
SHOW PROCEDURES
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+----------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+----------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | name, description, mode, worksOnSystem | 10 | 55 | 0 | 0/0 | | | +----------------------------------------+----------------+------+---------+------------------------+ | +ShowProcedures | proceduresForUser(all), defaultColumns | 10 | 55 | 0 | 0/0 | +-----------------+----------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
显示设置
ShowSettings
操作符列出配置设置。
PROFILE
SHOW SETTINGS
Planner COST Runtime SLOTTED Runtime version 2025.05 +-----------------+---------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-----------------+---------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | name, value, isDynamic, defaultValue, description | 10 | 264 | 0 | 0/0 | | | +---------------------------------------------------+----------------+------+---------+------------------------+ | +ShowSettings | allSettings, defaultColumns | 10 | 264 | 0 | 0/0 | +-----------------+---------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
显示事务
ShowTransactions
操作符列出事务。它可以包括按给定 ID 进行过滤,并且可以有默认或完整输出。
PROFILE
SHOW TRANSACTIONS
Planner COST Runtime SLOTTED Runtime version 2025.05 +-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | Operator | Details | Estimated Rows | Rows | DB Hits | Page Cache Hits/Misses | +-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ProduceResults | database, transactionId, currentQueryId, connectionId, clientAddress, username, currentQuery, | 10 | 1 | 0 | 0/0 | | | | startTime, status, elapsedTime | | | | | | | +-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ | +ShowTransactions | defaultColumns, allTransactions | 10 | 1 | 0 | 0/0 | +-------------------+-----------------------------------------------------------------------------------------------+----------------+------+---------+------------------------+ Total database accesses: 0, total allocated memory: 64
终止事务
TerminateTransactions
操作符按 ID 终止事务。
PROFILE
TERMINATE TRANSACTIONS 'database-transaction-123'
Planner COST Runtime SLOTTED Runtime version 2025.05 +------------------------+--------------------------------------------------------+----------------+------+---------+------------------------+ | 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