pub enum LogicalPlan {
Show 69 variants
Union {
left: Box<LogicalPlan>,
right: Box<LogicalPlan>,
all: bool,
},
Scan {
label_id: u16,
labels: Vec<String>,
variable: String,
filter: Option<Expr>,
optional: bool,
},
ExtIdLookup {
variable: String,
ext_id: String,
filter: Option<Expr>,
optional: bool,
},
ScanAll {
variable: String,
filter: Option<Expr>,
optional: bool,
},
ScanMainByLabels {
labels: Vec<String>,
variable: String,
filter: Option<Expr>,
optional: bool,
},
Empty,
Unwind {
input: Box<LogicalPlan>,
expr: Expr,
variable: String,
},
Traverse {Show 19 fields
input: Box<LogicalPlan>,
edge_type_ids: Vec<u32>,
direction: Direction,
source_variable: String,
target_variable: String,
target_label_id: u16,
step_variable: Option<String>,
min_hops: usize,
max_hops: usize,
optional: bool,
target_filter: Option<Expr>,
path_variable: Option<String>,
edge_properties: HashSet<String>,
is_variable_length: bool,
optional_pattern_vars: HashSet<String>,
scope_match_variables: HashSet<String>,
edge_filter_expr: Option<Expr>,
path_mode: PathMode,
qpp_steps: Option<Vec<QppStepInfo>>,
},
TraverseMainByType {Show 16 fields
type_names: Vec<String>,
input: Box<LogicalPlan>,
direction: Direction,
source_variable: String,
target_variable: String,
step_variable: Option<String>,
min_hops: usize,
max_hops: usize,
optional: bool,
target_filter: Option<Expr>,
path_variable: Option<String>,
is_variable_length: bool,
optional_pattern_vars: HashSet<String>,
scope_match_variables: HashSet<String>,
edge_filter_expr: Option<Expr>,
path_mode: PathMode,
},
Filter {
input: Box<LogicalPlan>,
predicate: Expr,
optional_variables: HashSet<String>,
},
Create {
input: Box<LogicalPlan>,
pattern: Pattern,
},
CreateBatch {
input: Box<LogicalPlan>,
patterns: Vec<Pattern>,
},
Merge {
input: Box<LogicalPlan>,
pattern: Pattern,
on_match: Option<SetClause>,
on_create: Option<SetClause>,
},
Set {
input: Box<LogicalPlan>,
items: Vec<SetItem>,
},
Remove {
input: Box<LogicalPlan>,
items: Vec<RemoveItem>,
},
Delete {
input: Box<LogicalPlan>,
items: Vec<Expr>,
detach: bool,
},
Foreach {
input: Box<LogicalPlan>,
variable: String,
list: Expr,
body: Vec<LogicalPlan>,
},
Sort {
input: Box<LogicalPlan>,
order_by: Vec<SortItem>,
},
Limit {
input: Box<LogicalPlan>,
skip: Option<usize>,
fetch: Option<usize>,
},
Aggregate {
input: Box<LogicalPlan>,
group_by: Vec<Expr>,
aggregates: Vec<Expr>,
},
Distinct {
input: Box<LogicalPlan>,
},
Window {
input: Box<LogicalPlan>,
window_exprs: Vec<Expr>,
},
Project {
input: Box<LogicalPlan>,
projections: Vec<(Expr, Option<String>)>,
},
CrossJoin {
left: Box<LogicalPlan>,
right: Box<LogicalPlan>,
},
Apply {
input: Box<LogicalPlan>,
subquery: Box<LogicalPlan>,
input_filter: Option<Expr>,
},
RecursiveCTE {
cte_name: String,
initial: Box<LogicalPlan>,
recursive: Box<LogicalPlan>,
},
ProcedureCall {
procedure_name: String,
arguments: Vec<Expr>,
yield_items: Vec<(String, Option<String>)>,
},
SubqueryCall {
input: Box<LogicalPlan>,
subquery: Box<LogicalPlan>,
},
VectorKnn {
label_id: u16,
variable: String,
property: String,
query: Expr,
k: usize,
threshold: Option<f32>,
},
InvertedIndexLookup {
label_id: u16,
variable: String,
property: String,
terms: Expr,
},
ShortestPath {
input: Box<LogicalPlan>,
edge_type_ids: Vec<u32>,
direction: Direction,
source_variable: String,
target_variable: String,
target_label_id: u16,
path_variable: String,
min_hops: u32,
max_hops: u32,
},
AllShortestPaths {
input: Box<LogicalPlan>,
edge_type_ids: Vec<u32>,
direction: Direction,
source_variable: String,
target_variable: String,
target_label_id: u16,
path_variable: String,
min_hops: u32,
max_hops: u32,
},
QuantifiedPattern {
input: Box<LogicalPlan>,
pattern_plan: Box<LogicalPlan>,
min_iterations: u32,
max_iterations: u32,
path_variable: Option<String>,
start_variable: String,
binding_variable: String,
},
CreateVectorIndex {
config: VectorIndexConfig,
if_not_exists: bool,
},
CreateFullTextIndex {
config: FullTextIndexConfig,
if_not_exists: bool,
},
CreateScalarIndex {
config: ScalarIndexConfig,
if_not_exists: bool,
},
CreateJsonFtsIndex {
config: JsonFtsIndexConfig,
if_not_exists: bool,
},
DropIndex {
name: String,
if_exists: bool,
},
ShowIndexes {
filter: Option<String>,
},
Copy {
target: String,
source: String,
is_export: bool,
options: HashMap<String, Value>,
},
Backup {
destination: String,
options: HashMap<String, Value>,
},
Explain {
plan: Box<LogicalPlan>,
},
ShowDatabase,
ShowConfig,
ShowStatistics,
Vacuum,
Checkpoint,
CopyTo {
label: String,
path: String,
format: String,
options: HashMap<String, Value>,
},
CopyFrom {
label: String,
path: String,
format: String,
options: HashMap<String, Value>,
},
CreateLabel(CreateLabel),
CreateEdgeType(CreateEdgeType),
AlterLabel(AlterLabel),
AlterEdgeType(AlterEdgeType),
DropLabel(DropLabel),
DropEdgeType(DropEdgeType),
CreateConstraint(CreateConstraint),
DropConstraint(DropConstraint),
ShowConstraints(ShowConstraints),
Begin,
Commit,
Rollback,
BindZeroLengthPath {
input: Box<LogicalPlan>,
node_variable: String,
path_variable: String,
},
BindPath {
input: Box<LogicalPlan>,
node_variables: Vec<String>,
edge_variables: Vec<String>,
path_variable: String,
},
LocyProgram {
strata: Vec<LocyStratum>,
commands: Vec<LocyCommand>,
derived_scan_registry: Arc<DerivedScanRegistry>,
max_iterations: usize,
timeout: Duration,
max_derived_bytes: usize,
deterministic_best_by: bool,
strict_probability_domain: bool,
probability_epsilon: f64,
exact_probability: bool,
max_bdd_variables: usize,
top_k_proofs: usize,
},
LocyFold {
input: Box<LogicalPlan>,
key_columns: Vec<String>,
fold_bindings: Vec<(String, Expr)>,
strict_probability_domain: bool,
probability_epsilon: f64,
},
LocyBestBy {
input: Box<LogicalPlan>,
key_columns: Vec<String>,
criteria: Vec<(Expr, bool)>,
},
LocyPriority {
input: Box<LogicalPlan>,
key_columns: Vec<String>,
},
LocyDerivedScan {
scan_index: usize,
data: Arc<RwLock<Vec<RecordBatch>>>,
schema: SchemaRef,
},
LocyProject {
input: Box<LogicalPlan>,
projections: Vec<(Expr, Option<String>)>,
target_types: Vec<DataType>,
},
}Expand description
Logical query plan produced by QueryPlanner.
Each variant represents one step in the Cypher execution pipeline. Plans are tree-structured — leaf nodes produce rows, intermediate nodes transform or join them, and the root node defines the final output.
Variants§
Union
UNION / UNION ALL of two sub-plans.
Scan
Scan vertices of a single labeled dataset.
ExtIdLookup
Lookup vertices by ext_id using the main vertices table. Used when a query references ext_id without specifying a label.
ScanAll
Scan all vertices from main table (MATCH (n) without label). Used for schemaless queries that don’t specify any label.
ScanMainByLabels
Scan main table filtering by label name (MATCH (n:Unknown)). Used for labels not defined in schema (schemaless support). Scan main vertices table by label name(s) for schemaless support. When labels has multiple entries, uses intersection semantics (must have ALL labels).
Empty
Produces exactly one empty row (used to bootstrap pipelines with no source).
Unwind
UNWIND: expand a list expression into one row per element.
Traverse
Fields
input: Box<LogicalPlan>is_variable_length: boolWhether this is a variable-length pattern (has * range specifier).
When true, step_variable holds a list of edges (even for *1..1).
optional_pattern_vars: HashSet<String>All variables from this OPTIONAL MATCH pattern. When any hop in the pattern fails, ALL these variables should be set to NULL. This ensures proper multi-hop OPTIONAL MATCH semantics.
scope_match_variables: HashSet<String>Variable names (node + edge) from the current MATCH clause scope. Used for relationship uniqueness scoping: only edge ID columns whose associated variable is in this set participate in uniqueness filtering. Variables from previous disconnected MATCH clauses are excluded.
edge_filter_expr: Option<Expr>Edge property predicate for VLP inline filtering (instead of post-Filter).
qpp_steps: Option<Vec<QppStepInfo>>QPP steps for multi-hop quantified path patterns.
None for simple VLP patterns; Some for QPP with per-step edge types/constraints.
When present, min_hops/max_hops are derived from iterations × steps.len().
TraverseMainByType
Traverse main edges table filtering by type name(s) (MATCH (a)-[:Unknown]->(b)).
Used for edge types not defined in schema (schemaless support).
Supports OR relationship types like [:KNOWS|HATES] via multiple type_names.
Fields
input: Box<LogicalPlan>is_variable_length: boolWhether this is a variable-length pattern (has * range specifier).
When true, step_variable holds a list of edges (even for *1..1).
optional_pattern_vars: HashSet<String>All variables from this OPTIONAL MATCH pattern. When any hop in the pattern fails, ALL these variables should be set to NULL.
scope_match_variables: HashSet<String>Variables belonging to the current MATCH clause scope. Used for relationship uniqueness scoping: only edge columns whose associated variable is in this set participate in uniqueness filtering.
Filter
Fields
input: Box<LogicalPlan>Create
CreateBatch
Batched CREATE operations for multiple consecutive CREATE clauses.
This variant combines multiple CREATE patterns into a single plan node to avoid deep recursion when executing many CREATEs sequentially.
Merge
Fields
input: Box<LogicalPlan>Set
Remove
Delete
Foreach
FOREACH (variable IN list | clauses)
Sort
Limit
Aggregate
Distinct
Fields
input: Box<LogicalPlan>Window
Project
CrossJoin
Apply
RecursiveCTE
ProcedureCall
SubqueryCall
VectorKnn
InvertedIndexLookup
ShortestPath
Fields
input: Box<LogicalPlan>AllShortestPaths
allShortestPaths() - Returns all paths with minimum length
Fields
input: Box<LogicalPlan>QuantifiedPattern
CreateVectorIndex
CreateFullTextIndex
CreateScalarIndex
CreateJsonFtsIndex
DropIndex
ShowIndexes
Copy
Backup
Explain
Fields
plan: Box<LogicalPlan>ShowDatabase
ShowConfig
ShowStatistics
Vacuum
Checkpoint
CopyTo
CopyFrom
CreateLabel(CreateLabel)
CreateEdgeType(CreateEdgeType)
AlterLabel(AlterLabel)
AlterEdgeType(AlterEdgeType)
DropLabel(DropLabel)
DropEdgeType(DropEdgeType)
CreateConstraint(CreateConstraint)
DropConstraint(DropConstraint)
ShowConstraints(ShowConstraints)
Begin
Commit
Rollback
BindZeroLengthPath
Bind a zero-length path (single node pattern with path variable).
E.g., p = (a) creates a Path with one node and zero edges.
BindPath
Bind a fixed-length path from already-computed node and edge columns.
E.g., p = (a)-[r]->(b) or p = (a)-[r1]->(b)-[r2]->(c).
Fields
input: Box<LogicalPlan>LocyProgram
Top-level Locy program: stratified rules + commands.
Fields
strata: Vec<LocyStratum>commands: Vec<LocyCommand>derived_scan_registry: Arc<DerivedScanRegistry>LocyFold
FOLD operator: lattice-join non-key columns per KEY group.
Fields
input: Box<LogicalPlan>LocyBestBy
BEST BY operator: select best row per KEY group by ordered criteria.
Fields
input: Box<LogicalPlan>LocyPriority
PRIORITY operator: keep only highest-priority clause’s rows per KEY group.
LocyDerivedScan
Scan a derived relation’s in-memory buffer during fixpoint iteration.
LocyProject
Compact projection for Locy YIELD — emits ONLY the listed expressions, without carrying through helper/property columns like the regular Project.
Trait Implementations§
Source§impl Clone for LogicalPlan
impl Clone for LogicalPlan
Source§fn clone(&self) -> LogicalPlan
fn clone(&self) -> LogicalPlan
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for LogicalPlan
impl !RefUnwindSafe for LogicalPlan
impl Send for LogicalPlan
impl Sync for LogicalPlan
impl Unpin for LogicalPlan
impl UnsafeUnpin for LogicalPlan
impl !UnwindSafe for LogicalPlan
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.