diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/ElementEvaluationOption.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/ElementEvaluationOption.java
new file mode 100644
index 0000000..a44fc74
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/ElementEvaluationOption.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.algebra.compiler.option;
+
+import java.util.Locale;
+
+public enum ElementEvaluationOption implements IGraphixCompilerOption {
+    EXPAND_AND_UNION,
+    SWITCH_AND_CYCLE;
+
+    public static final String OPTION_KEY_NAME = "graphix.evaluation.default";
+    public static final ElementEvaluationOption OPTION_DEFAULT = EXPAND_AND_UNION;
+
+    @Override
+    public String getOptionValue() {
+        return name().toLowerCase(Locale.ROOT).replace("_", "-");
+    }
+
+    @Override
+    public String getDisplayName() {
+        return String.format("%s ( %s )", OPTION_KEY_NAME, getOptionValue());
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/IGraphixCompilerOption.java
similarity index 73%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/IGraphixCompilerOption.java
index 4509792..5cb0027 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/IGraphixCompilerOption.java
@@ -16,11 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.algebra.compiler.option;
 
-import org.apache.asterix.common.exceptions.CompilationException;
+public interface IGraphixCompilerOption {
+    String getOptionValue();
 
-@FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+    String getDisplayName();
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SchemaDecorateEdgeOption.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SchemaDecorateEdgeOption.java
new file mode 100644
index 0000000..e67c6cb
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SchemaDecorateEdgeOption.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.algebra.compiler.option;
+
+import java.util.Locale;
+
+public enum SchemaDecorateEdgeOption implements IGraphixCompilerOption {
+    NEVER,
+    AS_NEEDED,
+    ALWAYS;
+
+    public static final String OPTION_KEY_NAME = "graphix.schema-decorate.edge";
+    public static final SchemaDecorateEdgeOption OPTION_DEFAULT = AS_NEEDED;
+
+    @Override
+    public String getOptionValue() {
+        return name().toLowerCase(Locale.ROOT).replace("_", "-");
+    }
+
+    @Override
+    public String getDisplayName() {
+        return String.format("%s ( %s )", OPTION_KEY_NAME, getOptionValue());
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SchemaDecorateVertexOption.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SchemaDecorateVertexOption.java
new file mode 100644
index 0000000..7a0cb73
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SchemaDecorateVertexOption.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.algebra.compiler.option;
+
+import java.util.Locale;
+
+public enum SchemaDecorateVertexOption implements IGraphixCompilerOption {
+    NEVER,
+    AS_NEEDED,
+    ALWAYS;
+
+    public static final String OPTION_KEY_NAME = "graphix.schema-decorate.vertex";
+    public static final SchemaDecorateVertexOption OPTION_DEFAULT = AS_NEEDED;
+
+    @Override
+    public String getOptionValue() {
+        return name().toLowerCase(Locale.ROOT).replace("_", "-");
+    }
+
+    @Override
+    public String getDisplayName() {
+        return String.format("%s ( %s )", OPTION_KEY_NAME, getOptionValue());
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SemanticsNavigationOption.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SemanticsNavigationOption.java
new file mode 100644
index 0000000..7715387
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SemanticsNavigationOption.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.algebra.compiler.option;
+
+import java.util.Locale;
+
+public enum SemanticsNavigationOption implements IGraphixCompilerOption {
+    NO_REPEAT_VERTICES,
+    NO_REPEAT_EDGES,
+    NO_REPEAT_ANYTHING;
+
+    public static final String OPTION_KEY_NAME = "graphix.semantics.navigation";
+    public static final SemanticsNavigationOption OPTION_DEFAULT = NO_REPEAT_ANYTHING;
+
+    @Override
+    public String getOptionValue() {
+        return name().toLowerCase(Locale.ROOT).replace("_", "-");
+    }
+
+    @Override
+    public String getDisplayName() {
+        return String.format("%s ( %s )", OPTION_KEY_NAME, getOptionValue());
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SemanticsPatternOption.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SemanticsPatternOption.java
new file mode 100644
index 0000000..559686f
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/option/SemanticsPatternOption.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.algebra.compiler.option;
+
+import java.util.Locale;
+
+public enum SemanticsPatternOption implements IGraphixCompilerOption {
+    ISOMORPHISM,
+    VERTEX_ISOMORPHISM,
+    EDGE_ISOMORPHISM,
+    HOMOMORPHISM;
+
+    public static final String OPTION_KEY_NAME = "graphix.semantics.pattern";
+    public static final SemanticsPatternOption OPTION_DEFAULT = ISOMORPHISM;
+
+    @Override
+    public String getOptionValue() {
+        return name().toLowerCase(Locale.ROOT).replace("_", "-");
+    }
+
+    @Override
+    public String getDisplayName() {
+        return String.format("%s ( %s )", OPTION_KEY_NAME, getOptionValue());
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/provider/GraphixCompilationProvider.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/provider/GraphixCompilationProvider.java
index 79a2b68..06f28c5 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/provider/GraphixCompilationProvider.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/compiler/provider/GraphixCompilationProvider.java
@@ -23,21 +23,20 @@
 import org.apache.asterix.algebra.base.ILangExpressionToPlanTranslatorFactory;
 import org.apache.asterix.compiler.provider.IRuleSetFactory;
 import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
+import org.apache.asterix.graphix.algebra.compiler.option.ElementEvaluationOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateEdgeOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateVertexOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsNavigationOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsPatternOption;
 import org.apache.asterix.graphix.algebra.translator.GraphixExpressionToPlanTranslatorFactory;
 import org.apache.asterix.graphix.lang.parser.GraphixParserFactory;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewriterFactory;
-import org.apache.asterix.graphix.lang.rewrites.print.GraphixASTPrintVisitorFactory;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewriterFactory;
+import org.apache.asterix.graphix.lang.rewrite.print.GraphixASTPrintVisitorFactory;
 import org.apache.asterix.lang.common.base.IAstPrintVisitorFactory;
 import org.apache.asterix.lang.common.base.IParserFactory;
 import org.apache.asterix.lang.common.base.IRewriterFactory;
 
 public class GraphixCompilationProvider extends SqlppCompilationProvider {
-    public static final String PRINT_REWRITE_METADATA_CONFIG = "graphix.print-rewrite";
-    public static final String RESOLVER_METADATA_CONFIG = "graphix.resolver";
-    public static final String RESOLVER_ITERATION_MAX_METADATA_CONFIG = "graphix.max-resolution-iterations";
-    public static final String MATCH_EVALUATION_METADATA_CONFIG = "graphix.match-evaluation";
-    public static final String EDGE_STRATEGY_METADATA_CONFIG = "graphix.edge-strategy";
-
     @Override
     public IParserFactory getParserFactory() {
         return new GraphixParserFactory();
@@ -66,8 +65,11 @@
     @Override
     public Set<String> getCompilerOptions() {
         Set<String> parentConfigurableParameters = super.getCompilerOptions();
-        parentConfigurableParameters.addAll(Set.of(PRINT_REWRITE_METADATA_CONFIG, MATCH_EVALUATION_METADATA_CONFIG,
-                RESOLVER_METADATA_CONFIG, RESOLVER_ITERATION_MAX_METADATA_CONFIG, EDGE_STRATEGY_METADATA_CONFIG));
+        parentConfigurableParameters.add(ElementEvaluationOption.OPTION_KEY_NAME);
+        parentConfigurableParameters.add(SchemaDecorateEdgeOption.OPTION_KEY_NAME);
+        parentConfigurableParameters.add(SchemaDecorateVertexOption.OPTION_KEY_NAME);
+        parentConfigurableParameters.add(SemanticsNavigationOption.OPTION_KEY_NAME);
+        parentConfigurableParameters.add(SemanticsPatternOption.OPTION_KEY_NAME);
         return parentConfigurableParameters;
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/translator/GraphixExpressionToPlanTranslator.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/translator/GraphixExpressionToPlanTranslator.java
index 12a7f39..c720a17 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/translator/GraphixExpressionToPlanTranslator.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/algebra/translator/GraphixExpressionToPlanTranslator.java
@@ -16,17 +16,96 @@
  */
 package org.apache.asterix.graphix.algebra.translator;
 
+import static org.apache.asterix.graphix.runtime.function.GraphixFunctionInfoCollection.*;
+
+import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.clause.extension.IGraphixVisitorExtension;
+import org.apache.asterix.graphix.lang.clause.extension.LowerListClauseExtension;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.translator.SqlppExpressionToPlanTranslator;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.commons.lang3.mutable.MutableObject;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
 
 public class GraphixExpressionToPlanTranslator extends SqlppExpressionToPlanTranslator {
     public GraphixExpressionToPlanTranslator(MetadataProvider metadataProvider, int currentVarCounter,
             Map<VarIdentifier, IAObject> externalVars) throws AlgebricksException {
         super(metadataProvider, currentVarCounter, externalVars);
     }
+
+    @Override
+    public Pair<ILogicalOperator, LogicalVariable> visit(IVisitorExtension ve, Mutable<ILogicalOperator> tupSource)
+            throws CompilationException {
+        if (ve instanceof IGraphixVisitorExtension) {
+            IGraphixVisitorExtension gve = (IGraphixVisitorExtension) ve;
+            if (gve.getKind() != IGraphixVisitorExtension.Kind.LOWER_LIST) {
+                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                        "Encountered illegal type of Graphix visitor extension!");
+            }
+            return translateLowerListClause((LowerListClauseExtension) gve, tupSource);
+
+        } else {
+            return super.visit(ve, tupSource);
+        }
+    }
+
+    public Pair<ILogicalOperator, LogicalVariable> translateLowerListClause(LowerListClauseExtension llce,
+            Mutable<ILogicalOperator> tupSource) throws CompilationException {
+        ClauseCollection clauseCollection = llce.getLowerListClause().getClauseCollection();
+        Iterator<AbstractClause> clauseIterator = clauseCollection.iterator();
+        if (!clauseIterator.hasNext()) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Encountered empty lower-clause collection!");
+        }
+
+        // Translate our leading clause in our collection.
+        AbstractBinaryCorrelateClause leadingLowerClause = (AbstractBinaryCorrelateClause) clauseIterator.next();
+        LogicalVariable leftVar = context.newVarFromExpression(leadingLowerClause.getRightVariable());
+        Mutable<ILogicalOperator> topOpRef = new MutableObject<>();
+        //        if (tupSource.getValue() instanceof GraphTupleSourceOperator) {
+        //            // Do not ignore our condition.
+        //            topOpRef = new MutableObject<>(leadingLowerClause.accept(this, tupSource).first);
+        //
+        //        } else {
+        // Our first clause is functionally equivalent to the left expression of a FROM-TERM. Ignore our condition.
+        Expression leftLangExpr = leadingLowerClause.getRightExpression();
+        Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo = langExprToAlgExpression(leftLangExpr, tupSource);
+        Pair<ILogicalExpression, Mutable<ILogicalOperator>> unnestExpr = makeUnnestExpression(eo.first, eo.second);
+        UnnestOperator unnestOp = new UnnestOperator(leftVar, new MutableObject<>(unnestExpr.first));
+        unnestOp.getInputs().add(unnestExpr.second);
+        unnestOp.setSourceLocation(clauseCollection.getSourceLocation());
+        topOpRef.setValue(unnestOp);
+        //        }
+
+        // The remainder of our clauses are either JOINs, UNNESTs, LETs, WHEREs, or GRAPH-CLAUSEs.
+        while (clauseIterator.hasNext()) {
+            AbstractClause workingLowerClause = clauseIterator.next();
+            //            if (workingLowerClause instanceof LowerSwitchClause) {
+            //                LowerSwitchClause lowerBFSClause = (LowerSwitchClause) workingLowerClause;
+            //                LowerSwitchClauseExtension visitorExtension =
+            //                        (LowerSwitchClauseExtension) lowerBFSClause.getVisitorExtension();
+            //                topOpRef = new MutableObject<>(translateLowerGraphClause(visitorExtension, topOpRef).first);
+            //
+            //            } else {
+            topOpRef = new MutableObject<>(workingLowerClause.accept(this, topOpRef).first);
+            //            }
+        }
+        return new Pair<>(topOpRef.getValue(), leftVar);
+    }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslator.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslator.java
index c342b10..e24d930 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslator.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslator.java
@@ -20,9 +20,11 @@
 
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.app.translator.QueryTranslator;
 import org.apache.asterix.common.api.IResponsePrinter;
@@ -33,8 +35,8 @@
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.compiler.provider.ILangCompilationProvider;
 import org.apache.asterix.graphix.extension.GraphixMetadataExtension;
-import org.apache.asterix.graphix.lang.rewrites.GraphixQueryRewriter;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixQueryRewriter;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
@@ -61,16 +63,21 @@
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.translator.IRequestParameters;
 import org.apache.asterix.translator.SessionOutput;
+import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.exceptions.IWarningCollector;
 
 public class GraphixQueryTranslator extends QueryTranslator {
-    Set<DeclareGraphStatement> declareGraphStatements = new HashSet<>();
+    private final Set<DeclareGraphStatement> declareGraphStatements = new HashSet<>();
+    private final Map<String, String> configFileOptions;
 
     public GraphixQueryTranslator(ICcApplicationContext appCtx, List<Statement> statements, SessionOutput output,
             ILangCompilationProvider compilationProvider, ExecutorService executorService,
-            IResponsePrinter responsePrinter) {
+            IResponsePrinter responsePrinter, List<Pair<String, String>> configFileOptions) {
         super(appCtx, statements, output, compilationProvider, executorService, responsePrinter);
+
+        // We are given the following information from our cluster-controller config file.
+        this.configFileOptions = configFileOptions.stream().collect(Collectors.toMap(Pair::getFirst, Pair::getSecond));
     }
 
     public GraphixQueryRewriter getQueryRewriter() {
@@ -93,15 +100,17 @@
             List<FunctionDecl> declaredFunctions, List<ViewDecl> declaredViews, IWarningCollector warningCollector,
             int varCounter) {
         return new GraphixRewritingContext(metadataProvider, declaredFunctions, declaredViews, declareGraphStatements,
-                warningCollector, varCounter);
+                warningCollector, varCounter, configFileOptions);
     }
 
     /**
      * To create a view, we must perform the following:
-     * a) Check the view body for any named graphs.
-     * b) Rewrite graph expressions into pure SQL++ expressions. The dependencies associated with the rewritten
-     * expressions will be recorded in the "Dataset" dataset.
-     * c) Record any graph-related dependencies for the view in our metadata.
+     * <ol>
+     *  <li>Check the view body for any named graphs.</li>
+     *  <li>Rewrite graph expressions into pure SQL++ expressions. The dependencies associated with the rewritten
+     *  expressions will be recorded in the "Dataset" dataset.</li>
+     *  <li>Record any graph-related dependencies for the view in our metadata.</li>
+     * </ol>
      */
     @Override
     protected CreateResult doCreateView(MetadataProvider metadataProvider, CreateViewStatement cvs,
@@ -153,10 +162,12 @@
 
     /**
      * To create a function, we must perform the following:
-     * a) Check the function body for any named graphs.
-     * b) Rewrite graph expressions into pure SQL++ expressions. The dependencies associated with the rewritten
-     * expressions will be recorded in the "Function" dataset.
-     * c) Record any graph-related dependencies for the function in our metadata.
+     * <ol>
+     *  <li>Check the function body for any named graphs.</li>
+     *  <li>Rewrite graph expressions into pure SQL++ expressions. The dependencies associated with the rewritten
+     *  expressions will be recorded in the "Function" dataset.</li>
+     *  <li>Record any graph-related dependencies for the function in our metadata.</li>
+     * </ol>
      */
     @Override
     protected CreateResult doCreateFunction(MetadataProvider metadataProvider, CreateFunctionStatement cfs,
@@ -229,8 +240,10 @@
 
     /**
      * Before dropping a function, we perform the following:
-     * 1. Check if any of our existing graphs depend on the function to-be-dropped.
-     * 2. Remove the GraphDependency record for the function to-be-dropped if it exists.
+     * <ol>
+     *  <li>Check if any of our existing graphs depend on the function to-be-dropped.</li>
+     *  <li>Remove the GraphDependency record for the function to-be-dropped if it exists.</li>
+     * </ol>
      */
     @Override
     protected void handleFunctionDropStatement(MetadataProvider metadataProvider, Statement stmt,
@@ -264,8 +277,10 @@
 
     /**
      * Before dropping a view, we perform the following:
-     * 1. Check if any of our existing graphs depend on the view to-be-dropped.
-     * 2. Remove the GraphDependency record for the view to-be-dropped if it exists.
+     * <ol>
+     *  <li>Check if any of our existing graphs depend on the view to-be-dropped.</li>
+     *  <li>Remove the GraphDependency record for the view to-be-dropped if it exists.</li>
+     * </ol>
      */
     @Override
     public void handleViewDropStatement(MetadataProvider metadataProvider, Statement stmt) throws Exception {
@@ -313,9 +328,12 @@
 
     /**
      * Before dropping a dataverse, we perform the following:
-     * 1. Check if any other entities outside the dataverse to-be-dropped depend on any entities inside the dataverse.
-     * 2. Remove all GraphDependency records associated with the dataverse to-be-dropped.
-     * 3. Remove all Graph records associated with the dataverse to-be-dropped.
+     * <ol>
+     *  <li>Check if any other entities outside the dataverse to-be-dropped depend on any entities inside the
+     *  dataverse.</li>
+     *  <li>Remove all GraphDependency records associated with the dataverse to-be-dropped.</li>
+     *  <li>Remove all Graph records associated with the dataverse to-be-dropped.</li>
+     * </ol>
      */
     @Override
     protected void handleDataverseDropStatement(MetadataProvider metadataProvider, Statement stmt,
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslatorFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslatorFactory.java
index a0c4d2f..7fad326 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslatorFactory.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/app/translator/GraphixQueryTranslatorFactory.java
@@ -28,12 +28,20 @@
 import org.apache.asterix.compiler.provider.ILangCompilationProvider;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.translator.SessionOutput;
+import org.apache.hyracks.algebricks.common.utils.Pair;
 
 public class GraphixQueryTranslatorFactory extends DefaultStatementExecutorFactory {
+    private List<Pair<String, String>> configFileProvidedOptions;
+
     @Override
     public QueryTranslator create(ICcApplicationContext appCtx, List<Statement> statements, SessionOutput output,
             ILangCompilationProvider compilationProvider, IStorageComponentProvider storageComponentProvider,
             IResponsePrinter printer) {
-        return new GraphixQueryTranslator(appCtx, statements, output, compilationProvider, executorService, printer);
+        return new GraphixQueryTranslator(appCtx, statements, output, compilationProvider, executorService, printer,
+                configFileProvidedOptions);
+    }
+
+    public void setConfigFileProvidedOptions(List<Pair<String, String>> configFileProvidedOptions) {
+        this.configFileProvidedOptions = configFileProvidedOptions;
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/EdgeIdentifier.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/EdgeIdentifier.java
new file mode 100644
index 0000000..925515a
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/EdgeIdentifier.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.common.metadata;
+
+import java.util.Objects;
+
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+
+/**
+ * A unique identifier for an edge. An edge is uniquely identified by:
+ * <ul>
+ *  <li>The graph identifier associated with the edge itself.</li>
+ *  <li>The label associated with the source vertex.</li>
+ *  <li>The label associated with the destination vertex.</li>
+ *  <li>The label associated with the edge itself.</li>
+ * </ul>
+ */
+public class EdgeIdentifier implements IElementIdentifier {
+    private static final long serialVersionUID = 1L;
+    private final GraphIdentifier graphIdentifier;
+    private final ElementLabel sourceLabel;
+    private final ElementLabel edgeLabel;
+    private final ElementLabel destinationLabel;
+
+    public EdgeIdentifier(GraphIdentifier graphIdentifier, ElementLabel sourceLabel, ElementLabel edgeLabel,
+            ElementLabel destinationLabel) {
+        this.graphIdentifier = Objects.requireNonNull(graphIdentifier);
+        this.sourceLabel = Objects.requireNonNull(sourceLabel);
+        this.edgeLabel = Objects.requireNonNull(edgeLabel);
+        this.destinationLabel = Objects.requireNonNull(destinationLabel);
+    }
+
+    @Override
+    public GraphIdentifier getGraphIdentifier() {
+        return graphIdentifier;
+    }
+
+    public ElementLabel getSourceLabel() {
+        return sourceLabel;
+    }
+
+    public ElementLabel getEdgeLabel() {
+        return edgeLabel;
+    }
+
+    public ElementLabel getDestinationLabel() {
+        return destinationLabel;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s (:%s)-[:%s]->(:%s)", graphIdentifier, sourceLabel, edgeLabel, destinationLabel);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o instanceof EdgeIdentifier) {
+            EdgeIdentifier that = (EdgeIdentifier) o;
+            return Objects.equals(this.graphIdentifier, that.graphIdentifier)
+                    && Objects.equals(this.sourceLabel, that.sourceLabel)
+                    && Objects.equals(this.edgeLabel, that.edgeLabel)
+                    && Objects.equals(this.destinationLabel, that.destinationLabel);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(graphIdentifier, sourceLabel, edgeLabel, destinationLabel);
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphElementIdentifier.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphElementIdentifier.java
deleted file mode 100644
index f440c2f..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphElementIdentifier.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.common.metadata;
-
-import java.io.Serializable;
-import java.util.Objects;
-
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-
-/**
- * A unique identifier for a graph element (vertex or edge). A graph element is uniquely identified by:
- * 1. The graph identifier associated with the graph element itself.
- * 2. The kind of the element (vertex or edge).
- * 3. The label associated with the element itself- a graph element has only one label in our user model.
- */
-public class GraphElementIdentifier implements Serializable {
-    private static final long serialVersionUID = 1L;
-    private final GraphIdentifier graphIdentifier;
-    private final Kind elementKind;
-    private final ElementLabel elementLabel;
-
-    public GraphElementIdentifier(GraphIdentifier graphIdentifier, Kind elementKind, ElementLabel elementLabel) {
-        this.graphIdentifier = graphIdentifier;
-        this.elementKind = elementKind;
-        this.elementLabel = elementLabel;
-    }
-
-    public GraphIdentifier getGraphIdentifier() {
-        return graphIdentifier;
-    }
-
-    public Kind getElementKind() {
-        return elementKind;
-    }
-
-    public ElementLabel getElementLabel() {
-        return elementLabel;
-    }
-
-    @Override
-    public String toString() {
-        return graphIdentifier + "#" + elementLabel + " ( " + elementKind + " )";
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o instanceof GraphElementIdentifier) {
-            GraphElementIdentifier that = (GraphElementIdentifier) o;
-            return graphIdentifier.equals(that.graphIdentifier) && elementKind.equals(that.elementKind)
-                    && elementLabel.equals(that.elementLabel);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(graphIdentifier, elementKind, elementLabel);
-    }
-
-    public enum Kind {
-        VERTEX,
-        EDGE
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphIdentifier.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphIdentifier.java
index c3cc5bd..2172425 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphIdentifier.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/GraphIdentifier.java
@@ -25,8 +25,10 @@
 
 /**
  * A unique identifier for a graph. A graph is uniquely identified by:
- * 1. The dataverse associated with the graph. A graph identifier must always belong to some dataverse.
- * 2. The name of the graph. Anonymous graphs should have a name generated from its respective GRAPH-CONSTRUCTOR.
+ * <ul>
+ *  <li>The dataverse associated with the graph. A graph identifier must always belong to some dataverse.</li>
+ *  <li>The name of the graph. Anonymous graphs should have a name generated from its respective GRAPH-CONSTRUCTOR.</li>
+ * </ul>
  */
 public class GraphIdentifier implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -58,7 +60,7 @@
         }
         if (o instanceof GraphIdentifier) {
             GraphIdentifier that = (GraphIdentifier) o;
-            return dataverseName.equals(that.dataverseName) && Objects.equals(graphName, that.graphName);
+            return Objects.equals(this.dataverseName, that.dataverseName) && Objects.equals(graphName, that.graphName);
         }
         return false;
     }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/IElementIdentifier.java
similarity index 75%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/IElementIdentifier.java
index 4509792..2daff9f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/IElementIdentifier.java
@@ -16,11 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.common.metadata;
 
-import org.apache.asterix.common.exceptions.CompilationException;
+import java.io.Serializable;
 
 @FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+public interface IElementIdentifier extends Serializable {
+    GraphIdentifier getGraphIdentifier();
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/VertexIdentifier.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/VertexIdentifier.java
new file mode 100644
index 0000000..12fdb9d
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/common/metadata/VertexIdentifier.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.common.metadata;
+
+import java.util.Objects;
+
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+
+/**
+ * A unique identifier for a vertex. A vertex is uniquely identified by:
+ * <ul>
+ *  <li>The graph identifier associated with the vertex itself.</li>
+ *  <li>The label associated with the vertex itself.</li>
+ * </ul>
+ */
+public class VertexIdentifier implements IElementIdentifier {
+    private static final long serialVersionUID = 1L;
+    private final GraphIdentifier graphIdentifier;
+    private final ElementLabel vertexLabel;
+
+    public VertexIdentifier(GraphIdentifier graphIdentifier, ElementLabel vertexLabel) {
+        this.graphIdentifier = graphIdentifier;
+        this.vertexLabel = vertexLabel;
+    }
+
+    @Override
+    public GraphIdentifier getGraphIdentifier() {
+        return graphIdentifier;
+    }
+
+    public ElementLabel getVertexLabel() {
+        return vertexLabel;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s (:%s)", graphIdentifier, vertexLabel);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o instanceof VertexIdentifier) {
+            VertexIdentifier that = (VertexIdentifier) o;
+            return Objects.equals(this.graphIdentifier, that.graphIdentifier)
+                    && Objects.equals(this.vertexLabel, that.vertexLabel);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(graphIdentifier, vertexLabel);
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/extension/GraphixQueryTranslatorExtension.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/extension/GraphixQueryTranslatorExtension.java
index b6f7753..139c8a8 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/extension/GraphixQueryTranslatorExtension.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/extension/GraphixQueryTranslatorExtension.java
@@ -30,7 +30,7 @@
     public static final ExtensionId GRAPHIX_QUERY_TRANSLATOR_EXTENSION_ID =
             new ExtensionId(GraphixQueryTranslatorExtension.class.getSimpleName(), 0);
 
-    private static final IStatementExecutorFactory INSTANCE = new GraphixQueryTranslatorFactory();
+    private static final GraphixQueryTranslatorFactory INSTANCE = new GraphixQueryTranslatorFactory();
 
     @Override
     public ExtensionId getId() {
@@ -39,6 +39,7 @@
 
     @Override
     public void configure(List<Pair<String, String>> args) {
+        INSTANCE.setConfigFileProvidedOptions(args);
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionIdentifiers.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionIdentifiers.java
index 50e58b9..a5dc34b 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionIdentifiers.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionIdentifiers.java
@@ -69,8 +69,24 @@
     public static final FunctionIdentifier PATH_EDGES =
             new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "path-edges", 1);
 
+    // Private functions used internally to enforce navigation semantics.
+    public static final FunctionIdentifier IS_DISTINCT_EDGE =
+            new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "is-distinct-edge", 2);
+    public static final FunctionIdentifier IS_DISTINCT_VERTEX =
+            new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "is-distinct-vertex", 2);
+    public static final FunctionIdentifier IS_DISTINCT_EVERYTHING =
+            new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "is-distinct-everything", 3);
+
+    // Private functions used internally to manage a path during navigation.
+    public static final FunctionIdentifier CREATE_INTERNAL_PATH =
+            new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "create-internal-path", 1);
+    public static final FunctionIdentifier APPEND_INTERNAL_PATH =
+            new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "append-internal-path", 3);
+    public static final FunctionIdentifier MATERIALIZE_PATH =
+            new FunctionIdentifier(GRAPHIX_DV.getCanonicalForm(), "materialize-path", 1);
+
     static {
-        // Register all the functions above.
+        // Register the non-internal functions above.
         functionIdentifierMap = new HashMap<>();
         Consumer<FunctionIdentifier> functionRegister = f -> functionIdentifierMap.put(f.getName(), f);
         functionRegister.accept(ELEMENT_LABEL);
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionMap.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionMap.java
index d1f3c89..a17ebac 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionMap.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/GraphixFunctionMap.java
@@ -34,12 +34,14 @@
 import org.apache.asterix.graphix.function.rewrite.PathHopCountRewrite;
 import org.apache.asterix.graphix.function.rewrite.PathVerticesRewrite;
 import org.apache.asterix.graphix.function.rewrite.SchemaAccessRewrite;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixFunctionCallVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.SchemaEnrichmentVisitor;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 
 /**
- * @see org.apache.asterix.graphix.lang.rewrites.visitor.SchemaEnrichmentVisitor
- * @see org.apache.asterix.graphix.lang.rewrites.visitor.GraphixFunctionCallVisitor
+ * @see SchemaEnrichmentVisitor
+ * @see GraphixFunctionCallVisitor
  */
 public class GraphixFunctionMap {
     private final static Map<FunctionIdentifier, IFunctionPrepare> graphixFunctionPrepareMap;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/AbstractElementPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/AbstractElementPrepare.java
index d93f670..82ad445 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/AbstractElementPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/AbstractElementPrepare.java
@@ -26,7 +26,7 @@
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
 import org.apache.asterix.graphix.lang.annotation.GraphixSchemaAnnotation;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.FieldBinding;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDestVertexPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDestVertexPrepare.java
index 7f95f28..affe5dd 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDestVertexPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDestVertexPrepare.java
@@ -25,7 +25,6 @@
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
-import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.literal.StringLiteral;
 import org.apache.asterix.lang.common.struct.Identifier;
 
@@ -42,9 +41,8 @@
         EdgeDescriptor.EdgeDirection edgeDirection = edgeDescriptor.getEdgeDirection();
         VertexPatternExpr destVertexExpr = (edgeDirection == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT)
                 ? edgePatternExpr.getRightVertex() : edgePatternExpr.getLeftVertex();
-        VariableExpr destVariableExpr = new VariableExpr(destVertexExpr.getVariableExpr().getVar());
         LiteralExpr fieldNameExpr = new LiteralExpr(new StringLiteral(IDENTIFIER.getValue()));
-        FieldBinding fieldBinding = new FieldBinding(fieldNameExpr, destVariableExpr);
+        FieldBinding fieldBinding = new FieldBinding(fieldNameExpr, destVertexExpr.getVariableExpr());
         schemaRecord.getFbList().add(fieldBinding);
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDetailPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDetailPrepare.java
index 6efd635..a507bd4 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDetailPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDetailPrepare.java
@@ -25,10 +25,9 @@
 import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.util.LowerRewritingUtil;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.rewrite.util.LowerRewritingUtil;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.ListConstructor;
@@ -49,7 +48,6 @@
             return;
         }
         EdgePatternExpr edgePatternExpr = (EdgePatternExpr) inputExpr;
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
 
         // Insert our detail record into our schema.
         RecordConstructor detailRecord = new RecordConstructor(new ArrayList<>());
@@ -66,7 +64,7 @@
         edgeDirectionPrepare.transformRecord(detailRecord, inputExpr, sourceExpr);
 
         // Insert our source-key into our detail record.
-        GraphElementIdentifier edgeIdentifier = edgeDescriptor.generateIdentifiers(graphIdentifier).get(0);
+        EdgeIdentifier edgeIdentifier = edgePatternExpr.generateIdentifiers(graphIdentifier).get(0);
         List<List<String>> edgeSourceKey = elementLookupTable.getEdgeSourceKey(edgeIdentifier);
         List<Expression> sourceKeyExprList = LowerRewritingUtil.buildAccessorList(sourceExpr, edgeSourceKey).stream()
                 .map(e -> (Expression) e).collect(Collectors.toList());
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDirectionPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDirectionPrepare.java
index 4a9a216..df2d898 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDirectionPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeDirectionPrepare.java
@@ -38,7 +38,7 @@
         EdgePatternExpr edgePatternExpr = (EdgePatternExpr) inputExpr;
         EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
         EdgeDescriptor.EdgeDirection edgeDirection = edgeDescriptor.getEdgeDirection();
-        LiteralExpr fieldValueExpr = new LiteralExpr(new StringLiteral(edgeDirection.toString()));
+        LiteralExpr fieldValueExpr = new LiteralExpr(new StringLiteral(edgeDirection.name()));
         LiteralExpr fieldNameExpr = new LiteralExpr(new StringLiteral(IDENTIFIER.getValue()));
         FieldBinding fieldBinding = new FieldBinding(fieldNameExpr, fieldValueExpr);
         schemaRecord.getFbList().add(fieldBinding);
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeSourceVertexPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeSourceVertexPrepare.java
index 5cc7bba..043f55a 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeSourceVertexPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/EdgeSourceVertexPrepare.java
@@ -42,9 +42,9 @@
         EdgeDescriptor.EdgeDirection edgeDirection = edgeDescriptor.getEdgeDirection();
         VertexPatternExpr sourceVertexExpr = (edgeDirection == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT)
                 ? edgePatternExpr.getLeftVertex() : edgePatternExpr.getRightVertex();
-        VariableExpr sourceVariableExpr = new VariableExpr(sourceVertexExpr.getVariableExpr().getVar());
+        VariableExpr sourceVariableExprCopy = new VariableExpr(sourceVertexExpr.getVariableExpr().getVar());
         LiteralExpr fieldNameExpr = new LiteralExpr(new StringLiteral(IDENTIFIER.getValue()));
-        FieldBinding fieldBinding = new FieldBinding(fieldNameExpr, sourceVariableExpr);
+        FieldBinding fieldBinding = new FieldBinding(fieldNameExpr, sourceVariableExprCopy);
         schemaRecord.getFbList().add(fieldBinding);
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/IFunctionPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/IFunctionPrepare.java
index 6c4c2b1..8f67fa5 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/IFunctionPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/IFunctionPrepare.java
@@ -20,7 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
 import org.apache.asterix.lang.common.base.Expression;
 
 @FunctionalInterface
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/VertexDetailPrepare.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/VertexDetailPrepare.java
index c6cde11..d9c583f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/VertexDetailPrepare.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/prepare/VertexDetailPrepare.java
@@ -25,9 +25,9 @@
 import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.util.LowerRewritingUtil;
+import org.apache.asterix.graphix.lang.rewrite.util.LowerRewritingUtil;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.ListConstructor;
@@ -59,7 +59,7 @@
         elementLabelPrepare.transformRecord(detailRecord, inputExpr, sourceExpr);
 
         // Insert our vertex-key into our detail record.
-        GraphElementIdentifier vertexIdentifier = vertexPatternExpr.generateIdentifiers(graphIdentifier).get(0);
+        VertexIdentifier vertexIdentifier = vertexPatternExpr.generateIdentifiers(graphIdentifier).get(0);
         List<List<String>> vertexKey = elementLookupTable.getVertexKey(vertexIdentifier);
         List<Expression> vertexKeyExprList = LowerRewritingUtil.buildAccessorList(sourceExpr, vertexKey).stream()
                 .map(e -> (Expression) e).collect(Collectors.toList());
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/IFunctionRewrite.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/IFunctionRewrite.java
index 54b1963..cce1ec0 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/IFunctionRewrite.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/IFunctionRewrite.java
@@ -20,7 +20,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.function.GraphixFunctionMap;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.CallExpr;
 
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathEdgesRewrite.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathEdgesRewrite.java
index 3a1cca0..ad4a39c 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathEdgesRewrite.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathEdgesRewrite.java
@@ -21,8 +21,8 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.PathPatternAction;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.type.MaterializePathTypeComputer;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.FieldAccessor;
@@ -36,7 +36,7 @@
             throw new CompilationException(ErrorCode.ILLEGAL_FUNCTION_USE, callExpr.getSourceLocation(),
                     GraphixFunctionIdentifiers.PATH_EDGES.toString());
         }
-        Identifier pathEdgeIdentifier = new Identifier(PathPatternAction.PATH_EDGES_FIELD_NAME);
+        Identifier pathEdgeIdentifier = new Identifier(MaterializePathTypeComputer.EDGES_FIELD_NAME);
         FieldAccessor pathEdgeAccess = new FieldAccessor(callExpr.getExprList().get(0), pathEdgeIdentifier);
         pathEdgeAccess.setSourceLocation(callExpr.getSourceLocation());
         return pathEdgeAccess;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathHopCountRewrite.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathHopCountRewrite.java
index 32ebd92..e6f3f50 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathHopCountRewrite.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathHopCountRewrite.java
@@ -25,8 +25,8 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.PathPatternAction;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.type.MaterializePathTypeComputer;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.FieldAccessor;
@@ -44,7 +44,7 @@
 
         // Access the edges in our path.
         List<Expression> countFunctionArguments = new ArrayList<>();
-        Identifier pathEdgeIdentifier = new Identifier(PathPatternAction.PATH_EDGES_FIELD_NAME);
+        Identifier pathEdgeIdentifier = new Identifier(MaterializePathTypeComputer.EDGES_FIELD_NAME);
         FieldAccessor pathEdgeAccess = new FieldAccessor(callExpr.getExprList().get(0), pathEdgeIdentifier);
         pathEdgeAccess.setSourceLocation(callExpr.getSourceLocation());
         countFunctionArguments.add(pathEdgeAccess);
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathVerticesRewrite.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathVerticesRewrite.java
index 1dbc027..c9f5d1e 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathVerticesRewrite.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/PathVerticesRewrite.java
@@ -21,8 +21,8 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.PathPatternAction;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.type.MaterializePathTypeComputer;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.FieldAccessor;
@@ -36,7 +36,7 @@
             throw new CompilationException(ErrorCode.ILLEGAL_FUNCTION_USE, callExpr.getSourceLocation(),
                     GraphixFunctionIdentifiers.PATH_VERTICES.toString());
         }
-        Identifier pathVertexIdentifier = new Identifier(PathPatternAction.PATH_VERTICES_FIELD_NAME);
+        Identifier pathVertexIdentifier = new Identifier(MaterializePathTypeComputer.VERTICES_FIELD_NAME);
         FieldAccessor pathVertexAccess = new FieldAccessor(callExpr.getExprList().get(0), pathVertexIdentifier);
         pathVertexAccess.setSourceLocation(callExpr.getSourceLocation());
         return pathVertexAccess;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/SchemaAccessRewrite.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/SchemaAccessRewrite.java
index 73fb2a6..639278b 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/SchemaAccessRewrite.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/function/rewrite/SchemaAccessRewrite.java
@@ -21,7 +21,7 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.graphix.function.prepare.AbstractElementPrepare;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.FieldAccessor;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitorFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/ElementEvaluationAnnotation.java
similarity index 60%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitorFactory.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/ElementEvaluationAnnotation.java
index ff00077..9dfa97f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitorFactory.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/ElementEvaluationAnnotation.java
@@ -16,16 +16,26 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.print;
+package org.apache.asterix.graphix.lang.annotation;
 
-import java.io.PrintWriter;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
 
-import org.apache.asterix.lang.common.base.IAstPrintVisitorFactory;
-import org.apache.asterix.lang.common.visitor.QueryPrintVisitor;
+/**
+ * Annotation used to attach an evaluation approach to a graph element.
+ */
+public class ElementEvaluationAnnotation implements IExpressionAnnotation {
+    private final Kind kind;
 
-public class GraphixASTPrintVisitorFactory implements IAstPrintVisitorFactory {
-    @Override
-    public QueryPrintVisitor createLangVisitor(PrintWriter writer) {
-        return new GraphixASTPrintVisitor(writer);
+    public ElementEvaluationAnnotation(Kind kind) {
+        this.kind = kind;
+    }
+
+    public Kind getKind() {
+        return kind;
+    }
+
+    public enum Kind {
+        EXPAND_AND_UNION,
+        SWITCH_AND_CYCLE
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/LoweringExemptAnnotation.java
similarity index 63%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/LoweringExemptAnnotation.java
index 4509792..3f59a72 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/LoweringExemptAnnotation.java
@@ -16,11 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.lang.annotation;
 
-import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
 
-@FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+/**
+ * Annotation used to indicate that a VERTEX-PATTERN-EXPR or an EDGE-PATTERN-EXPR should not be lowered.
+ */
+public class LoweringExemptAnnotation implements IExpressionAnnotation {
+    public static final LoweringExemptAnnotation INSTANCE = new LoweringExemptAnnotation();
+
+    private LoweringExemptAnnotation() {
+    }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/SubqueryVertexJoinAnnotation.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/SubqueryVertexJoinAnnotation.java
new file mode 100644
index 0000000..8425b14
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/annotation/SubqueryVertexJoinAnnotation.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.annotation;
+
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
+
+/**
+ * Annotation used to indicate that a VERTEX-PATTERN-EXPR has been rewritten to JOIN with another VERTEX-PATTERN-EXPR
+ * in a non-local scope.
+ */
+public class SubqueryVertexJoinAnnotation implements IExpressionAnnotation {
+    private final VariableExpr sourceVertexVariable;
+
+    public SubqueryVertexJoinAnnotation(VariableExpr sourceVertexVariable) {
+        this.sourceVertexVariable = sourceVertexVariable;
+    }
+
+    public VariableExpr getSourceVertexVariable() {
+        return sourceVertexVariable;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/CorrLetClause.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/CorrLetClause.java
deleted file mode 100644
index 1a80aff..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/CorrLetClause.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.clause;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.rewrites.visitor.ILetCorrelateClauseVisitor;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-
-/**
- * Clause for introducing a {@link LetClause} into the scope of any correlated clauses. This clause allows us to avoid
- * nesting the Graphix lowering result to handle any correlated clauses on graph elements.
- */
-public class CorrLetClause extends AbstractBinaryCorrelateClause {
-    private final LetClause letClause;
-
-    public CorrLetClause(Expression rightExpr, VariableExpr rightVar, VariableExpr rightPosVar) {
-        super(rightExpr, rightVar, rightPosVar);
-        letClause = new LetClause((rightVar == null) ? rightPosVar : rightVar, rightExpr);
-    }
-
-    @Override
-    public void setRightExpression(Expression rightExpr) {
-        VariableExpr variableExpr = (getRightVariable() == null) ? getPositionalVariable() : getRightVariable();
-        letClause.setVarExpr(variableExpr);
-        letClause.setBindingExpr(rightExpr);
-        super.setRightExpression(rightExpr);
-    }
-
-    @Override
-    public ClauseType getClauseType() {
-        return ClauseType.LET_CLAUSE;
-    }
-
-    @Override
-    public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
-        if (visitor instanceof ILetCorrelateClauseVisitor) {
-            return ((ILetCorrelateClauseVisitor<R, T>) visitor).visit(this, arg);
-
-        } else {
-            // This node will survive our Graphix lowering, so by default we call the dispatch on our LET-CLAUSE node.
-            return letClause.accept(visitor, arg);
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/CorrWhereClause.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/CorrWhereClause.java
deleted file mode 100644
index 98ad42a..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/CorrWhereClause.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.clause;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.clause.WhereClause;
-import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-
-/**
- * Clause for introducing a {@link WhereClause} in an intermediate list of correlated clauses. This clause allows us to
- * perform predicate push-down at the AST level (rather than at the Algebricks level).
- */
-public class CorrWhereClause extends AbstractBinaryCorrelateClause {
-    private final WhereClause whereClause;
-
-    public CorrWhereClause(Expression conditionExpr) {
-        super(conditionExpr, null, null);
-        whereClause = new WhereClause(conditionExpr);
-    }
-
-    public Expression getExpression() {
-        return whereClause.getWhereExpr();
-    }
-
-    public void setExpression(Expression expression) {
-        whereClause.setWhereExpr(expression);
-    }
-
-    @Override
-    public ClauseType getClauseType() {
-        return ClauseType.WHERE_CLAUSE;
-    }
-
-    @Override
-    public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
-        // This node will survive our Graphix lowering, so by default we call the dispatch on our WHERE-CLAUSE node.
-        return whereClause.accept(visitor, arg);
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/FromGraphClause.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/FromGraphClause.java
index d8d4cad..c4455d5 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/FromGraphClause.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/FromGraphClause.java
@@ -18,45 +18,58 @@
  */
 package org.apache.asterix.graphix.lang.clause;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
-import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
+import org.apache.asterix.lang.common.base.AbstractExtensionClause;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
+import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
+import org.apache.asterix.metadata.declared.MetadataProvider;
 
 /**
- * The logical starting AST node for Graphix queries. A FROM-GRAPH node includes the following:
- * - Either a {@link GraphConstructor} OR a [dataverse, graph name] pair. The former indicates that we are dealing with
- * an anonymous graph, while the latter indicates that we must search our metadata for the graph.
- * - A list of {@link MatchClause} nodes, with a minimum size of one. The first MATCH node type must always be LEADING.
- * - A list of {@link AbstractBinaryCorrelateClause} nodes, which may be empty. These include UNNEST and explicit JOINs.
+ * The logical starting AST node for Graphix queries. Lowering a Graphix AST involves setting the
+ * {@link AbstractExtensionClause}, initially set to null. A FROM-GRAPH node includes the following:
+ * <ul>
+ *  <li>Either a {@link GraphConstructor} OR a [dataverse, graph name] pair. The former indicates that we are dealing
+ *  with an anonymous graph, while the latter indicates that we must search our metadata for the graph.</li>
+ *  <li>A list of {@link MatchClause} nodes, with a minimum size of one. The first MATCH node type must always be
+ *  LEADING.</li>
+ *  <li>A list of {@link AbstractBinaryCorrelateClause} nodes, which may be empty. These include UNNEST and explicit
+ *  JOINs.</li>
+ * </ul>
  */
-public class FromGraphClause extends AbstractClause {
-    // A FROM-MATCH must either have a graph constructor...
+public class FromGraphClause extends FromClause {
+    // A non-lowered FROM-GRAPH-CLAUSE must either have a graph constructor...
     private final GraphConstructor graphConstructor;
 
     // Or a reference to a named graph (both cannot be specified).
     private final DataverseName dataverse;
     private final Identifier name;
 
-    // Every FROM-MATCH **MUST** include at-least a single MATCH clause. Correlated clauses are optional.
+    // Every non-lowered FROM-GRAPH-CLAUSE **MUST** include at-least a single MATCH clause.
     private final List<MatchClause> matchClauses;
     private final List<AbstractBinaryCorrelateClause> correlateClauses;
 
+    // After lowering, we should have built an extension clause of some sort.
+    private AbstractExtensionClause lowerClause = null;
+
     public FromGraphClause(DataverseName dataverse, Identifier name, List<MatchClause> matchClauses,
             List<AbstractBinaryCorrelateClause> correlateClauses) {
+        super(Collections.emptyList());
         this.graphConstructor = null;
         this.dataverse = dataverse;
         this.name = Objects.requireNonNull(name);
         this.matchClauses = Objects.requireNonNull(matchClauses);
         this.correlateClauses = Objects.requireNonNull(correlateClauses);
-
         if (matchClauses.isEmpty()) {
             throw new IllegalArgumentException("FROM-MATCH requires at least one MATCH clause.");
         }
@@ -64,17 +77,36 @@
 
     public FromGraphClause(GraphConstructor graphConstructor, List<MatchClause> matchClauses,
             List<AbstractBinaryCorrelateClause> correlateClauses) {
+        super(Collections.emptyList());
         this.graphConstructor = Objects.requireNonNull(graphConstructor);
         this.dataverse = null;
         this.name = null;
         this.matchClauses = Objects.requireNonNull(matchClauses);
         this.correlateClauses = Objects.requireNonNull(correlateClauses);
-
         if (matchClauses.isEmpty()) {
             throw new IllegalArgumentException("FROM-MATCH requires at least one MATCH clause.");
         }
     }
 
+    public FromGraphClause(AbstractExtensionClause lowerClause) {
+        super(Collections.emptyList());
+        this.lowerClause = Objects.requireNonNull(lowerClause);
+        this.graphConstructor = null;
+        this.dataverse = null;
+        this.name = null;
+        this.matchClauses = Collections.emptyList();
+        this.correlateClauses = Collections.emptyList();
+    }
+
+    public GraphIdentifier getGraphIdentifier(MetadataProvider metadataProvider) {
+        DataverseName dataverseName = metadataProvider.getDefaultDataverseName();
+        if (this.dataverse != null) {
+            dataverseName = this.dataverse;
+        }
+        return (graphConstructor == null) ? new GraphIdentifier(dataverseName, name.getValue())
+                : new GraphIdentifier(dataverseName, graphConstructor.getInstanceID());
+    }
+
     public GraphConstructor getGraphConstructor() {
         return graphConstructor;
     }
@@ -95,25 +127,47 @@
         return correlateClauses;
     }
 
-    @Override
-    public ClauseType getClauseType() {
-        return null;
+    public AbstractExtensionClause getLowerClause() {
+        return lowerClause;
+    }
+
+    public void setLowerClause(AbstractExtensionClause lowerClause) {
+        this.lowerClause = lowerClause;
     }
 
     @Override
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
-        return ((IGraphixLangVisitor<R, T>) visitor).visit(this, arg);
+        if (visitor instanceof IGraphixLangVisitor) {
+            return ((IGraphixLangVisitor<R, T>) visitor).visit(this, arg);
+
+        } else if (lowerClause != null) {
+            return visitor.visit(lowerClause.getVisitorExtension(), arg);
+
+        } else {
+            return ((ISqlppVisitor<R, T>) visitor).visit(this, arg);
+        }
     }
 
     @Override
     public String toString() {
-        return (graphConstructor != null) ? graphConstructor.toString()
-                : ((dataverse == null) ? name.getValue() : (dataverse + "." + name));
+        if (lowerClause != null) {
+            return lowerClause.toString();
+
+        } else if (graphConstructor != null) {
+            return graphConstructor.toString();
+
+        } else if (dataverse != null && name != null) {
+            return dataverse + "." + name.getValue();
+
+        } else if (dataverse == null && name != null) {
+            return name.getValue();
+        }
+        throw new IllegalStateException();
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(graphConstructor, dataverse, name, matchClauses, correlateClauses);
+        return Objects.hash(graphConstructor, dataverse, name, matchClauses, correlateClauses, lowerClause);
     }
 
     @Override
@@ -127,6 +181,7 @@
         FromGraphClause that = (FromGraphClause) object;
         return Objects.equals(graphConstructor, that.graphConstructor) && Objects.equals(dataverse, that.dataverse)
                 && Objects.equals(name, that.name) && matchClauses.equals(that.matchClauses)
-                && Objects.equals(correlateClauses, that.correlateClauses);
+                && Objects.equals(correlateClauses, that.correlateClauses)
+                && Objects.equals(lowerClause, that.lowerClause);
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/GraphSelectBlock.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/GraphSelectBlock.java
deleted file mode 100644
index 8871aaf..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/GraphSelectBlock.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.clause;
-
-import java.util.List;
-import java.util.Objects;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
-import org.apache.asterix.lang.common.base.AbstractClause;
-import org.apache.asterix.lang.common.clause.GroupbyClause;
-import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
-import org.apache.asterix.lang.sqlpp.clause.SelectClause;
-import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-
-/**
- * Starting AST node for a Graphix query, which will replace the FROM-CLAUSE with a {@link FromGraphClause} on
- * parse. The goal of our Graphix rewriter is to replace these {@link FromGraphClause} nodes with applicable
- * {@link org.apache.asterix.lang.sqlpp.clause.FromClause} nodes.
- */
-public class GraphSelectBlock extends SelectBlock {
-    private FromGraphClause fromGraphClause;
-
-    public GraphSelectBlock(SelectClause selectClause, FromGraphClause fromGraphClause,
-            List<AbstractClause> letWhereClauses, GroupbyClause groupbyClause,
-            List<AbstractClause> letHavingClausesAfterGby) {
-        super(selectClause, null, letWhereClauses, groupbyClause, letHavingClausesAfterGby);
-        this.fromGraphClause = fromGraphClause;
-    }
-
-    public FromGraphClause getFromGraphClause() {
-        return fromGraphClause;
-    }
-
-    public void setFromGraphClause(FromGraphClause fromGraphClause) {
-        this.fromGraphClause = fromGraphClause;
-    }
-
-    public boolean hasFromGraphClause() {
-        return fromGraphClause != null;
-    }
-
-    @Override
-    public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
-        if (hasFromClause()) {
-            return ((ISqlppVisitor<R, T>) visitor).visit(this, arg);
-
-        } else {
-            return ((IGraphixLangVisitor<R, T>) visitor).visit(this, arg);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(getFromClause(), getFromGraphClause(), getGroupbyClause(), getLetWhereList(),
-                getLetHavingListAfterGroupby(), getSelectClause());
-    }
-
-    @Override
-    public boolean equals(Object object) {
-        if (this == object) {
-            return true;
-        }
-        if (!(object instanceof GraphSelectBlock)) {
-            return false;
-        }
-        GraphSelectBlock target = (GraphSelectBlock) object;
-        return super.equals(target) && Objects.equals(getFromGraphClause(), target.getFromGraphClause());
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(getSelectClause());
-        if (hasFromClause()) {
-            sb.append(' ').append(getFromClause());
-        } else if (hasFromGraphClause()) {
-            sb.append(' ').append(getFromGraphClause());
-        }
-        if (hasLetWhereClauses()) {
-            sb.append(' ').append(getLetWhereList());
-        }
-        if (hasGroupbyClause()) {
-            sb.append(' ').append(getGroupbyClause());
-        }
-        if (hasLetHavingClausesAfterGroupby()) {
-            sb.append(' ').append(getLetHavingListAfterGroupby());
-        }
-        return sb.toString();
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/LowerListClause.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/LowerListClause.java
new file mode 100644
index 0000000..18e85c9
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/LowerListClause.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.clause;
+
+import java.util.Objects;
+
+import org.apache.asterix.graphix.lang.clause.extension.LowerListClauseExtension;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.lang.common.base.AbstractExtensionClause;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+
+/**
+ * A functional equivalent to the {@link FromTerm}, used as a container for lowering a non-recursive portion of a
+ * {@link FromGraphClause}. We also maintain a list of {@link LetClause} nodes that bind vertex, edge, and path
+ * variables to expressions after the main linked list.
+ */
+public class LowerListClause extends AbstractExtensionClause {
+    private final LowerListClauseExtension lowerClauseExtension;
+    private final ClauseCollection clauseCollection;
+
+    public LowerListClause(ClauseCollection clauseCollection) {
+        this.clauseCollection = clauseCollection;
+        this.lowerClauseExtension = new LowerListClauseExtension(this);
+    }
+
+    public ClauseCollection getClauseCollection() {
+        return clauseCollection;
+    }
+
+    @Override
+    public IVisitorExtension getVisitorExtension() {
+        return lowerClauseExtension;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(clauseCollection.hashCode());
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof LowerListClause)) {
+            return false;
+        }
+        LowerListClause that = (LowerListClause) object;
+        return Objects.equals(this.clauseCollection, that.clauseCollection);
+    }
+
+    @Override
+    public String toString() {
+        return clauseCollection.toString();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/LowerSwitchClause.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/LowerSwitchClause.java
new file mode 100644
index 0000000..99d8610
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/LowerSwitchClause.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.clause;
+
+import java.util.Objects;
+
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsNavigationOption;
+import org.apache.asterix.graphix.lang.clause.extension.LowerSwitchClauseExtension;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.MatchSemanticAction;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.CollectionTable;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.lang.common.base.AbstractExtensionClause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
+import org.apache.asterix.lang.common.expression.IndexAccessor;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.literal.IntegerLiteral;
+
+/**
+ * A functional equivalent to the {@link org.apache.asterix.lang.sqlpp.clause.JoinClause}, used as a container for
+ * lowering a recursive / ambiguous portion of a {@link FromGraphClause}.
+ */
+public class LowerSwitchClause extends AbstractExtensionClause {
+    private final LowerSwitchClauseExtension lowerClauseExtension;
+    private final ClauseOutputEnvironment clauseOutputEnvironment;
+    private final ClauseInputEnvironment clauseInputEnvironment;
+    private final CollectionTable collectionLookupTable;
+
+    /**
+     * The following is set by {@link MatchSemanticAction}.
+     */
+    private SemanticsNavigationOption navigationSemantics;
+
+    /**
+     * The output to a BFS clause will be of type list, containing three items.
+     */
+    public static class ClauseOutputEnvironment {
+        public static final int OUTPUT_VERTEX_ITERATION_VARIABLE_INDEX = 0;
+        public static final int OUTPUT_VERTEX_JOIN_VARIABLE_INDEX = 1;
+        public static final int OUTPUT_PATH_VARIABLE_INDEX = 2;
+        private final VariableExpr outputVariable;
+        private final ElementLabel endingLabel;
+
+        // We provide the following as output, through our output variable.
+        private final VariableExpr outputVertexIterationVariable;
+        private final VariableExpr outputVertexJoinVariable;
+        private final VariableExpr pathVariable;
+
+        public ClauseOutputEnvironment(VariableExpr outputVariable, VariableExpr outputVertexIterationVariable,
+                VariableExpr outputVertexJoinVariable, VariableExpr pathVariable, ElementLabel endingLabel) {
+            this.outputVariable = Objects.requireNonNull(outputVariable);
+            this.outputVertexIterationVariable = Objects.requireNonNull(outputVertexIterationVariable);
+            this.outputVertexJoinVariable = Objects.requireNonNull(outputVertexJoinVariable);
+            this.pathVariable = Objects.requireNonNull(pathVariable);
+            this.endingLabel = endingLabel;
+        }
+
+        public VariableExpr getOutputVariable() {
+            return outputVariable;
+        }
+
+        public VariableExpr getOutputVertexIterationVariable() {
+            return outputVertexIterationVariable;
+        }
+
+        public VariableExpr getOutputVertexJoinVariable() {
+            return outputVertexJoinVariable;
+        }
+
+        public VariableExpr getPathVariable() {
+            return pathVariable;
+        }
+
+        public ElementLabel getEndingLabel() {
+            return endingLabel;
+        }
+
+        public Expression buildIterationVariableAccess() {
+            LiteralExpr indexExpr = new LiteralExpr(new IntegerLiteral(OUTPUT_VERTEX_ITERATION_VARIABLE_INDEX));
+            return new IndexAccessor(outputVariable, IndexAccessor.IndexKind.ELEMENT, indexExpr);
+        }
+
+        public Expression buildJoinVariableAccess() {
+            LiteralExpr indexExpr = new LiteralExpr(new IntegerLiteral(OUTPUT_VERTEX_JOIN_VARIABLE_INDEX));
+            return new IndexAccessor(outputVariable, IndexAccessor.IndexKind.ELEMENT, indexExpr);
+        }
+
+        public Expression buildPathVariableAccess() {
+            LiteralExpr indexExpr = new LiteralExpr(new IntegerLiteral(OUTPUT_PATH_VARIABLE_INDEX));
+            return new IndexAccessor(outputVariable, IndexAccessor.IndexKind.ELEMENT, indexExpr);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(outputVariable, outputVertexIterationVariable, outputVertexJoinVariable, pathVariable);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (this == object) {
+                return true;
+            }
+            if (!(object instanceof ClauseOutputEnvironment)) {
+                return false;
+            }
+            ClauseOutputEnvironment that = (ClauseOutputEnvironment) object;
+            return Objects.equals(this.outputVariable, that.outputVariable)
+                    && Objects.equals(this.outputVertexIterationVariable, that.outputVertexIterationVariable)
+                    && Objects.equals(this.outputVertexJoinVariable, that.outputVertexJoinVariable)
+                    && Objects.equals(this.pathVariable, that.pathVariable)
+                    && Objects.equals(this.endingLabel, that.endingLabel);
+        }
+
+        @Override
+        public String toString() {
+            String exposeToOutputString = "clause-output-env (" + outputVariable.toString() + ")";
+            String iterationString = "iteration: " + outputVertexIterationVariable.toString();
+            String joinString = "join: " + outputVertexJoinVariable.toString();
+            String pathString = "path: " + pathVariable.toString();
+            return String.format("%s: {%s, %s, %s}", exposeToOutputString, iterationString, joinString, pathString);
+        }
+    }
+
+    /**
+     * The input to a BFS clause will be a single representative vertex.
+     */
+    public static class ClauseInputEnvironment {
+        private final VariableExpr inputVariable;
+        private final ElementLabel startingLabel;
+
+        public ClauseInputEnvironment(VariableExpr inputVariable, ElementLabel startingLabel) {
+            this.inputVariable = inputVariable;
+            this.startingLabel = startingLabel;
+        }
+
+        public VariableExpr getInputVariable() {
+            return inputVariable;
+        }
+
+        public ElementLabel getStartingLabel() {
+            return startingLabel;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(inputVariable, startingLabel);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (this == object) {
+                return true;
+            }
+            if (!(object instanceof ClauseInputEnvironment)) {
+                return false;
+            }
+            ClauseInputEnvironment that = (ClauseInputEnvironment) object;
+            return Objects.equals(this.inputVariable, that.inputVariable)
+                    && Objects.equals(this.startingLabel, that.startingLabel);
+        }
+    }
+
+    public LowerSwitchClause(CollectionTable pathClauseCollectionTable, ClauseInputEnvironment inputEnvironment,
+            ClauseOutputEnvironment outputEnvironment) {
+        this.collectionLookupTable = pathClauseCollectionTable;
+        this.clauseInputEnvironment = inputEnvironment;
+        this.clauseOutputEnvironment = outputEnvironment;
+        this.lowerClauseExtension = new LowerSwitchClauseExtension(this);
+    }
+
+    public void setNavigationSemantics(SemanticsNavigationOption navigationSemantics) {
+        this.navigationSemantics = navigationSemantics;
+    }
+
+    public SemanticsNavigationOption getNavigationSemantics() {
+        return navigationSemantics;
+    }
+
+    public ClauseInputEnvironment getClauseInputEnvironment() {
+        return clauseInputEnvironment;
+    }
+
+    public ClauseOutputEnvironment getClauseOutputEnvironment() {
+        return clauseOutputEnvironment;
+    }
+
+    public CollectionTable getCollectionLookupTable() {
+        return collectionLookupTable;
+    }
+
+    @Override
+    public IVisitorExtension getVisitorExtension() {
+        return lowerClauseExtension;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(collectionLookupTable, clauseInputEnvironment, clauseOutputEnvironment,
+                navigationSemantics);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof LowerSwitchClause)) {
+            return false;
+        }
+        LowerSwitchClause that = (LowerSwitchClause) object;
+        return Objects.equals(this.collectionLookupTable, that.collectionLookupTable)
+                && Objects.equals(this.clauseOutputEnvironment, that.clauseOutputEnvironment)
+                && Objects.equals(this.clauseInputEnvironment, that.clauseInputEnvironment)
+                && Objects.equals(this.navigationSemantics, that.navigationSemantics);
+    }
+
+    @Override
+    public String toString() {
+        return clauseOutputEnvironment.toString();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/MatchClause.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/MatchClause.java
index 11580e0..7823bcd 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/MatchClause.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/MatchClause.java
@@ -25,17 +25,21 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
 import org.apache.asterix.graphix.lang.optype.MatchType;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.MatchSemanticAction;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.AbstractClause;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 /**
  * Container for a collection of {@link PathPatternExpr} nodes.
- * - A MATCH node has three types: LEADING (indicating that this node is first), INNER (indicating that this node is not
- * first, but all patterns must be matched), and LEFTOUTER (indicating that this node is optionally matched).
- * - Under isomorphism semantics, two patterns in different MATCH nodes (one pattern in a LEADING MATCH node and
- * one pattern in an INNER MATCH node) are equivalent to two patterns in a single LEADING MATCH node. See
- * {@link org.apache.asterix.graphix.lang.rewrites.lower.action.IsomorphismAction} for more detail.
+ * <ul>
+ *  <li>A MATCH node has three types: LEADING (indicating that this node is first), INNER (indicating that this node
+ *  is not first, but all patterns must be matched), and LEFTOUTER (indicating that this node is optionally
+ *  matched).</li>
+ *  <li>Under isomorphism semantics, two patterns in different MATCH nodes (one pattern in a LEADING MATCH node and
+ *  one pattern in an INNER MATCH node) are equivalent to two patterns in a single LEADING MATCH node. See
+ *  {@link MatchSemanticAction} for more detail</li>
+ * </ul>
  */
 public class MatchClause extends AbstractClause {
     private final List<PathPatternExpr> pathExpressions;
@@ -43,7 +47,7 @@
 
     public MatchClause(List<PathPatternExpr> pathExpressions, MatchType matchType) {
         this.pathExpressions = Objects.requireNonNull(pathExpressions);
-        this.matchType = matchType;
+        this.matchType = Objects.requireNonNull(matchType);
     }
 
     public List<PathPatternExpr> getPathExpressions() {
@@ -67,7 +71,6 @@
     @Override
     public String toString() {
         String pathString = pathExpressions.stream().map(PathPatternExpr::toString).collect(Collectors.joining("\n"));
-        return matchType.toString() + " " + pathString;
-
+        return matchType + " " + pathString;
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/IGraphixVisitorExtension.java
similarity index 73%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/IGraphixVisitorExtension.java
index 4509792..ddc6d5f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/IGraphixVisitorExtension.java
@@ -16,11 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.lang.clause.extension;
 
-import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
 
-@FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+public interface IGraphixVisitorExtension extends IVisitorExtension {
+    Kind getKind();
+
+    enum Kind {
+        LOWER_LIST,
+        LOWER_SWITCH
+    }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerListClauseExtension.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerListClauseExtension.java
new file mode 100644
index 0000000..caf8ff6
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerListClauseExtension.java
@@ -0,0 +1,339 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.clause.extension;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.clause.WhereClause;
+import org.apache.asterix.lang.common.expression.AbstractCallExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.parser.ScopeChecker;
+import org.apache.asterix.lang.common.rewrites.VariableSubstitutionEnvironment;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.JoinClause;
+import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+/**
+ * @see LowerListClause
+ */
+public class LowerListClauseExtension implements IGraphixVisitorExtension {
+    private final ClauseCollection clauseCollection;
+    private final LowerListClause lowerListClause;
+
+    public LowerListClauseExtension(LowerListClause lowerListClause) {
+        this.clauseCollection = lowerListClause.getClauseCollection();
+        this.lowerListClause = lowerListClause;
+    }
+
+    public LowerListClause getLowerListClause() {
+        return lowerListClause;
+    }
+
+    @Override
+    public Expression simpleExpressionDispatch(ILangVisitor<Expression, ILangExpression> simpleExpressionVisitor,
+            ILangExpression argument) throws CompilationException {
+        for (AbstractClause workingClause : clauseCollection) {
+            if (workingClause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                simpleExpressionVisitor.visit(lowerSwitchClause.getVisitorExtension(), argument);
+
+            } else {
+                workingClause.accept(simpleExpressionVisitor, argument);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Void freeVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>> freeVariableVisitor,
+            Collection<VariableExpr> freeVariables) throws CompilationException {
+        Collection<VariableExpr> bindingVariables = new HashSet<>();
+        Collection<VariableExpr> clauseFreeVariables = new HashSet<>();
+        for (AbstractClause workingClause : clauseCollection) {
+            clauseFreeVariables.clear();
+            switch (workingClause.getClauseType()) {
+                case LET_CLAUSE:
+                    LetClause letClause = (LetClause) workingClause;
+                    letClause.getBindingExpr().accept(freeVariableVisitor, clauseFreeVariables);
+                    clauseFreeVariables.removeAll(bindingVariables);
+                    freeVariables.addAll(clauseFreeVariables);
+                    bindingVariables.add(letClause.getVarExpr());
+                    break;
+
+                case UNNEST_CLAUSE:
+                    UnnestClause unnestClause = (UnnestClause) workingClause;
+                    unnestClause.getRightExpression().accept(freeVariableVisitor, clauseFreeVariables);
+                    clauseFreeVariables.removeAll(bindingVariables);
+                    freeVariables.addAll(clauseFreeVariables);
+                    bindingVariables.add(unnestClause.getRightVariable());
+                    if (unnestClause.hasPositionalVariable()) {
+                        bindingVariables.add(unnestClause.getPositionalVariable());
+                    }
+                    break;
+
+                case JOIN_CLAUSE:
+                    JoinClause joinClause = (JoinClause) workingClause;
+                    joinClause.getRightExpression().accept(freeVariableVisitor, clauseFreeVariables);
+                    clauseFreeVariables.removeAll(bindingVariables);
+                    freeVariables.addAll(clauseFreeVariables);
+
+                    // Handle our condition expression, which can reference its right variable.
+                    Collection<VariableExpr> conditionFreeVariables = new HashSet<>();
+                    joinClause.getConditionExpression().accept(freeVariableVisitor, conditionFreeVariables);
+                    conditionFreeVariables.removeAll(bindingVariables);
+                    conditionFreeVariables.remove(joinClause.getRightVariable());
+                    bindingVariables.add(joinClause.getRightVariable());
+                    if (joinClause.hasPositionalVariable()) {
+                        conditionFreeVariables.remove(joinClause.getPositionalVariable());
+                        bindingVariables.add(joinClause.getPositionalVariable());
+                    }
+                    freeVariables.addAll(conditionFreeVariables);
+                    break;
+
+                case WHERE_CLAUSE:
+                    WhereClause whereClause = (WhereClause) workingClause;
+                    whereClause.getWhereExpr().accept(freeVariableVisitor, clauseFreeVariables);
+                    clauseFreeVariables.removeAll(bindingVariables);
+                    freeVariables.addAll(clauseFreeVariables);
+                    break;
+
+                case EXTENSION:
+                    if (workingClause instanceof LowerSwitchClause) {
+                        LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                        IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                        visitorExtension.freeVariableDispatch(freeVariableVisitor, freeVariables);
+                        break;
+                    }
+
+                default:
+                    throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                            "Illegal clause found in the lower clause list!");
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Void bindingVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>> bindingVariableVisitor,
+            Collection<VariableExpr> bindingVariables) {
+        for (AbstractClause workingClause : clauseCollection) {
+            switch (workingClause.getClauseType()) {
+                case LET_CLAUSE:
+                    LetClause letClause = (LetClause) workingClause;
+                    bindingVariables.add(letClause.getVarExpr());
+                    break;
+
+                case UNNEST_CLAUSE:
+                case JOIN_CLAUSE:
+                    AbstractBinaryCorrelateClause correlateClause = (AbstractBinaryCorrelateClause) workingClause;
+                    bindingVariables.add(correlateClause.getRightVariable());
+                    break;
+
+                case EXTENSION:
+                    if (workingClause instanceof LowerSwitchClause) {
+                        LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                        bindingVariables.add(lowerSwitchClause.getClauseOutputEnvironment().getOutputVariable());
+                        break;
+                    }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Expression variableScopeDispatch(ILangVisitor<Expression, ILangExpression> scopingVisitor,
+            ILangExpression argument, ScopeChecker scopeChecker) throws CompilationException {
+        for (AbstractClause workingClause : clauseCollection) {
+            if (workingClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                // We do not extend the scope for our LET-CLAUSE nodes.
+                LetClause letClause = (LetClause) workingClause;
+                letClause.setBindingExpr(letClause.getBindingExpr().accept(scopingVisitor, letClause));
+                VariableExpr letClauseVariable = letClause.getVarExpr();
+                if (scopeChecker.getCurrentScope().findLocalSymbol(letClauseVariable.getVar().getValue()) != null) {
+                    String varName = SqlppVariableUtil.toUserDefinedName(letClauseVariable.getVar().getValue());
+                    throw new CompilationException(ErrorCode.COMPILATION_ERROR, letClauseVariable.getSourceLocation(),
+                            "Duplicate alias definitions: " + varName);
+                }
+                scopeChecker.getCurrentScope().addNewVarSymbolToScope(letClauseVariable.getVar(),
+                        Set.of(AbstractSqlppExpressionScopingVisitor.SqlppVariableAnnotation.CONTEXT_VARIABLE));
+
+            } else if (workingClause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                visitorExtension.variableScopeDispatch(scopingVisitor, argument, scopeChecker);
+
+            } else {
+                workingClause.accept(scopingVisitor, argument);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public ILangExpression deepCopyDispatch(ILangVisitor<ILangExpression, Void> deepCopyVisitor)
+            throws CompilationException {
+        ClauseCollection copyCollection = new ClauseCollection(clauseCollection.getSourceLocation());
+        for (AbstractClause clause : clauseCollection.getNonRepresentativeClauses()) {
+            if (clause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) clause;
+                IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                AbstractClause copiedClause = (AbstractClause) visitorExtension.deepCopyDispatch(deepCopyVisitor);
+                copyCollection.addNonRepresentativeClause(copiedClause);
+
+            } else {
+                copyCollection.addNonRepresentativeClause((AbstractClause) clause.accept(deepCopyVisitor, null));
+            }
+        }
+        for (LetClause clause : clauseCollection.getRepresentativeVertexBindings()) {
+            LetClause copiedClause = (LetClause) clause.accept(deepCopyVisitor, null);
+            copyCollection.addVertexBinding(copiedClause.getVarExpr(), copiedClause.getBindingExpr());
+        }
+        for (LetClause clause : clauseCollection.getRepresentativeEdgeBindings()) {
+            LetClause copiedClause = (LetClause) clause.accept(deepCopyVisitor, null);
+            copyCollection.addEdgeBinding(copiedClause.getVarExpr(), copiedClause.getBindingExpr());
+        }
+        for (LetClause clause : clauseCollection.getRepresentativePathBindings()) {
+            LetClause copiedClause = (LetClause) clause.accept(deepCopyVisitor, null);
+            copyCollection.addPathBinding(copiedClause.getVarExpr(), copiedClause.getBindingExpr());
+        }
+        for (AbstractBinaryCorrelateClause clause : clauseCollection.getUserDefinedCorrelateClauses()) {
+            AbstractBinaryCorrelateClause copiedClause =
+                    (AbstractBinaryCorrelateClause) clause.accept(deepCopyVisitor, null);
+            copyCollection.addUserDefinedCorrelateClause(copiedClause);
+        }
+
+        // Note: a LOWER-LIST-CLAUSE is also the entry-point for a FROM-GRAPH-CLAUSE, so we return the latter.
+        LowerListClause copyListClause = new LowerListClause(copyCollection);
+        copyListClause.setSourceLocation(lowerListClause.getSourceLocation());
+        FromGraphClause fromGraphClause = new FromGraphClause(copyListClause);
+        fromGraphClause.setSourceLocation(lowerListClause.getSourceLocation());
+        return fromGraphClause;
+    }
+
+    @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> remapCloneDispatch(
+            ILangVisitor<Pair<ILangExpression, VariableSubstitutionEnvironment>, VariableSubstitutionEnvironment> remapCloneVisitor,
+            VariableSubstitutionEnvironment substitutionEnvironment) {
+        // TODO (GLENN): Finish the remap-clone dispatch.
+        return null;
+    }
+
+    @Override
+    public Boolean inlineUDFsDispatch(ILangVisitor<Boolean, Void> inlineUDFsVisitor) throws CompilationException {
+        boolean changed = false;
+        for (AbstractClause workingClause : clauseCollection) {
+            if (workingClause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                changed |= visitorExtension.inlineUDFsDispatch(inlineUDFsVisitor);
+
+            } else {
+                changed |= workingClause.accept(inlineUDFsVisitor, null);
+            }
+        }
+        return changed;
+    }
+
+    @Override
+    public Void gatherFunctionsDispatch(ILangVisitor<Void, Void> gatherFunctionsVisitor,
+            Collection<? super AbstractCallExpression> functionCalls) throws CompilationException {
+        for (AbstractClause workingClause : clauseCollection) {
+            if (workingClause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                visitorExtension.gatherFunctionsDispatch(gatherFunctionsVisitor, functionCalls);
+
+            } else {
+                workingClause.accept(gatherFunctionsVisitor, null);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Boolean checkSubqueryDispatch(ILangVisitor<Boolean, ILangExpression> checkSubqueryVisitor,
+            ILangExpression argument) throws CompilationException {
+        for (AbstractClause workingClause : clauseCollection) {
+            if (workingClause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                if (visitorExtension.checkSubqueryDispatch(checkSubqueryVisitor, argument)) {
+                    return true;
+                }
+
+            } else if (workingClause.accept(checkSubqueryVisitor, null)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean check92AggregateDispatch(ILangVisitor<Boolean, ILangExpression> check92AggregateVisitor,
+            ILangExpression argument) {
+        return false;
+    }
+
+    @Override
+    public Boolean checkNonFunctionalDispatch(ILangVisitor<Boolean, Void> checkNonFunctionalVisitor)
+            throws CompilationException {
+        for (AbstractClause workingClause : clauseCollection) {
+            if (workingClause instanceof LowerSwitchClause) {
+                LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                IVisitorExtension visitorExtension = lowerSwitchClause.getVisitorExtension();
+                if (visitorExtension.checkNonFunctionalDispatch(checkNonFunctionalVisitor)) {
+                    return true;
+                }
+
+            } else if (workingClause.accept(checkNonFunctionalVisitor, null)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean checkDatasetOnlyDispatch(ILangVisitor<Boolean, VariableExpr> checkDatasetOnlyVisitor,
+            VariableExpr datasetCandidate) {
+        return false;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.LOWER_LIST;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerSwitchClauseExtension.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerSwitchClauseExtension.java
new file mode 100644
index 0000000..436933d
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/clause/extension/LowerSwitchClauseExtension.java
@@ -0,0 +1,252 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.clause.extension;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.CollectionTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.StateContainer;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.context.Scope;
+import org.apache.asterix.lang.common.expression.AbstractCallExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.parser.ScopeChecker;
+import org.apache.asterix.lang.common.rewrites.VariableSubstitutionEnvironment;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+/**
+ * @see LowerSwitchClause
+ */
+public class LowerSwitchClauseExtension implements IGraphixVisitorExtension {
+    private final CollectionTable collectionLookupTable;
+    private final LowerSwitchClause lowerSwitchClause;
+
+    public LowerSwitchClauseExtension(LowerSwitchClause lowerSwitchClause) {
+        this.collectionLookupTable = lowerSwitchClause.getCollectionLookupTable();
+        this.lowerSwitchClause = lowerSwitchClause;
+    }
+
+    public LowerSwitchClause getLowerSwitchClause() {
+        return lowerSwitchClause;
+    }
+
+    @Override
+    public Expression simpleExpressionDispatch(ILangVisitor<Expression, ILangExpression> simpleExpressionVisitor,
+            ILangExpression argument) throws CompilationException {
+        for (ClauseCollection clauseCollection : collectionLookupTable) {
+            for (AbstractClause workingClause : clauseCollection) {
+                workingClause.accept(simpleExpressionVisitor, argument);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Void freeVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>> freeVariableVisitor,
+            Collection<VariableExpr> freeVariables) throws CompilationException {
+        Iterator<Pair<ElementLabel, List<CollectionTable.Entry>>> entryIterator = collectionLookupTable.entryIterator();
+        while (entryIterator.hasNext()) {
+            Pair<ElementLabel, List<CollectionTable.Entry>> tableEntry = entryIterator.next();
+            StateContainer inputState = collectionLookupTable.getInputMap().get(tableEntry.first);
+            for (CollectionTable.Entry entry : tableEntry.second) {
+                ClauseCollection clauseCollection = entry.getClauseCollection();
+                LowerListClause lowerListClause = new LowerListClause(clauseCollection);
+                LowerListClauseExtension lowerListClauseExtension = new LowerListClauseExtension(lowerListClause);
+
+                // The input variables to each branch are **not** free (in the context of this visitor).
+                Set<VariableExpr> clauseCollectionFreeVars = new HashSet<>();
+                lowerListClauseExtension.freeVariableDispatch(freeVariableVisitor, clauseCollectionFreeVars);
+                clauseCollectionFreeVars.removeIf(v -> {
+                    final VariableExpr inputJoinVariable = inputState.getJoinVariable();
+                    final VariableExpr inputIterationVariable = inputState.getIterationVariable();
+                    return v.equals(inputJoinVariable) || v.equals(inputIterationVariable);
+                });
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Void bindingVariableDispatch(ILangVisitor<Void, Collection<VariableExpr>> bindingVariableVisitor,
+            Collection<VariableExpr> bindingVariables) throws CompilationException {
+        throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, lowerSwitchClause.getSourceLocation(),
+                "Binding variable dispatch invoked for LOWER-SWITCH-CLAUSE!");
+    }
+
+    @Override
+    public Expression variableScopeDispatch(ILangVisitor<Expression, ILangExpression> scopingVisitor,
+            ILangExpression argument, ScopeChecker scopeChecker) throws CompilationException {
+        // Traverse our branches.
+        Iterator<Pair<ElementLabel, List<CollectionTable.Entry>>> entryIterator = collectionLookupTable.entryIterator();
+        while (entryIterator.hasNext()) {
+            Pair<ElementLabel, List<CollectionTable.Entry>> tableEntry = entryIterator.next();
+            StateContainer inputState = collectionLookupTable.getInputMap().get(tableEntry.first);
+            for (CollectionTable.Entry entry : tableEntry.second) {
+                ClauseCollection clauseCollection = entry.getClauseCollection();
+                LowerListClause lowerListClause = new LowerListClause(clauseCollection);
+                LowerListClauseExtension lowerListClauseExtension = new LowerListClauseExtension(lowerListClause);
+
+                // Our input variables should only be visible to each branch.
+                Scope newScope = scopeChecker.createNewScope();
+                addVariableToScope(newScope, inputState.getJoinVariable().getVar());
+                addVariableToScope(newScope, inputState.getIterationVariable().getVar());
+                lowerListClauseExtension.variableScopeDispatch(scopingVisitor, argument, scopeChecker);
+                scopeChecker.removeCurrentScope();
+            }
+        }
+
+        // Introduce our output variable into scope.
+        LowerSwitchClause.ClauseOutputEnvironment outputEnv = lowerSwitchClause.getClauseOutputEnvironment();
+        addVariableToScope(scopeChecker.getCurrentScope(), outputEnv.getOutputVariable().getVar());
+        return null;
+    }
+
+    @Override
+    public ILangExpression deepCopyDispatch(ILangVisitor<ILangExpression, Void> deepCopyVisitor)
+            throws CompilationException {
+        CollectionTable copyTable = new CollectionTable();
+        Iterator<Pair<ElementLabel, List<CollectionTable.Entry>>> entryIterator = collectionLookupTable.entryIterator();
+        while (entryIterator.hasNext()) {
+            Pair<ElementLabel, List<CollectionTable.Entry>> tableEntry = entryIterator.next();
+            for (CollectionTable.Entry entry : tableEntry.second) {
+                ClauseCollection clauseCollection = entry.getClauseCollection();
+                LowerListClauseExtension llce = new LowerListClauseExtension(new LowerListClause(clauseCollection));
+                FromGraphClause fromGraphClause = (FromGraphClause) llce.deepCopyDispatch(deepCopyVisitor);
+                LowerListClause lowerClauseCopy = (LowerListClause) fromGraphClause.getLowerClause();
+                copyTable.putCollection(tableEntry.first, entry.getEdgeLabel(), entry.getDestinationLabel(),
+                        lowerClauseCopy.getClauseCollection(), entry.getEdgeDirection());
+            }
+        }
+        copyTable.setInputMap(collectionLookupTable.getInputMap());
+        copyTable.setOutputMap(collectionLookupTable.getOutputMap());
+        LowerSwitchClause.ClauseOutputEnvironment outputEnv = lowerSwitchClause.getClauseOutputEnvironment();
+        VariableExpr outputVariableExpr = outputEnv.getOutputVariable();
+        VariableExpr copyOutputVariableExpr = (VariableExpr) outputVariableExpr.accept(deepCopyVisitor, null);
+        LowerSwitchClause.ClauseOutputEnvironment copyOutputEnv = new LowerSwitchClause.ClauseOutputEnvironment(
+                copyOutputVariableExpr, outputEnv.getOutputVertexIterationVariable(),
+                outputEnv.getOutputVertexJoinVariable(), outputEnv.getPathVariable(), outputEnv.getEndingLabel());
+        LowerSwitchClause.ClauseInputEnvironment inputEnv = lowerSwitchClause.getClauseInputEnvironment();
+        VariableExpr inputVariableExpr = inputEnv.getInputVariable();
+        VariableExpr copyInputVariableExpr = (VariableExpr) inputVariableExpr.accept(deepCopyVisitor, null);
+        LowerSwitchClause.ClauseInputEnvironment copyInputEnv =
+                new LowerSwitchClause.ClauseInputEnvironment(copyInputVariableExpr, inputEnv.getStartingLabel());
+        LowerSwitchClause copyLowerSwitchClause = new LowerSwitchClause(copyTable, copyInputEnv, copyOutputEnv);
+        copyLowerSwitchClause.setNavigationSemantics(lowerSwitchClause.getNavigationSemantics());
+        copyLowerSwitchClause.setSourceLocation(lowerSwitchClause.getSourceLocation());
+        return copyLowerSwitchClause;
+    }
+
+    @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> remapCloneDispatch(
+            ILangVisitor<Pair<ILangExpression, VariableSubstitutionEnvironment>, VariableSubstitutionEnvironment> remapCloneVisitor,
+            VariableSubstitutionEnvironment substitutionEnvironment) {
+        // TODO (GLENN): Finish the remap-clone dispatch.
+        return null;
+    }
+
+    @Override
+    public Boolean inlineUDFsDispatch(ILangVisitor<Boolean, Void> inlineUDFsVisitor) throws CompilationException {
+        boolean changed = false;
+        for (ClauseCollection clauseCollection : collectionLookupTable) {
+            for (AbstractClause workingClause : clauseCollection) {
+                changed |= workingClause.accept(inlineUDFsVisitor, null);
+            }
+        }
+        return changed;
+    }
+
+    @Override
+    public Void gatherFunctionsDispatch(ILangVisitor<Void, Void> gatherFunctionsVisitor,
+            Collection<? super AbstractCallExpression> functionCalls) throws CompilationException {
+        for (ClauseCollection clauseCollection : collectionLookupTable) {
+            for (AbstractClause workingClause : clauseCollection) {
+                workingClause.accept(gatherFunctionsVisitor, null);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Boolean checkSubqueryDispatch(ILangVisitor<Boolean, ILangExpression> checkSubqueryVisitor,
+            ILangExpression argument) throws CompilationException {
+        for (ClauseCollection clauseCollection : collectionLookupTable) {
+            for (AbstractClause workingClause : clauseCollection) {
+                if (workingClause.accept(checkSubqueryVisitor, null)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean check92AggregateDispatch(ILangVisitor<Boolean, ILangExpression> check92AggregateVisitor,
+            ILangExpression argument) {
+        return false;
+    }
+
+    @Override
+    public Boolean checkNonFunctionalDispatch(ILangVisitor<Boolean, Void> checkNonFunctionalVisitor)
+            throws CompilationException {
+        for (ClauseCollection clauseCollection : collectionLookupTable) {
+            for (AbstractClause workingClause : clauseCollection) {
+                if (workingClause.accept(checkNonFunctionalVisitor, null)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public Boolean checkDatasetOnlyDispatch(ILangVisitor<Boolean, VariableExpr> checkDatasetOnlyVisitor,
+            VariableExpr datasetCandidate) {
+        return false;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.LOWER_SWITCH;
+    }
+
+    private void addVariableToScope(Scope scope, VarIdentifier varIdentifier) throws CompilationException {
+        if (scope.findLocalSymbol(varIdentifier.getValue()) != null) {
+            String varName = SqlppVariableUtil.toUserDefinedName(varIdentifier.getValue());
+            throw new CompilationException(ErrorCode.COMPILATION_ERROR, lowerSwitchClause.getSourceLocation(),
+                    "Duplicate alias definitions: " + varName);
+        }
+        scope.addNewVarSymbolToScope(varIdentifier, Set.of());
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/EdgePatternExpr.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/EdgePatternExpr.java
index 666141b..03d3bce 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/EdgePatternExpr.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/EdgePatternExpr.java
@@ -24,33 +24,39 @@
 import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
 import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 /**
- * A query edge (not to be confused with an edge constructor) is composed of a {@link EdgeDescriptor} (containing the
- * edge labels, an optional edge variable, and the hop range), an list of optional internal {@link VertexPatternExpr}
- * instances, a left {@link VertexPatternExpr}, and a right {@link VertexPatternExpr}.
+ * A query edge (not to be confused with an edge constructor) is composed of:
+ * <ul>
+ *  <li>A {@link EdgeDescriptor} (containing the edge labels, an optional edge variable, and the hop range).</li>
+ *  <li>An optional internal {@link VertexPatternExpr}.</li>
+ *  <li>A left {@link VertexPatternExpr}.</li>
+ *  <li>A right {@link VertexPatternExpr}.</li>
+ * </ul>
  */
 public class EdgePatternExpr extends AbstractExpression {
-    private final List<VertexPatternExpr> internalVertices;
     private final EdgeDescriptor edgeDescriptor;
     private VertexPatternExpr leftVertex;
     private VertexPatternExpr rightVertex;
+    private VertexPatternExpr internalVertex;
 
     public EdgePatternExpr(VertexPatternExpr leftVertex, VertexPatternExpr rightVertex, EdgeDescriptor edgeDescriptor) {
         this.leftVertex = Objects.requireNonNull(leftVertex);
         this.rightVertex = Objects.requireNonNull(rightVertex);
         this.edgeDescriptor = Objects.requireNonNull(edgeDescriptor);
-        this.internalVertices = new ArrayList<>();
-
         if (edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH) {
             // If we have a sub-path, we have an internal vertex that we need to manage.
-            for (int i = 0; i < edgeDescriptor.getMaximumHops() - 1; i++) {
-                this.internalVertices.add(new VertexPatternExpr(null, new HashSet<>()));
-            }
+            this.internalVertex = new VertexPatternExpr(null, null, new HashSet<>());
+
+        } else {
+            this.internalVertex = null;
         }
     }
 
@@ -62,12 +68,12 @@
         return rightVertex;
     }
 
-    public EdgeDescriptor getEdgeDescriptor() {
-        return edgeDescriptor;
+    public VertexPatternExpr getInternalVertex() {
+        return internalVertex;
     }
 
-    public List<VertexPatternExpr> getInternalVertices() {
-        return internalVertices;
+    public EdgeDescriptor getEdgeDescriptor() {
+        return edgeDescriptor;
     }
 
     public void setLeftVertex(VertexPatternExpr leftVertex) {
@@ -78,14 +84,30 @@
         this.rightVertex = rightVertex;
     }
 
-    public void replaceInternalVertices(List<VertexPatternExpr> internalVertices) {
-        this.internalVertices.clear();
-        this.internalVertices.addAll(internalVertices);
+    public void setInternalVertex(VertexPatternExpr internalVertex) {
+        this.internalVertex = internalVertex;
+    }
+
+    public List<EdgeIdentifier> generateIdentifiers(GraphIdentifier graphIdentifier) {
+        List<EdgeIdentifier> edgeIdentifiers = new ArrayList<>();
+        for (ElementLabel leftLabel : leftVertex.getLabels()) {
+            for (ElementLabel rightLabel : rightVertex.getLabels()) {
+                for (ElementLabel edgeLabel : edgeDescriptor.getEdgeLabels()) {
+                    if (edgeDescriptor.getEdgeDirection() != EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT) {
+                        edgeIdentifiers.add(new EdgeIdentifier(graphIdentifier, leftLabel, edgeLabel, rightLabel));
+                    }
+                    if (edgeDescriptor.getEdgeDirection() != EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
+                        edgeIdentifiers.add(new EdgeIdentifier(graphIdentifier, rightLabel, edgeLabel, leftLabel));
+                    }
+                }
+            }
+        }
+        return edgeIdentifiers;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(leftVertex, rightVertex, edgeDescriptor, internalVertices);
+        return Objects.hash(leftVertex, rightVertex, internalVertex, edgeDescriptor);
     }
 
     @Override
@@ -98,8 +120,8 @@
         }
         EdgePatternExpr that = (EdgePatternExpr) object;
         return Objects.equals(this.leftVertex, that.leftVertex) && Objects.equals(this.rightVertex, that.rightVertex)
-                && Objects.equals(this.edgeDescriptor, that.edgeDescriptor)
-                && Objects.equals(this.internalVertices, that.internalVertices);
+                && Objects.equals(this.internalVertex, that.internalVertex)
+                && Objects.equals(this.edgeDescriptor, that.edgeDescriptor);
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/GraphConstructor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/GraphConstructor.java
index 245be24..e5b10eb 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/GraphConstructor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/GraphConstructor.java
@@ -23,16 +23,19 @@
 import java.util.UUID;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.AbstractLangExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 /**
- * An expression which describes the schema of a graph, containing a list of vertices ({@link VertexConstructor}) and
- * a list of edges ({@link EdgeConstructor}) that connect the aforementioned vertices.
+ * An expression which describes the schema of a graph, containing:
+ * <ul>
+ *  <li>A list of vertices ({@link VertexConstructor}).</li>
+ *  <li>A list of edges ({@link EdgeConstructor}) that connect the aforementioned vertices.</li>
+ * </ul>
  */
 public class GraphConstructor extends AbstractExpression {
     private final List<VertexConstructor> vertexConstructors;
@@ -88,9 +91,11 @@
 
     /**
      * A vertex constructor (not be confused with a query vertex) is composed of the following:
-     * - An AST containing the vertex body expression, as well as the raw body string itself.
-     * - A single vertex label that uniquely identifies the vertex.
-     * - A list of primary key fields, used in the JOIN clause with edges.
+     * <ul>
+     *  <li>An AST containing the vertex body expression, as well as the raw body string itself.</li>
+     *  <li>A single vertex label that uniquely identifies the vertex.</li>
+     *  <li>A list of primary key fields, used in the JOIN clause with edges.</li>
+     * </ul>
      */
     public static class VertexConstructor extends AbstractLangExpression {
         private final List<Integer> primaryKeySourceIndicators;
@@ -160,12 +165,14 @@
 
     /**
      * An edge constructor (not be confused with a query edge) is composed of the following:
-     * - An AST containing the edge body expression, as well as the raw body string itself.
-     * - A single edge label that uniquely identifies the edge.
-     * - A single label that denotes the source vertices of this edge, as well as another label that denotes the
-     * destination vertices of this edge.
-     * - A list of source key fields, used in the JOIN clause with the corresponding source vertices.
-     * - A list of destination key fields, used in the JOIN clause with the corresponding destination vertices.
+     * <ul>
+     *  <li>An AST containing the edge body expression, as well as the raw body string itself.</li>
+     *  <li>A single edge label that uniquely identifies the edge.</li>
+     *  <li>A single label that denotes the source vertices of this edge, as well as another label that denotes the
+     *  destination vertices of this edge.</li>
+     *  <li>A list of source key fields, used in the JOIN clause with the corresponding source vertices.</li>
+     *  <li>A list of destination key fields, used in the JOIN clause with the corresponding destination vertices.</li>
+     * </ul>
      */
     public static class EdgeConstructor extends AbstractLangExpression {
         private final List<Integer> destinationKeySourceIndicators;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/PathPatternExpr.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/PathPatternExpr.java
index 1057731..2e1e7c2 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/PathPatternExpr.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/PathPatternExpr.java
@@ -21,18 +21,23 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 /**
- * A path is composed of a list of {@link VertexPatternExpr} instances and a list of {@link EdgePatternExpr} that
- * utilize the aforementioned vertices. Users can also optionally specify a variable, and attach {@link LetClause} nodes
- * to aid in lowering this expression (i.e. for lowering sub-paths).
+ * A path is composed of:
+ * <ul>
+ *  <li>A list of {@link VertexPatternExpr} instances.</li>
+ *  <li>A list of {@link EdgePatternExpr} instances that utilize the aforementioned vertices.</li>
+ *  <li>An optional variable binding all vertices and edges to a path record.</li>
+ *  <li>A list of {@link LetClause} nodes that represent expanded sub-paths.</li>
+ * </ul>
  */
 public class PathPatternExpr extends AbstractExpression {
     private final List<LetClause> reboundSubPathExpressions;
@@ -79,4 +84,13 @@
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
         return ((IGraphixLangVisitor<R, T>) visitor).visit(this, arg);
     }
+
+    @Override
+    public String toString() {
+        String edgeString = edgeExpressions.stream().map(EdgePatternExpr::toString).collect(Collectors.joining(","));
+        String variableString = (variableExpr != null) ? (" AS " + variableExpr) : "";
+        return String.format("%s%s%s",
+                vertexExpressions.stream().map(VertexPatternExpr::toString).collect(Collectors.joining(",")),
+                (edgeString.equals("") ? "" : ", " + edgeString), variableString);
+    }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/VertexPatternExpr.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/VertexPatternExpr.java
index 54cbfa4..0897eb6 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/VertexPatternExpr.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/expression/VertexPatternExpr.java
@@ -24,24 +24,31 @@
 import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 /**
- * A query vertex (not to be confused with a vertex constructor) is composed of a set of labels (which may be empty)
- * and a variable (which may initially be null).
+ * A query vertex (not to be confused with a vertex constructor) is composed of:
+ * <ul>
+ *  <li>A set of labels (which may be empty).</li>
+ *  <li>A variable (which may initially be null).</li>
+ *  <li>A filter expression (which may be null).</li>
+ * </ul>
  */
 public class VertexPatternExpr extends AbstractExpression {
     private final Set<ElementLabel> labels;
+    private final Expression filterExpr;
     private VariableExpr variableExpr;
 
-    public VertexPatternExpr(VariableExpr variableExpr, Set<ElementLabel> labels) {
+    public VertexPatternExpr(VariableExpr variableExpr, Expression filterExpr, Set<ElementLabel> labels) {
         this.variableExpr = variableExpr;
+        this.filterExpr = filterExpr;
         this.labels = labels;
     }
 
@@ -49,6 +56,10 @@
         return labels;
     }
 
+    public Expression getFilterExpr() {
+        return filterExpr;
+    }
+
     public VariableExpr getVariableExpr() {
         return variableExpr;
     }
@@ -57,10 +68,8 @@
         this.variableExpr = variableExpr;
     }
 
-    public List<GraphElementIdentifier> generateIdentifiers(GraphIdentifier graphIdentifier) {
-        return labels.stream()
-                .map(v -> new GraphElementIdentifier(graphIdentifier, GraphElementIdentifier.Kind.VERTEX, v))
-                .collect(Collectors.toList());
+    public List<VertexIdentifier> generateIdentifiers(GraphIdentifier graphIdentifier) {
+        return labels.stream().map(v -> new VertexIdentifier(graphIdentifier, v)).collect(Collectors.toList());
     }
 
     @Override
@@ -77,14 +86,16 @@
             return false;
         }
         VertexPatternExpr that = (VertexPatternExpr) object;
-        return Objects.equals(this.labels, that.labels) && Objects.equals(this.variableExpr, that.variableExpr);
+        return Objects.equals(this.labels, that.labels) && Objects.equals(this.variableExpr, that.variableExpr)
+                && Objects.equals(this.filterExpr, that.filterExpr);
     }
 
     @Override
     public String toString() {
         String labelsString = labels.stream().map(ElementLabel::toString).collect(Collectors.joining("|"));
         String variableString = (variableExpr != null) ? variableExpr.getVar().toString() : "";
-        return String.format("(%s:%s)", variableString, labelsString);
+        String filterString = (filterExpr != null) ? (" WHERE " + filterExpr + " ") : "";
+        return String.format("(%s:%s%s)", variableString, labelsString, filterString);
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/parser/GraphixParserHint.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/parser/GraphixParserHint.java
new file mode 100644
index 0000000..95e7403
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/parser/GraphixParserHint.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.parser;
+
+import org.apache.asterix.graphix.algebra.compiler.option.ElementEvaluationOption;
+
+/**
+ * Graphix SQL++ specific hints. Note that this is not an extension of the SQL++ hint class:
+ * {@link org.apache.asterix.lang.sqlpp.parser.SqlppHint}, so callers must use their own facilities for hint finding.
+ */
+public enum GraphixParserHint {
+    EXPAND_AND_UNION_HINT(ElementEvaluationOption.EXPAND_AND_UNION.getOptionValue()),
+    SWITCH_AND_CYCLE_HINT(ElementEvaluationOption.SWITCH_AND_CYCLE.getOptionValue());
+
+    private final String id;
+
+    GraphixParserHint(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return getId();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixQueryRewriter.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixQueryRewriter.java
new file mode 100644
index 0000000..7355a4d
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixQueryRewriter.java
@@ -0,0 +1,343 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.common.config.CompilerProperties;
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.parser.GraphixParserFactory;
+import org.apache.asterix.graphix.lang.rewrite.common.BranchLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.print.SqlppASTPrintQueryVisitor;
+import org.apache.asterix.graphix.lang.rewrite.resolve.ExhaustiveSearchResolver;
+import org.apache.asterix.graphix.lang.rewrite.resolve.SchemaKnowledgeTable;
+import org.apache.asterix.graphix.lang.rewrite.visitor.ElementLookupTableVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.FunctionResolutionVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixFunctionCallVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixLoweringVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.PatternGraphGroupVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.PopulateUnknownsVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.PostRewriteCheckVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.PreRewriteCheckVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.QueryCanonicalizationVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.SubqueryVertexJoinVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.VariableScopingCheckVisitor;
+import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
+import org.apache.asterix.graphix.lang.struct.PatternGroup;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IParserFactory;
+import org.apache.asterix.lang.common.base.IReturningStatement;
+import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.statement.Query;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.common.util.ExpressionUtils;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.lang.sqlpp.rewrites.SqlppFunctionBodyRewriter;
+import org.apache.asterix.lang.sqlpp.rewrites.SqlppQueryRewriter;
+import org.apache.asterix.metadata.entities.Dataverse;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.util.LogRedactionUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * Rewriter for Graphix queries, which will lower all graph AST nodes into SQL++ AST nodes. We perform the following:
+ * <ol>
+ *  <li>Perform an error-checking on the fresh AST (immediately after parsing).</li>
+ *  <li>Populate the unknowns in our AST (e.g. vertex / edge variables, projections, GROUP-BY keys).</li>
+ *  <li>Perform a variable-scoping pass to identify illegal variables (either duplicate or out-of-scope).</li>
+ *  <li>Resolve all of our function calls (Graphix, SQL++, and user-defined).</li>
+ *  <li>Perform resolution of unlabeled vertices / edges, as well as edge directions.</li>
+ *  <li>For all Graphix subqueries whose vertices are correlated, rewrite this correlation to be explicit.</li>
+ *  <li>Using the labels of the vertices / edges in our AST, fetch the relevant graph elements from our metadata.</li>
+ *  <li>Perform a canonical Graphix lowering pass to remove ambiguities (e.g. undirected edges).</li>
+ *  <li>Perform a lowering pass to transform Graphix AST nodes to SQL++ AST nodes.</li>
+ *  <li>Perform another lowering pass to transform Graphix CALL-EXPR nodes to SQL++ AST nodes.</li>
+ *  <li>Perform all SQL++ rewrites on our newly lowered AST.</li>
+ * </ol>
+ */
+public class GraphixQueryRewriter extends SqlppQueryRewriter {
+    private static final Logger LOGGER = LogManager.getLogger(GraphixQueryRewriter.class);
+
+    private final GraphixParserFactory parserFactory;
+    private final SqlppQueryRewriter bodyRewriter;
+
+    public GraphixQueryRewriter(IParserFactory parserFactory) {
+        super(parserFactory);
+        this.parserFactory = (GraphixParserFactory) parserFactory;
+        this.bodyRewriter = getFunctionAndViewBodyRewriter();
+    }
+
+    @Override
+    public void rewrite(LangRewritingContext langRewritingContext, IReturningStatement topStatement,
+            boolean allowNonStoredUDFCalls, boolean inlineUdfsAndViews, Collection<VarIdentifier> externalVars)
+            throws CompilationException {
+        LOGGER.debug("Starting Graphix AST rewrites.");
+
+        // Perform an initial error-checking pass to validate our user query.
+        LOGGER.trace("Performing pre-Graphix-rewrite check (user query validation).");
+        GraphixRewritingContext graphixRewritingContext = (GraphixRewritingContext) langRewritingContext;
+        topStatement.accept(new PreRewriteCheckVisitor(graphixRewritingContext), null);
+
+        // Perform the Graphix rewrites.
+        rewriteGraphixASTNodes(graphixRewritingContext, topStatement, allowNonStoredUDFCalls);
+
+        // Sanity check: ensure that no graph AST nodes exist after this point.
+        Map<String, Object> queryConfig = graphixRewritingContext.getMetadataProvider().getConfig();
+        if (queryConfig.containsKey(CompilerProperties.COMPILER_INTERNAL_SANITYCHECK_KEY)) {
+            String configValue = (String) queryConfig.get(CompilerProperties.COMPILER_INTERNAL_SANITYCHECK_KEY);
+            if (!configValue.equalsIgnoreCase("false")) {
+                LOGGER.trace("Performing post-Graphix-rewrite check (making sure no graph AST nodes exist).");
+                topStatement.accept(new PostRewriteCheckVisitor(), null);
+            }
+        }
+
+        // Perform the remainder of the SQL++ rewrites.
+        LOGGER.debug("Ending Graphix AST rewrites. Now starting SQL++ AST rewrites.");
+        rewriteSQLPPASTNodes(langRewritingContext, topStatement, allowNonStoredUDFCalls, inlineUdfsAndViews,
+                externalVars);
+
+        // Update the variable counter on our context.
+        topStatement.setVarCounter(graphixRewritingContext.getVarCounter().get());
+        LOGGER.debug("Ending SQL++ AST rewrites.");
+    }
+
+    public void loadNormalizedGraphElement(GraphixRewritingContext graphixRewritingContext,
+            GraphElementDeclaration graphElementDeclaration) throws CompilationException {
+        if (graphElementDeclaration.getNormalizedBody() == null) {
+            Dataverse defaultDataverse = graphixRewritingContext.getMetadataProvider().getDefaultDataverse();
+            Dataverse targetDataverse;
+
+            // We might need to change our dataverse, if the element definition requires a different one.
+            GraphIdentifier graphIdentifier = graphElementDeclaration.getGraphIdentifier();
+            DataverseName graphDataverseName = graphIdentifier.getDataverseName();
+            if (graphDataverseName == null || graphDataverseName.equals(defaultDataverse.getDataverseName())) {
+                targetDataverse = defaultDataverse;
+
+            } else {
+                try {
+                    targetDataverse = graphixRewritingContext.getMetadataProvider().findDataverse(graphDataverseName);
+
+                } catch (AlgebricksException e) {
+                    throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e,
+                            graphElementDeclaration.getSourceLocation(), graphDataverseName);
+                }
+            }
+            graphixRewritingContext.getMetadataProvider().setDefaultDataverse(targetDataverse);
+
+            // Get the body of the rewritten query.
+            Expression rawBody = graphElementDeclaration.getRawBody();
+            try {
+                SourceLocation sourceLocation = graphElementDeclaration.getSourceLocation();
+                Query wrappedQuery = ExpressionUtils.createWrappedQuery(rawBody, sourceLocation);
+                bodyRewriter.rewrite(graphixRewritingContext, wrappedQuery, false, false, List.of());
+                graphElementDeclaration.setNormalizedBody(wrappedQuery.getBody());
+
+            } catch (CompilationException e) {
+                throw new CompilationException(ErrorCode.COMPILATION_ERROR, rawBody.getSourceLocation(),
+                        "Bad definition for a graph element: " + e.getMessage());
+
+            } finally {
+                // Switch back to the working dataverse.
+                graphixRewritingContext.getMetadataProvider().setDefaultDataverse(defaultDataverse);
+            }
+        }
+    }
+
+    /**
+     * Lower a Graphix AST into a SQLPP AST. The only nodes that should survive are the following:
+     * 1. {@link org.apache.asterix.graphix.lang.clause.FromGraphClause}
+     * 2. {@link LowerListClause}
+     * 3. {@link LowerSwitchClause}
+     */
+    public void rewriteGraphixASTNodes(GraphixRewritingContext graphixRewritingContext,
+            IReturningStatement topStatement, boolean allowNonStoredUDFCalls) throws CompilationException {
+        // Generate names for unnamed graph elements, projections in our SELECT CLAUSE, and keys in our GROUP BY.
+        LOGGER.trace("Populating unknowns (both graph and non-graph) in our AST.");
+        rewriteExpr(topStatement, new PopulateUnknownsVisitor(graphixRewritingContext));
+
+        // Verify that variables are properly within scope.
+        LOGGER.trace("Verifying that variables are unique and are properly scoped.");
+        rewriteExpr(topStatement, new VariableScopingCheckVisitor(graphixRewritingContext));
+
+        // Resolve all of our (Graphix, SQL++, and user-defined) function calls.
+        LOGGER.trace("Resolving Graphix, SQL++, and user-defined function calls.");
+        rewriteExpr(topStatement, new FunctionResolutionVisitor(graphixRewritingContext, allowNonStoredUDFCalls));
+
+        // Rewrite implicit correlated vertex JOINs as explicit JOINs.
+        LOGGER.trace("Rewriting correlated implicit vertex JOINs into explicit JOINs.");
+        rewriteExpr(topStatement, new SubqueryVertexJoinVisitor(graphixRewritingContext));
+
+        // Resolve our vertex labels, edge labels, and edge directions.
+        LOGGER.trace("Performing label and edge direction resolution.");
+        Map<GraphIdentifier, SchemaKnowledgeTable> knowledgeTableMap = new HashMap<>();
+        Map<GraphIdentifier, PatternGroup> resolutionPatternMap = new HashMap<>();
+        topStatement.accept(new PatternGraphGroupVisitor(resolutionPatternMap, graphixRewritingContext) {
+            @Override
+            public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
+                GraphIdentifier graphIdentifier = fromGraphClause.getGraphIdentifier(metadataProvider);
+                SchemaKnowledgeTable schemaTable = new SchemaKnowledgeTable(fromGraphClause, graphixRewritingContext);
+                knowledgeTableMap.put(graphIdentifier, schemaTable);
+                return super.visit(fromGraphClause, arg);
+            }
+        }, null);
+        for (Map.Entry<GraphIdentifier, PatternGroup> mapEntry : resolutionPatternMap.entrySet()) {
+            SchemaKnowledgeTable knowledgeTable = knowledgeTableMap.get(mapEntry.getKey());
+            new ExhaustiveSearchResolver(knowledgeTable).resolve(mapEntry.getValue());
+        }
+
+        // Fetch all relevant graph element declarations, using the element labels.
+        LOGGER.trace("Fetching relevant edge and vertex bodies from our graph schema.");
+        ElementLookupTable elementLookupTable = new ElementLookupTable();
+        ElementLookupTableVisitor elementLookupTableVisitor =
+                new ElementLookupTableVisitor(graphixRewritingContext, elementLookupTable, parserFactory);
+        rewriteExpr(topStatement, elementLookupTableVisitor);
+        for (GraphElementDeclaration graphElementDeclaration : elementLookupTable) {
+            loadNormalizedGraphElement(graphixRewritingContext, graphElementDeclaration);
+        }
+
+        // Expand / enumerate vertex and edge patterns to snuff out all ambiguities.
+        LOGGER.trace("Performing a canonicalization pass to expand or enumerate patterns.");
+        BranchLookupTable branchLookupTable = new BranchLookupTable();
+        QueryCanonicalizationVisitor queryCanonicalizationVisitor =
+                new QueryCanonicalizationVisitor(branchLookupTable, graphixRewritingContext);
+        rewriteExpr(topStatement, queryCanonicalizationVisitor);
+
+        // Transform all graph AST nodes (i.e. perform the representation lowering).
+        LOGGER.trace("Lowering the Graphix AST-specific nodes representation to a SQL++ representation.");
+        GraphixLoweringVisitor graphixLoweringVisitor =
+                new GraphixLoweringVisitor(graphixRewritingContext, elementLookupTable, branchLookupTable);
+        rewriteExpr(topStatement, graphixLoweringVisitor);
+
+        // Lower all of our Graphix function calls (and perform schema-enrichment).
+        LOGGER.trace("Lowering the Graphix CALL-EXPR nodes to a pure SQL++ representation.");
+        rewriteExpr(topStatement, new GraphixFunctionCallVisitor(graphixRewritingContext));
+    }
+
+    /**
+     * Rewrite a SQLPP AST. We do not perform the following:
+     * <ul>
+     *  <li>Function call resolution (this is handled in {@link FunctionResolutionVisitor}).</li>
+     *  <li>Column name generation (this is handled in {@link PopulateUnknownsVisitor}).</li>
+     *  <li>SQL-compat rewrites (not supported).</li>
+     * </ul>
+     */
+    public void rewriteSQLPPASTNodes(LangRewritingContext langRewritingContext, IReturningStatement topStatement,
+            boolean allowNonStoredUDFCalls, boolean inlineUdfsAndViews, Collection<VarIdentifier> externalVars)
+            throws CompilationException {
+        super.setup(langRewritingContext, topStatement, externalVars, allowNonStoredUDFCalls, inlineUdfsAndViews);
+        super.substituteGroupbyKeyExpression();
+        super.rewriteGroupBys();
+        super.rewriteSetOperations();
+        super.inlineColumnAlias();
+        super.rewriteWindowExpressions();
+        super.rewriteGroupingSets();
+        super.variableCheckAndRewrite();
+        super.extractAggregatesFromCaseExpressions();
+        super.rewriteGroupByAggregationSugar();
+        super.rewriteWindowAggregationSugar();
+        super.rewriteOperatorExpression();
+        super.rewriteCaseExpressions();
+        super.rewriteListInputFunctions();
+        super.rewriteRightJoins();
+        super.loadAndInlineUdfsAndViews();
+        super.rewriteSpecialFunctionNames();
+        super.inlineWithExpressions();
+    }
+
+    @Override
+    protected SqlppFunctionBodyRewriter getFunctionAndViewBodyRewriter() {
+        return new SqlppFunctionBodyRewriter(parserFactory) {
+            @Override
+            public void rewrite(LangRewritingContext langRewritingContext, IReturningStatement topStatement,
+                    boolean allowNonStoredUDFCalls, boolean inlineUdfsAndViews, Collection<VarIdentifier> externalVars)
+                    throws CompilationException {
+                // Perform an initial error-checking pass to validate our body.
+                GraphixRewritingContext graphixRewritingContext = (GraphixRewritingContext) langRewritingContext;
+                topStatement.accept(new PreRewriteCheckVisitor(graphixRewritingContext), null);
+
+                // Perform the Graphix rewrites.
+                rewriteGraphixASTNodes(graphixRewritingContext, topStatement, allowNonStoredUDFCalls);
+
+                // Sanity check: ensure that no graph AST nodes exist after this point.
+                Map<String, Object> queryConfig = graphixRewritingContext.getMetadataProvider().getConfig();
+                if (queryConfig.containsKey(CompilerProperties.COMPILER_INTERNAL_SANITYCHECK_KEY)) {
+                    String configValue = (String) queryConfig.get(CompilerProperties.COMPILER_INTERNAL_SANITYCHECK_KEY);
+                    if (!configValue.equalsIgnoreCase("false")) {
+                        topStatement.accept(new PostRewriteCheckVisitor(), null);
+                    }
+                }
+
+                // Perform the remainder of the SQL++ (body specific) rewrites.
+                super.setup(langRewritingContext, topStatement, externalVars, allowNonStoredUDFCalls,
+                        inlineUdfsAndViews);
+                super.substituteGroupbyKeyExpression();
+                super.rewriteGroupBys();
+                super.rewriteSetOperations();
+                super.inlineColumnAlias();
+                super.rewriteWindowExpressions();
+                super.rewriteGroupingSets();
+                super.variableCheckAndRewrite();
+                super.extractAggregatesFromCaseExpressions();
+                super.rewriteGroupByAggregationSugar();
+                super.rewriteWindowAggregationSugar();
+                super.rewriteOperatorExpression();
+                super.rewriteCaseExpressions();
+                super.rewriteListInputFunctions();
+                super.rewriteRightJoins();
+
+                // Update the variable counter in our context.
+                topStatement.setVarCounter(langRewritingContext.getVarCounter().get());
+            }
+        };
+    }
+
+    private <R, T> void rewriteExpr(IReturningStatement returningStatement, ILangVisitor<R, T> visitor)
+            throws CompilationException {
+        if (LOGGER.isTraceEnabled()) {
+            StringWriter stringWriter = new StringWriter();
+            PrintWriter printWriter = new PrintWriter(stringWriter);
+            returningStatement.accept(new SqlppASTPrintQueryVisitor(printWriter), null);
+            String planAsString = LogRedactionUtil.userData(stringWriter.toString());
+            LOGGER.trace("Plan before rewrite: {}\n", planAsString);
+        }
+        returningStatement.accept(visitor, null);
+        if (LOGGER.isTraceEnabled()) {
+            StringWriter stringWriter = new StringWriter();
+            PrintWriter printWriter = new PrintWriter(stringWriter);
+            returningStatement.accept(new SqlppASTPrintQueryVisitor(printWriter), null);
+            String planAsString = LogRedactionUtil.userData(stringWriter.toString());
+            LOGGER.trace("Plan after rewrite: {}\n", planAsString);
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixRewriterFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixRewriterFactory.java
similarity index 96%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixRewriterFactory.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixRewriterFactory.java
index 6b1cf30..7b6b79b 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixRewriterFactory.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixRewriterFactory.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites;
+package org.apache.asterix.graphix.lang.rewrite;
 
 import org.apache.asterix.graphix.lang.parser.GraphixParserFactory;
 import org.apache.asterix.lang.common.base.IParserFactory;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixRewritingContext.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixRewritingContext.java
new file mode 100644
index 0000000..6018fce
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/GraphixRewritingContext.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.algebra.compiler.option.ElementEvaluationOption;
+import org.apache.asterix.graphix.algebra.compiler.option.IGraphixCompilerOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateEdgeOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateVertexOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsNavigationOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsPatternOption;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.statement.FunctionDecl;
+import org.apache.asterix.lang.common.statement.ViewDecl;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.hyracks.api.exceptions.IWarningCollector;
+
+/**
+ * Wrapper class for {@link LangRewritingContext} and for Graphix specific rewriting.
+ */
+public class GraphixRewritingContext extends LangRewritingContext {
+    private final Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs = new HashMap<>();
+    private final Map<String, Integer> uniqueCopyCounter = new HashMap<>();
+    private final Map<String, String> configFileOptions;
+
+    public GraphixRewritingContext(MetadataProvider metadataProvider, List<FunctionDecl> declaredFunctions,
+            List<ViewDecl> declaredViews, Set<DeclareGraphStatement> declareGraphStatements,
+            IWarningCollector warningCollector, int varCounter, Map<String, String> configFileOptions) {
+        super(metadataProvider, declaredFunctions, declaredViews, warningCollector, varCounter);
+        declareGraphStatements.forEach(d -> {
+            GraphIdentifier graphIdentifier = new GraphIdentifier(d.getDataverseName(), d.getGraphName());
+            this.declaredGraphs.put(graphIdentifier, d);
+        });
+        this.configFileOptions = configFileOptions;
+    }
+
+    public Map<GraphIdentifier, DeclareGraphStatement> getDeclaredGraphs() {
+        return declaredGraphs;
+    }
+
+    public VariableExpr getGraphixVariableCopy(String existingIdentifierValue) {
+        uniqueCopyCounter.put(existingIdentifierValue, uniqueCopyCounter.getOrDefault(existingIdentifierValue, 0) + 1);
+        int currentCount = uniqueCopyCounter.get(existingIdentifierValue);
+        String variableName = String.format("#GGVC(%s,%s)", existingIdentifierValue, currentCount);
+        return new VariableExpr(new VarIdentifier(variableName));
+    }
+
+    public VariableExpr getGraphixVariableCopy(VariableExpr existingVariable) {
+        VarIdentifier existingIdentifier = existingVariable.getVar();
+        String variableName = SqlppVariableUtil.toUserDefinedVariableName(existingIdentifier).getValue();
+        return getGraphixVariableCopy(variableName);
+    }
+
+    public IGraphixCompilerOption getSetting(String settingName) throws CompilationException {
+        IGraphixCompilerOption[] enumValues;
+        switch (settingName) {
+            case ElementEvaluationOption.OPTION_KEY_NAME:
+                enumValues = ElementEvaluationOption.values();
+                return parseSetting(settingName, enumValues, ElementEvaluationOption.OPTION_DEFAULT);
+
+            case SchemaDecorateEdgeOption.OPTION_KEY_NAME:
+                enumValues = SchemaDecorateEdgeOption.values();
+                return parseSetting(settingName, enumValues, SchemaDecorateEdgeOption.OPTION_DEFAULT);
+
+            case SchemaDecorateVertexOption.OPTION_KEY_NAME:
+                enumValues = SchemaDecorateVertexOption.values();
+                return parseSetting(settingName, enumValues, SchemaDecorateVertexOption.OPTION_DEFAULT);
+
+            case SemanticsNavigationOption.OPTION_KEY_NAME:
+                enumValues = SemanticsNavigationOption.values();
+                return parseSetting(settingName, enumValues, SemanticsNavigationOption.OPTION_DEFAULT);
+
+            case SemanticsPatternOption.OPTION_KEY_NAME:
+                enumValues = SemanticsPatternOption.values();
+                return parseSetting(settingName, enumValues, SemanticsPatternOption.OPTION_DEFAULT);
+
+            default:
+                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Illegal setting requested!");
+        }
+    }
+
+    private IGraphixCompilerOption parseSetting(String settingName, IGraphixCompilerOption[] settingValues,
+            IGraphixCompilerOption defaultValue) throws CompilationException {
+        // Always check our metadata configuration first.
+        Object metadataConfigValue = getMetadataProvider().getConfig().get(settingName);
+        if (metadataConfigValue != null) {
+            String configValueString = ((String) metadataConfigValue).toLowerCase(Locale.ROOT);
+            return Stream.of(settingValues).filter(o -> o.getOptionValue().equals(configValueString)).findFirst()
+                    .orElseThrow(() -> new CompilationException(ErrorCode.PARAMETER_NO_VALUE, configValueString));
+        }
+
+        // If our setting is not in metadata, check our config file.
+        String configFileValue = configFileOptions.get(settingName);
+        if (configFileValue != null) {
+            return Stream.of(settingValues).filter(o -> o.getOptionValue().equals(configFileValue)).findFirst()
+                    .orElseThrow(() -> new CompilationException(ErrorCode.PARAMETER_NO_VALUE, configFileValue));
+        }
+
+        // Otherwise, return our default value.
+        return defaultValue;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementBranchConsumer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementBranchConsumer.java
new file mode 100644
index 0000000..8bd208b
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementBranchConsumer.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.canonical;
+
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.common.BranchLookupTable;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+
+public class CanonicalElementBranchConsumer implements ICanonicalElementConsumer {
+    private final BranchLookupTable branchLookupTable;
+
+    public CanonicalElementBranchConsumer(BranchLookupTable branchLookupTable) {
+        this.branchLookupTable = branchLookupTable;
+    }
+
+    @Override
+    public void accept(AbstractExpression ambiguousElement, List<? extends AbstractExpression> canonicalElements)
+            throws CompilationException {
+        if (ambiguousElement instanceof VertexPatternExpr) {
+            throw new CompilationException(ErrorCode.COMPILATION_ERROR,
+                    "Cannot evaluate an ambiguous dangling vertex using SWITCH_AND_CYCLE. Try EXPAND_AND_UNION.",
+                    ambiguousElement.getSourceLocation());
+        }
+        EdgePatternExpr ambiguousEdgeElement = (EdgePatternExpr) ambiguousElement;
+        if (ambiguousEdgeElement.getEdgeDescriptor().getPatternType() == EdgeDescriptor.PatternType.EDGE) {
+            for (AbstractExpression canonicalElement : canonicalElements) {
+                EdgePatternExpr canonicalEdge = (EdgePatternExpr) canonicalElement;
+                branchLookupTable.putBranch(ambiguousEdgeElement, canonicalEdge);
+            }
+
+        } else { // ambiguousEdgeElement.getEdgeDescriptor().getPatternType() == EdgeDescriptor.PatternType.PATH
+            for (AbstractExpression canonicalElement : canonicalElements) {
+                PathPatternExpr canonicalPath = (PathPatternExpr) canonicalElement;
+                branchLookupTable.putBranch(ambiguousEdgeElement, canonicalPath);
+            }
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementExpansionConsumer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementExpansionConsumer.java
new file mode 100644
index 0000000..a35e61a
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementExpansionConsumer.java
@@ -0,0 +1,331 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.canonical;
+
+import static org.apache.asterix.graphix.lang.rewrite.lower.action.PathPatternAction.buildPathRecord;
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.replaceEdgeInIterator;
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.replaceVertexInIterator;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.annotation.SubqueryVertexJoinAnnotation;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.optype.SetOpType;
+import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
+import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
+
+public class CanonicalElementExpansionConsumer implements ICanonicalElementConsumer {
+    private final GraphixDeepCopyVisitor deepCopyVisitor = new GraphixDeepCopyVisitor();
+    private final Deque<SelectBlock> blackSelectBlockStack = new ArrayDeque<>();
+    private final Deque<SelectBlock> redSelectBlockStack = new ArrayDeque<>();
+    private final GraphixRewritingContext graphixRewritingContext;
+
+    // We should return a copy of our original SELECT-EXPR.
+    private final Set<SetOperationInput> remainingSetOpInputs;
+
+    public CanonicalElementExpansionConsumer(SelectExpression originalSelectExpression,
+            GraphixRewritingContext graphixRewritingContext) {
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.remainingSetOpInputs = new HashSet<>();
+        this.remainingSetOpInputs.add(originalSelectExpression.getSelectSetOperation().getLeftInput());
+        this.remainingSetOpInputs.addAll(originalSelectExpression.getSelectSetOperation().getRightInputs().stream()
+                .map(SetOperationRight::getSetOperationRightInput).collect(Collectors.toSet()));
+    }
+
+    @Override
+    public void accept(AbstractExpression ambiguousElement, List<? extends AbstractExpression> canonicalElements)
+            throws CompilationException {
+        Deque<SelectBlock> readStack, writeStack;
+        if (blackSelectBlockStack.isEmpty()) {
+            writeStack = blackSelectBlockStack;
+            readStack = redSelectBlockStack;
+
+        } else {
+            writeStack = redSelectBlockStack;
+            readStack = blackSelectBlockStack;
+        }
+
+        ICanonicalPatternUpdater pathPatternReplacer;
+        if (ambiguousElement instanceof VertexPatternExpr) {
+            pathPatternReplacer = new VertexPatternUpdater(ambiguousElement);
+
+        } else { // ambiguousElement instanceof EdgePatternExpr
+            EdgePatternExpr ambiguousEdgePattern = (EdgePatternExpr) ambiguousElement;
+            EdgeDescriptor ambiguousEdgeDescriptor = ambiguousEdgePattern.getEdgeDescriptor();
+            if (ambiguousEdgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.EDGE) {
+                pathPatternReplacer = new EdgePatternUpdater(ambiguousElement);
+
+            } else { // ambiguousEdgeDescriptor().getPatternType() == EdgeDescriptor.PatternType.PATH
+                pathPatternReplacer = new PathPatternUpdater(ambiguousElement);
+            }
+        }
+
+        // Consume all of our read stack.
+        while (!readStack.isEmpty()) {
+            SelectBlock workingSelectBlock = readStack.pop();
+            for (AbstractExpression canonicalElement : canonicalElements) {
+                SelectBlock workingSelectBlockCopy = deepCopyVisitor.visit(workingSelectBlock, null);
+                workingSelectBlockCopy.accept(new AbstractGraphixQueryVisitor() {
+                    @Override
+                    public Expression visit(PathPatternExpr pathPatternExpr, ILangExpression arg)
+                            throws CompilationException {
+                        pathPatternReplacer.accept(canonicalElement, pathPatternExpr);
+                        return pathPatternExpr;
+                    }
+                }, null);
+                writeStack.push(workingSelectBlockCopy);
+            }
+        }
+    }
+
+    public void finalize(SelectExpression selectExpression, Consumer<SelectBlock> selectBlockCallback) {
+        SelectSetOperation selectSetOperation = selectExpression.getSelectSetOperation();
+        SetOperationInput leftSetOperationInput = selectSetOperation.getLeftInput();
+
+        // Exhaust all of our generated SELECT-BLOCKs.
+        Deque<SelectBlock> finalStack = (redSelectBlockStack.isEmpty()) ? blackSelectBlockStack : redSelectBlockStack;
+        if (!remainingSetOpInputs.contains(leftSetOperationInput)) {
+            leftSetOperationInput.setSelectBlock(finalStack.peek());
+            selectBlockCallback.accept(finalStack.pop());
+        }
+        for (SetOperationRight rightInput : selectSetOperation.getRightInputs()) {
+            SetOperationInput rightSetOperationInput = rightInput.getSetOperationRightInput();
+            if (!remainingSetOpInputs.contains(rightSetOperationInput)) {
+                rightSetOperationInput.setSelectBlock(finalStack.peek());
+                selectBlockCallback.accept(finalStack.pop());
+            }
+        }
+        while (!finalStack.isEmpty()) {
+            SetOperationInput newSetOpInput = new SetOperationInput(finalStack.peek(), null);
+            selectSetOperation.getRightInputs().add(new SetOperationRight(SetOpType.UNION, false, newSetOpInput));
+            selectBlockCallback.accept(finalStack.pop());
+        }
+    }
+
+    public void resetSelectBlock(SelectBlock selectBlock) {
+        blackSelectBlockStack.clear();
+        redSelectBlockStack.clear();
+        blackSelectBlockStack.push(selectBlock);
+
+        // Remove from our original SET-OP input set, the SET-OP this SELECT-BLOCK corresponds to.
+        remainingSetOpInputs.removeIf(s -> s.selectBlock() && s.getSelectBlock().equals(selectBlock));
+    }
+
+    // We provide the following interface to handle dangling vertices, edges, and paths.
+    @FunctionalInterface
+    private interface ICanonicalPatternUpdater {
+        void accept(AbstractExpression canonicalExpr, PathPatternExpr pathPatternExpr) throws CompilationException;
+    }
+
+    private class VertexPatternUpdater implements ICanonicalPatternUpdater {
+        private final AbstractExpression ambiguousElement;
+
+        private VertexPatternUpdater(AbstractExpression ambiguousElement) {
+            this.ambiguousElement = ambiguousElement;
+        }
+
+        @Override
+        public void accept(AbstractExpression canonicalExpr, PathPatternExpr pathPatternExpr)
+                throws CompilationException {
+            List<VertexPatternExpr> vertexExpressions = pathPatternExpr.getVertexExpressions();
+            ListIterator<VertexPatternExpr> vertexIterator = vertexExpressions.listIterator();
+            VertexPatternExpr ambiguousVertex = (VertexPatternExpr) ambiguousElement;
+            VertexPatternExpr canonicalVertex = (VertexPatternExpr) canonicalExpr;
+
+            // Our replacement map must also include any subquery-correlated-join vertices.
+            Map<VertexPatternExpr, VertexPatternExpr> replacementMap = new HashMap<>();
+            replacementMap.put(ambiguousVertex, canonicalVertex);
+            for (VertexPatternExpr vertexPatternExpr : vertexExpressions) {
+                if (vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class) != null) {
+                    SubqueryVertexJoinAnnotation hint = vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                    if (hint.getSourceVertexVariable().equals(ambiguousVertex.getVariableExpr())) {
+                        VertexPatternExpr canonicalVertexCopy = deepCopyVisitor.visit(canonicalVertex, null);
+                        canonicalVertexCopy.setVariableExpr(vertexPatternExpr.getVariableExpr());
+                        replacementMap.put(vertexPatternExpr, canonicalVertexCopy);
+                    }
+                }
+            }
+            replaceVertexInIterator(replacementMap, vertexIterator, deepCopyVisitor);
+        }
+    }
+
+    private class EdgePatternUpdater implements ICanonicalPatternUpdater {
+        private final AbstractExpression ambiguousElement;
+
+        private EdgePatternUpdater(AbstractExpression ambiguousElement) {
+            this.ambiguousElement = ambiguousElement;
+        }
+
+        @Override
+        public void accept(AbstractExpression canonicalExpr, PathPatternExpr pathPatternExpr)
+                throws CompilationException {
+            EdgePatternExpr ambiguousEdgePattern = (EdgePatternExpr) ambiguousElement;
+            VertexPatternExpr ambiguousLeftVertex = ambiguousEdgePattern.getLeftVertex();
+            VertexPatternExpr ambiguousRightVertex = ambiguousEdgePattern.getRightVertex();
+            EdgePatternExpr canonicalEdge = (EdgePatternExpr) canonicalExpr;
+            VertexPatternExpr canonicalLeftVertex = canonicalEdge.getLeftVertex();
+            VertexPatternExpr canonicalRightVertex = canonicalEdge.getRightVertex();
+
+            // Iterate through our edge list.
+            List<EdgePatternExpr> edgeExpressions = pathPatternExpr.getEdgeExpressions();
+            ListIterator<EdgePatternExpr> edgeIterator = edgeExpressions.listIterator();
+            replaceEdgeInIterator(Map.of(ambiguousEdgePattern, canonicalEdge), edgeIterator, deepCopyVisitor);
+
+            // Iterate through our vertex list.
+            replaceEdgeVerticesAndJoinCopiesInIterator(pathPatternExpr, ambiguousLeftVertex, ambiguousRightVertex,
+                    canonicalLeftVertex, canonicalRightVertex);
+        }
+    }
+
+    private class PathPatternUpdater implements ICanonicalPatternUpdater {
+        private final AbstractExpression ambiguousElement;
+
+        private PathPatternUpdater(AbstractExpression ambiguousElement) {
+            this.ambiguousElement = ambiguousElement;
+        }
+
+        @Override
+        public void accept(AbstractExpression canonicalExpr, PathPatternExpr pathPatternExpr)
+                throws CompilationException {
+            EdgePatternExpr ambiguousEdgePattern = (EdgePatternExpr) ambiguousElement;
+            VertexPatternExpr ambiguousLeftVertex = ambiguousEdgePattern.getLeftVertex();
+            VertexPatternExpr ambiguousRightVertex = ambiguousEdgePattern.getRightVertex();
+            EdgeDescriptor ambiguousEdgeDescriptor = ambiguousEdgePattern.getEdgeDescriptor();
+            VariableExpr edgeVariable = ambiguousEdgeDescriptor.getVariableExpr();
+            PathPatternExpr canonicalPathPatternExpr = (PathPatternExpr) canonicalExpr;
+            List<EdgePatternExpr> canonicalEdges = canonicalPathPatternExpr.getEdgeExpressions();
+            VertexPatternExpr canonicalLeftVertex = canonicalEdges.get(0).getLeftVertex();
+            VertexPatternExpr canonicalRightVertex = canonicalEdges.get(canonicalEdges.size() - 1).getRightVertex();
+
+            // Iterate through our edge list.
+            List<EdgePatternExpr> edgeExpressions = pathPatternExpr.getEdgeExpressions();
+            ListIterator<EdgePatternExpr> edgeIterator = edgeExpressions.listIterator();
+            while (edgeIterator.hasNext()) {
+                EdgePatternExpr workingEdge = edgeIterator.next();
+                if (workingEdge.equals(ambiguousEdgePattern)) {
+                    edgeIterator.remove();
+
+                    // We need to generate new variables for each edge in our new path.
+                    List<EdgePatternExpr> canonicalEdgeListCopy = new ArrayList<>();
+                    for (EdgePatternExpr canonicalEdge : canonicalEdges) {
+                        EdgePatternExpr canonicalEdgeCopy = deepCopyVisitor.visit(canonicalEdge, null);
+                        EdgeDescriptor canonicalEdgeCopyDescriptor = canonicalEdgeCopy.getEdgeDescriptor();
+                        VariableExpr edgeVariableCopy = graphixRewritingContext.getGraphixVariableCopy(edgeVariable);
+                        canonicalEdgeCopyDescriptor.setVariableExpr(edgeVariableCopy);
+                        canonicalEdgeListCopy.add(canonicalEdgeCopy);
+                        edgeIterator.add(canonicalEdgeCopy);
+                    }
+
+                    // Determine our new vertex list (we want to keep the order of our current vertex list).
+                    List<VertexPatternExpr> canonicalVertexListCopy = new ArrayList<>();
+                    ListIterator<VertexPatternExpr> pathPatternVertexIterator =
+                            pathPatternExpr.getVertexExpressions().listIterator();
+                    while (pathPatternVertexIterator.hasNext()) {
+                        VertexPatternExpr currentPathPatternVertex = pathPatternVertexIterator.next();
+                        VariableExpr currentVariable = currentPathPatternVertex.getVariableExpr();
+                        VariableExpr ambiguousLeftVar = ambiguousLeftVertex.getVariableExpr();
+                        VariableExpr ambiguousRightVar = ambiguousRightVertex.getVariableExpr();
+                        if (currentVariable.equals(ambiguousLeftVar)) {
+                            // Add canonical path vertices.
+                            List<VertexPatternExpr> canonicalVertices = canonicalPathPatternExpr.getVertexExpressions();
+                            for (VertexPatternExpr vertexExpr : canonicalVertices) {
+                                canonicalVertexListCopy.add(deepCopyVisitor.visit(vertexExpr, null));
+                                VariableExpr vertexVar = vertexExpr.getVariableExpr();
+                                if (!vertexVar.equals(ambiguousLeftVar) && !vertexVar.equals(ambiguousRightVar)) {
+                                    pathPatternVertexIterator.add(vertexExpr);
+                                }
+                            }
+                        }
+                    }
+
+                    // Build a new path record.
+                    RecordConstructor pathRecord = new RecordConstructor();
+                    pathRecord.setSourceLocation(workingEdge.getSourceLocation());
+                    buildPathRecord(canonicalVertexListCopy, canonicalEdgeListCopy, pathRecord);
+                    LetClause pathBinding = new LetClause(deepCopyVisitor.visit(edgeVariable, null), pathRecord);
+                    pathPatternExpr.getReboundSubPathList().add(pathBinding);
+
+                } else {
+                    if (workingEdge.getLeftVertex().equals(ambiguousLeftVertex)) {
+                        workingEdge.setLeftVertex(deepCopyVisitor.visit(canonicalLeftVertex, null));
+                    }
+                    if (workingEdge.getRightVertex().equals(ambiguousRightVertex)) {
+                        workingEdge.setRightVertex(deepCopyVisitor.visit(canonicalRightVertex, null));
+                    }
+                }
+            }
+
+            // Iterate through our vertex list.
+            replaceEdgeVerticesAndJoinCopiesInIterator(pathPatternExpr, ambiguousLeftVertex, ambiguousRightVertex,
+                    canonicalLeftVertex, canonicalRightVertex);
+        }
+    }
+
+    private void replaceEdgeVerticesAndJoinCopiesInIterator(PathPatternExpr pathPatternExpr,
+            VertexPatternExpr ambiguousLeftVertex, VertexPatternExpr ambiguousRightVertex,
+            VertexPatternExpr canonicalLeftVertex, VertexPatternExpr canonicalRightVertex) throws CompilationException {
+        List<VertexPatternExpr> vertexExpressions = pathPatternExpr.getVertexExpressions();
+        ListIterator<VertexPatternExpr> vertexIterator = vertexExpressions.listIterator();
+        Map<VertexPatternExpr, VertexPatternExpr> replacementVertexMap = new HashMap<>();
+        replacementVertexMap.put(ambiguousLeftVertex, canonicalLeftVertex);
+        replacementVertexMap.put(ambiguousRightVertex, canonicalRightVertex);
+        for (VertexPatternExpr vertexPatternExpr : vertexExpressions) {
+            if (vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class) != null) {
+                SubqueryVertexJoinAnnotation hint = vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                if (hint.getSourceVertexVariable().equals(ambiguousLeftVertex.getVariableExpr())) {
+                    VertexPatternExpr canonicalVertexCopy = deepCopyVisitor.visit(canonicalLeftVertex, null);
+                    canonicalVertexCopy.setVariableExpr(vertexPatternExpr.getVariableExpr());
+                    replacementVertexMap.put(vertexPatternExpr, canonicalVertexCopy);
+
+                } else if (hint.getSourceVertexVariable().equals(ambiguousRightVertex.getVariableExpr())) {
+                    VertexPatternExpr canonicalVertexCopy = deepCopyVisitor.visit(canonicalRightVertex, null);
+                    canonicalVertexCopy.setVariableExpr(vertexPatternExpr.getVariableExpr());
+                    replacementVertexMap.put(vertexPatternExpr, canonicalVertexCopy);
+                }
+            }
+        }
+        replaceVertexInIterator(replacementVertexMap, vertexIterator, deepCopyVisitor);
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementGeneratorFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementGeneratorFactory.java
new file mode 100644
index 0000000..5720660
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/CanonicalElementGeneratorFactory.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.canonical;
+
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.deepCopyPathPattern;
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.expandEdgeDirection;
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.expandFixedPathPattern;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.resolve.IInternalVertexSupplier;
+import org.apache.asterix.graphix.lang.rewrite.resolve.SchemaKnowledgeTable;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor.EdgeDirection;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+
+/**
+ * Generate a list of canonical {@link VertexPatternExpr}, {@link EdgePatternExpr}, or {@link PathPatternExpr}
+ * instances, given input {@link VertexPatternExpr} or {@link EdgePatternExpr}. We expect the input elements to have
+ * all unknowns resolved-- this pass is to generate canonical elements with the knowledge that each label / direction
+ * is possible according to our graph schema.
+ */
+public class CanonicalElementGeneratorFactory {
+    private final GraphixDeepCopyVisitor deepCopyVisitor;
+    private final SchemaKnowledgeTable schemaKnowledgeTable;
+    private final GraphixRewritingContext graphixRewritingContext;
+
+    public CanonicalElementGeneratorFactory(GraphixRewritingContext graphixRewritingContext,
+            SchemaKnowledgeTable schemaKnowledgeTable) {
+        this.deepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.schemaKnowledgeTable = schemaKnowledgeTable;
+    }
+
+    public List<VertexPatternExpr> generateCanonicalVertices(VertexPatternExpr vertexPatternExpr)
+            throws CompilationException {
+        List<VertexPatternExpr> canonicalVertexList = new ArrayList<>();
+        for (ElementLabel elementLabel : vertexPatternExpr.getLabels()) {
+            VertexPatternExpr vertexCopy = deepCopyVisitor.visit(vertexPatternExpr, null);
+            vertexCopy.getLabels().clear();
+            vertexCopy.getLabels().add(elementLabel);
+            canonicalVertexList.add(vertexCopy);
+        }
+        return canonicalVertexList;
+    }
+
+    public List<EdgePatternExpr> generateCanonicalEdges(EdgePatternExpr edgePatternExpr) throws CompilationException {
+        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+        VertexPatternExpr leftVertex = edgePatternExpr.getLeftVertex();
+        VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
+
+        // Each variable below represents a loop nesting.
+        Set<ElementLabel> edgeLabelList = edgeDescriptor.getEdgeLabels();
+        Set<ElementLabel> leftLabelList = leftVertex.getLabels();
+        Set<ElementLabel> rightLabelList = rightVertex.getLabels();
+        Set<EdgeDirection> directionList = expandEdgeDirection(edgeDescriptor);
+
+        List<EdgePatternExpr> canonicalEdgeList = new ArrayList<>();
+        for (ElementLabel edgeLabel : edgeLabelList) {
+            for (ElementLabel leftLabel : leftLabelList) {
+                for (ElementLabel rightLabel : rightLabelList) {
+                    for (EdgeDirection edgeDirection : directionList) {
+
+                        // Generate an edge according to our loop parameters.
+                        EdgePatternExpr edgeCopy = deepCopyVisitor.visit(edgePatternExpr, null);
+                        edgeCopy.getLeftVertex().getLabels().clear();
+                        edgeCopy.getRightVertex().getLabels().clear();
+                        edgeCopy.getEdgeDescriptor().getEdgeLabels().clear();
+                        edgeCopy.getLeftVertex().getLabels().add(leftLabel);
+                        edgeCopy.getRightVertex().getLabels().add(rightLabel);
+                        edgeCopy.getEdgeDescriptor().getEdgeLabels().add(edgeLabel);
+                        edgeCopy.getEdgeDescriptor().setEdgeDirection(edgeDirection);
+
+                        // If we have a valid edge, insert this into our list.
+                        if (schemaKnowledgeTable.isValidEdge(edgeCopy)) {
+                            canonicalEdgeList.add(edgeCopy);
+                        }
+                    }
+                }
+            }
+        }
+        return canonicalEdgeList;
+    }
+
+    public List<PathPatternExpr> generateCanonicalPaths(EdgePatternExpr edgePatternExpr,
+            boolean minimizeExpansionLength) throws CompilationException {
+        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+        VertexPatternExpr leftVertex = edgePatternExpr.getLeftVertex();
+        VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
+        VertexPatternExpr internalVertex = edgePatternExpr.getInternalVertex();
+
+        // Each variable below represents a loop nesting.
+        Set<ElementLabel> edgeLabelList = edgeDescriptor.getEdgeLabels();
+        Set<ElementLabel> leftLabelList = leftVertex.getLabels();
+        Set<ElementLabel> rightLabelList = rightVertex.getLabels();
+        Set<EdgeDirection> directionList = expandEdgeDirection(edgeDescriptor);
+        Set<ElementLabel> internalLabelList = internalVertex.getLabels();
+
+        // Determine the length of **expanded** path. For {N,M} w/ E labels... MIN(M, (1 + 2(E-1))).
+        int minimumExpansionLength, expansionLength;
+        if (minimizeExpansionLength) {
+            int maximumExpansionLength = 1 + 2 * (edgeLabelList.size() - 1);
+            minimumExpansionLength = Objects.requireNonNullElse(edgeDescriptor.getMinimumHops(), 1);
+            expansionLength = Objects.requireNonNullElse(edgeDescriptor.getMaximumHops(), maximumExpansionLength);
+            if (minimumExpansionLength > expansionLength) {
+                minimumExpansionLength = expansionLength;
+            }
+
+        } else {
+            minimumExpansionLength = Objects.requireNonNullElse(edgeDescriptor.getMinimumHops(), 1);
+            expansionLength = edgeDescriptor.getMaximumHops();
+        }
+
+        // Generate all valid paths, from minimumExpansionLength to maximumExpansionLength.
+        List<List<EdgePatternExpr>> canonicalPathList = new ArrayList<>();
+        IInternalVertexSupplier internalVertexSupplier = () -> {
+            VertexPatternExpr internalVertexCopy = deepCopyVisitor.visit(internalVertex, null);
+            VariableExpr internalVariable = internalVertex.getVariableExpr();
+            VariableExpr internalVariableCopy = graphixRewritingContext.getGraphixVariableCopy(internalVariable);
+            internalVertexCopy.setVariableExpr(internalVariableCopy);
+            return internalVertexCopy;
+        };
+        for (int pathLength = minimumExpansionLength; pathLength <= expansionLength; pathLength++) {
+            List<List<EdgePatternExpr>> expandedPathPattern = expandFixedPathPattern(pathLength, edgePatternExpr,
+                    edgeLabelList, internalLabelList, directionList, deepCopyVisitor, internalVertexSupplier);
+            for (List<EdgePatternExpr> pathPattern : expandedPathPattern) {
+                for (ElementLabel leftLabel : leftLabelList) {
+                    for (ElementLabel rightLabel : rightLabelList) {
+                        List<EdgePatternExpr> pathCopy = deepCopyPathPattern(pathPattern, deepCopyVisitor);
+
+                        // Set the labels of our leftmost vertex...
+                        pathCopy.get(0).getLeftVertex().getLabels().clear();
+                        pathCopy.get(0).getLeftVertex().getLabels().add(leftLabel);
+
+                        // ...and our rightmost vertex.
+                        pathCopy.get(pathCopy.size() - 1).getRightVertex().getLabels().clear();
+                        pathCopy.get(pathCopy.size() - 1).getRightVertex().getLabels().add(rightLabel);
+
+                        // Add our path if all edges are valid.
+                        if (pathCopy.stream().allMatch(schemaKnowledgeTable::isValidEdge)) {
+                            canonicalPathList.add(pathCopy);
+                        }
+                    }
+                }
+            }
+        }
+
+        // Wrap our edge lists into path patterns.
+        List<PathPatternExpr> pathPatternList = new ArrayList<>();
+        for (List<EdgePatternExpr> edgeList : canonicalPathList) {
+            List<VertexPatternExpr> vertexList = new ArrayList<>();
+            edgeList.forEach(e -> {
+                vertexList.add(e.getLeftVertex());
+                vertexList.add(e.getRightVertex());
+            });
+            VariableExpr variableExpr = deepCopyVisitor.visit(edgeDescriptor.getVariableExpr(), null);
+            PathPatternExpr pathPatternExpr = new PathPatternExpr(vertexList, edgeList, variableExpr);
+            pathPatternExpr.setSourceLocation(edgePatternExpr.getSourceLocation());
+            pathPatternList.add(pathPatternExpr);
+        }
+        return pathPatternList;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/ICanonicalExpander.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/ICanonicalElementConsumer.java
similarity index 74%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/ICanonicalExpander.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/ICanonicalElementConsumer.java
index 65f42e5..2392423 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/ICanonicalExpander.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/canonical/ICanonicalElementConsumer.java
@@ -16,14 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.canonical;
+package org.apache.asterix.graphix.lang.rewrite.canonical;
 
 import java.util.List;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 
 @FunctionalInterface
-public interface ICanonicalExpander<T> {
-    void apply(T patternExpr, List<GraphSelectBlock> inputSelectBlocks) throws CompilationException;
+public interface ICanonicalElementConsumer {
+    void accept(AbstractExpression ambiguousElement, List<? extends AbstractExpression> canonicalElements)
+            throws CompilationException;
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/common/BranchLookupTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/common/BranchLookupTable.java
new file mode 100644
index 0000000..a21e04a
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/common/BranchLookupTable.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.common;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+
+/**
+ * Lookup table for branch (i.e. partial {@link EdgePatternExpr} instances that define FA transition functions)--
+ * indexed by {@link EdgePatternExpr} instances.
+ */
+public class BranchLookupTable {
+    private final Map<EdgePatternExpr, List<EdgePatternExpr>> branchEdgeMap = new HashMap<>();
+
+    public void putBranch(EdgePatternExpr associatedEdge, EdgePatternExpr branch) {
+        branchEdgeMap.putIfAbsent(associatedEdge, new ArrayList<>());
+        branchEdgeMap.get(associatedEdge).add(branch);
+    }
+
+    public void putBranch(EdgePatternExpr associatedEdge, PathPatternExpr branch) {
+        branchEdgeMap.putIfAbsent(associatedEdge, new ArrayList<>());
+        branchEdgeMap.get(associatedEdge).addAll(branch.getEdgeExpressions());
+    }
+
+    public List<EdgePatternExpr> getBranches(EdgePatternExpr associatedEdge) {
+        return branchEdgeMap.get(associatedEdge);
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/common/ElementLookupTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/common/ElementLookupTable.java
new file mode 100644
index 0000000..bf1eb62
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/common/ElementLookupTable.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.common;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
+import org.apache.asterix.graphix.common.metadata.IElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
+import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
+
+/**
+ * Lookup table for {@link GraphElementDeclaration} instances, vertex keys, edge destination keys, and edge source
+ * keys-- indexed by {@link IElementIdentifier} instances.
+ */
+public class ElementLookupTable implements Iterable<GraphElementDeclaration> {
+    private final Map<IElementIdentifier, GraphElementDeclaration> graphElementDeclMap = new HashMap<>();
+    private final Map<VertexIdentifier, List<List<String>>> vertexKeyMap = new HashMap<>();
+    private final Map<EdgeIdentifier, List<List<String>>> edgeDestKeysMap = new HashMap<>();
+    private final Map<EdgeIdentifier, List<List<String>>> edgeSourceKeysMap = new HashMap<>();
+
+    public void put(IElementIdentifier identifier, GraphElementDeclaration graphElementDeclaration) {
+        graphElementDeclMap.put(identifier, graphElementDeclaration);
+    }
+
+    public void putVertexKey(VertexIdentifier identifier, List<List<String>> primaryKey) {
+        vertexKeyMap.put(identifier, primaryKey);
+    }
+
+    public void putEdgeKeys(EdgeIdentifier identifier, List<List<String>> sourceKey,
+            List<List<String>> destinationKey) {
+        edgeSourceKeysMap.put(identifier, sourceKey);
+        edgeDestKeysMap.put(identifier, destinationKey);
+    }
+
+    public GraphElementDeclaration getElementDecl(IElementIdentifier identifier) {
+        return graphElementDeclMap.get(identifier);
+    }
+
+    public List<List<String>> getVertexKey(VertexIdentifier identifier) {
+        return vertexKeyMap.get(identifier);
+    }
+
+    public List<List<String>> getEdgeDestKey(EdgeIdentifier identifier) {
+        return edgeDestKeysMap.get(identifier);
+    }
+
+    public List<List<String>> getEdgeSourceKey(EdgeIdentifier identifier) {
+        return edgeSourceKeysMap.get(identifier);
+    }
+
+    @Override
+    public Iterator<GraphElementDeclaration> iterator() {
+        return graphElementDeclMap.values().iterator();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/AliasLookupTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/AliasLookupTable.java
new file mode 100644
index 0000000..d16e85d
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/AliasLookupTable.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+
+/**
+ * Lookup table for JOIN and ITERATION aliases, indexed by their representative (i.e. element) variables.
+ */
+public class AliasLookupTable {
+    private final GraphixDeepCopyVisitor deepCopyVisitor = new GraphixDeepCopyVisitor();
+    private final Map<VariableExpr, VariableExpr> joinAliasMap = new HashMap<>();
+    private final Map<VariableExpr, VariableExpr> iterationAliasMap = new HashMap<>();
+
+    public void addJoinAlias(VariableExpr elementVariable, VariableExpr aliasVariable) {
+        joinAliasMap.put(elementVariable, aliasVariable);
+    }
+
+    public void addIterationAlias(VariableExpr elementVariable, VariableExpr aliasVariable) {
+        iterationAliasMap.put(elementVariable, aliasVariable);
+    }
+
+    public VariableExpr getJoinAlias(VariableExpr elementVariable) throws CompilationException {
+        if (joinAliasMap.containsKey(elementVariable)) {
+            return deepCopyVisitor.visit(joinAliasMap.get(elementVariable), null);
+        }
+        return null;
+    }
+
+    public VariableExpr getIterationAlias(VariableExpr elementVariable) throws CompilationException {
+        if (iterationAliasMap.containsKey(elementVariable)) {
+            return deepCopyVisitor.visit(iterationAliasMap.get(elementVariable), null);
+        }
+        return null;
+    }
+
+    public void reset() {
+        joinAliasMap.clear();
+        iterationAliasMap.clear();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/EnvironmentActionFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/EnvironmentActionFactory.java
new file mode 100644
index 0000000..66f3f0e
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/EnvironmentActionFactory.java
@@ -0,0 +1,692 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower;
+
+import static org.apache.asterix.graphix.lang.rewrite.util.LowerRewritingUtil.buildAccessorList;
+import static org.apache.asterix.graphix.lang.rewrite.util.LowerRewritingUtil.buildVertexEdgeJoin;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.common.metadata.IElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
+import org.apache.asterix.graphix.lang.annotation.LoweringExemptAnnotation;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.AbstractInlineAction;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.IEnvironmentAction;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.MatchSemanticAction;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.PathPatternAction;
+import org.apache.asterix.graphix.lang.rewrite.visitor.ElementBodyAnalysisVisitor.ElementBodyAnalysisContext;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.VariableRemapCloneVisitor;
+import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.clause.WhereClause;
+import org.apache.asterix.lang.common.expression.CallExpr;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.literal.TrueLiteral;
+import org.apache.asterix.lang.sqlpp.clause.JoinClause;
+import org.apache.asterix.lang.sqlpp.optype.JoinType;
+import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
+
+/**
+ * Build {@link IEnvironmentAction} instances to manipulate a {@link LoweringEnvironment}.
+ */
+public class EnvironmentActionFactory {
+    private final Map<IElementIdentifier, ElementBodyAnalysisContext> analysisContextMap;
+    private final ElementLookupTable elementLookupTable;
+    private final AliasLookupTable aliasLookupTable;
+    private final GraphixRewritingContext graphixRewritingContext;
+    private final VariableRemapCloneVisitor remapCloneVisitor;
+    private final GraphixDeepCopyVisitor graphixDeepCopyVisitor;
+
+    // The following must be provided before any creation methods are used.
+    private GraphIdentifier graphIdentifier;
+
+    public EnvironmentActionFactory(Map<IElementIdentifier, ElementBodyAnalysisContext> analysisContextMap,
+            ElementLookupTable elementLookupTable, AliasLookupTable aliasLookupTable,
+            GraphixRewritingContext graphixRewritingContext) {
+        this.analysisContextMap = analysisContextMap;
+        this.elementLookupTable = elementLookupTable;
+        this.aliasLookupTable = aliasLookupTable;
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.graphixDeepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.remapCloneVisitor = new VariableRemapCloneVisitor(graphixRewritingContext);
+    }
+
+    public void reset(GraphIdentifier graphIdentifier) {
+        this.aliasLookupTable.reset();
+        this.graphIdentifier = graphIdentifier;
+    }
+
+    /**
+     * @see PathPatternAction
+     */
+    public IEnvironmentAction buildPathPatternAction(PathPatternExpr pathPatternExpr) {
+        return new PathPatternAction(pathPatternExpr);
+    }
+
+    /**
+     * @see MatchSemanticAction
+     */
+    public IEnvironmentAction buildMatchSemanticAction(FromGraphClause fromGraphClause) throws CompilationException {
+        return new MatchSemanticAction(graphixRewritingContext, fromGraphClause, aliasLookupTable);
+    }
+
+    /**
+     * Build an {@link IEnvironmentAction} to introduce a WHERE clause into an environment with the given expression.
+     */
+    public IEnvironmentAction buildFilterExprAction(Expression filterExpr, VariableExpr elementVariable,
+            VariableExpr iterationVariable) throws CompilationException {
+        VariableExpr iterationVarCopy = graphixDeepCopyVisitor.visit(iterationVariable, null);
+        VariableExpr elementVarCopy = graphixDeepCopyVisitor.visit(elementVariable, null);
+        iterationVarCopy.setSourceLocation(filterExpr.getSourceLocation());
+        remapCloneVisitor.addSubstitution(elementVarCopy, iterationVarCopy);
+        return loweringEnvironment -> loweringEnvironment.acceptTransformer(lowerList -> {
+            ILangExpression remapCopyFilterExpr = remapCloneVisitor.substitute(filterExpr);
+            WhereClause filterWhereClause = new WhereClause((Expression) remapCopyFilterExpr);
+            filterWhereClause.setSourceLocation(filterExpr.getSourceLocation());
+            lowerList.addNonRepresentativeClause(filterWhereClause);
+            remapCloneVisitor.resetSubstitutions();
+        });
+    }
+
+    /**
+     * Build an {@link IEnvironmentAction} to handle a dangling vertex / vertex that is (currently) disconnected.
+     * Even though we introduce CROSS-JOINs here, we will not actually perform this CROSS-JOIN if this is the first
+     * vertex we are lowering. There are three possible {@link IEnvironmentAction}s generated here:
+     * <ul>
+     *  <li>An action for inlined vertices that have no projections.</li>
+     *  <li>An action for inlined vertices with projections.</li>
+     *  <li>An action for non-inlined vertices.</li>
+     * </ul>
+     */
+    public IEnvironmentAction buildDanglingVertexAction(VertexPatternExpr vertexPatternExpr)
+            throws CompilationException {
+        if (vertexPatternExpr.findHint(LoweringExemptAnnotation.class) == LoweringExemptAnnotation.INSTANCE) {
+            return loweringEnvironment -> {
+            };
+        }
+        VariableExpr vertexVar = vertexPatternExpr.getVariableExpr();
+        VariableExpr iterationVar = graphixRewritingContext.getGraphixVariableCopy(vertexVar);
+        VariableExpr intermediateVar = graphixRewritingContext.getGraphixVariableCopy(vertexVar);
+
+        // We should only be working with one identifier (given that we only have one label).
+        List<VertexIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
+        if (vertexElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
+        }
+        VertexIdentifier vertexIdentifier = vertexElementIDs.get(0);
+        ElementBodyAnalysisContext vertexAnalysisContext = analysisContextMap.get(vertexIdentifier);
+        if (vertexAnalysisContext.isExpressionInline() && vertexAnalysisContext.isSelectClauseInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // Introduce our iteration expression.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        CallExpr datasetCallExpression = vertexAnalysisContext.getDatasetCallExpression();
+                        VariableExpr iterationVarCopy = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression, iterationVarCopy,
+                                null, new LiteralExpr(TrueLiteral.INSTANCE), null);
+                        joinClause.setSourceLocation(vertexPatternExpr.getSourceLocation());
+                        lowerList.addNonRepresentativeClause(joinClause);
+                    });
+
+                    // Inline our vertex body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = vertexPatternExpr.getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, vertexVar, iterationVar));
+                    }
+
+                    // Bind our intermediate (join) variable and vertex variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        VariableExpr vertexVarCopy = graphixDeepCopyVisitor.visit(vertexVar, null);
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, iterationVarCopy1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addVertexBinding(vertexVarCopy, iterationVarCopy2);
+                    });
+                    aliasLookupTable.addIterationAlias(vertexVar, iterationVar);
+                    aliasLookupTable.addJoinAlias(vertexVar, intermediateVar);
+                }
+            };
+
+        } else if (vertexAnalysisContext.isExpressionInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // Introduce our iteration expression.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        CallExpr datasetCallExpression = vertexAnalysisContext.getDatasetCallExpression();
+                        VariableExpr iterationVarCopy = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression, iterationVarCopy,
+                                null, new LiteralExpr(TrueLiteral.INSTANCE), null);
+                        joinClause.setSourceLocation(vertexPatternExpr.getSourceLocation());
+                        lowerList.addNonRepresentativeClause(joinClause);
+                    });
+
+                    // Inline our vertex body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = vertexPatternExpr.getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, vertexVar, iterationVar));
+                    }
+
+                    // Build a record constructor from our context to bind to our vertex variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        RecordConstructor recordConstructor1 = buildRecordConstructor();
+                        RecordConstructor recordConstructor2 = buildRecordConstructor();
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, recordConstructor1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addVertexBinding(vertexVar, recordConstructor2);
+                    });
+                    aliasLookupTable.addIterationAlias(vertexVar, iterationVar);
+                    aliasLookupTable.addJoinAlias(vertexVar, intermediateVar);
+                }
+            };
+
+        } else {
+            GraphElementDeclaration elementDeclaration = elementLookupTable.getElementDecl(vertexIdentifier);
+            return loweringEnvironment -> {
+                // Introduce our iteration expression.
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    ILangExpression declBodyCopy = SqlppRewriteUtil.deepCopy(elementDeclaration.getNormalizedBody());
+                    VariableExpr iterationVarCopy = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    JoinClause joinClause = new JoinClause(JoinType.INNER, (Expression) declBodyCopy, iterationVarCopy,
+                            null, new LiteralExpr(TrueLiteral.INSTANCE), null);
+                    joinClause.setSourceLocation(vertexPatternExpr.getSourceLocation());
+                    lowerList.addNonRepresentativeClause(joinClause);
+                });
+
+                // If we have a filter expression, add it as a WHERE clause here.
+                final Expression filterExpr = vertexPatternExpr.getFilterExpr();
+                if (filterExpr != null) {
+                    loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, vertexVar, iterationVar));
+                }
+
+                // Bind our intermediate (join) variable and vertex variable.
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                    LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, iterationVarCopy1);
+                    lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                    lowerList.addVertexBinding(vertexVar, iterationVarCopy2);
+                });
+                aliasLookupTable.addIterationAlias(vertexVar, iterationVar);
+                aliasLookupTable.addJoinAlias(vertexVar, intermediateVar);
+            };
+        }
+    }
+
+    /**
+     * Build an {@link IEnvironmentAction} to handle an edge that we can fold into (attach from) an already introduced
+     * vertex. A folded edge is implicitly inlined. There are two possible {@link IEnvironmentAction}s generated here:
+     * <ul>
+     *  <li>An action for inlined, folded edges that have no projections.</li>
+     *  <li>An action for inlined, folded edges that have projections.</li>
+     * </ul>
+     */
+    public IEnvironmentAction buildFoldedEdgeAction(VertexPatternExpr vertexPatternExpr,
+            EdgePatternExpr edgePatternExpr) throws CompilationException {
+        VariableExpr vertexVar = vertexPatternExpr.getVariableExpr();
+        VariableExpr edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr();
+        VariableExpr intermediateVar = graphixRewritingContext.getGraphixVariableCopy(edgeVar);
+
+        // We should only be working with one identifier (given that we only have one label).
+        List<EdgeIdentifier> edgeElementIDs = edgePatternExpr.generateIdentifiers(graphIdentifier);
+        if (edgeElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
+        }
+        EdgeIdentifier edgeIdentifier = edgeElementIDs.get(0);
+        ElementBodyAnalysisContext edgeAnalysisContext = analysisContextMap.get(edgeIdentifier);
+        if (edgeAnalysisContext.isSelectClauseInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, null) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // We want to bind directly to the iteration variable of our vertex, not the join variable.
+                    elementVariable = aliasLookupTable.getIterationAlias(vertexVar);
+
+                    // Inline our edge body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = edgePatternExpr.getEdgeDescriptor().getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, edgeVar, elementVariable));
+                    }
+
+                    // Build a binding for our edge variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr elementVarCopy1 = graphixDeepCopyVisitor.visit(elementVariable, null);
+                        VariableExpr elementVarCopy2 = graphixDeepCopyVisitor.visit(elementVariable, null);
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, elementVarCopy1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addEdgeBinding(edgeVar, elementVarCopy2);
+                    });
+                    aliasLookupTable.addIterationAlias(edgeVar, elementVariable);
+                    aliasLookupTable.addJoinAlias(edgeVar, intermediateVar);
+                }
+            };
+
+        } else {
+            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, null) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // We want to bind directly to the iteration variable of our vertex, not the join variable.
+                    elementVariable = aliasLookupTable.getIterationAlias(vertexVar);
+
+                    // Inline our edge body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = edgePatternExpr.getEdgeDescriptor().getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, edgeVar, elementVariable));
+                    }
+
+                    // Build a record constructor from our context to bind to our edge and intermediate (join) var.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        RecordConstructor recordConstructor1 = buildRecordConstructor();
+                        RecordConstructor recordConstructor2 = buildRecordConstructor();
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, recordConstructor1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addEdgeBinding(edgeVar, recordConstructor2);
+                    });
+                    aliasLookupTable.addIterationAlias(edgeVar, elementVariable);
+                    aliasLookupTable.addJoinAlias(edgeVar, intermediateVar);
+                }
+            };
+        }
+    }
+
+    /**
+     * Build an {@link IEnvironmentAction} to handle an edge that we cannot fold into an already introduced vertex.
+     * There are three possible {@link IEnvironmentAction}s generated here:
+     * <ul>
+     *  <li>An action for inlined edges that have no projections.</li>
+     *  <li>An action for inlined edges that have projections.</li>
+     *  <li>An action for non-inlined edges.</li>
+     * </ul>
+     */
+    public IEnvironmentAction buildNonFoldedEdgeAction(VertexPatternExpr vertexPatternExpr,
+            EdgePatternExpr edgePatternExpr, Function<EdgeIdentifier, List<List<String>>> edgeKeyAccess)
+            throws CompilationException {
+        VariableExpr edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr();
+        VariableExpr vertexVar = vertexPatternExpr.getVariableExpr();
+        VariableExpr iterationVar = graphixRewritingContext.getGraphixVariableCopy(edgeVar);
+        VariableExpr intermediateVar = graphixRewritingContext.getGraphixVariableCopy(edgeVar);
+
+        // We should only be working with one edge identifier...
+        List<EdgeIdentifier> edgeElementIDs = edgePatternExpr.generateIdentifiers(graphIdentifier);
+        if (edgeElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
+        }
+        EdgeIdentifier edgeIdentifier = edgeElementIDs.get(0);
+        ElementBodyAnalysisContext edgeAnalysisContext = analysisContextMap.get(edgeIdentifier);
+        Expression datasetCallExpression = edgeAnalysisContext.getDatasetCallExpression();
+
+        // ...and only one vertex identifier (given that we only have one label).
+        List<VertexIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
+        if (vertexElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
+        }
+        VertexIdentifier vertexIdentifier = vertexElementIDs.get(0);
+        if (edgeAnalysisContext.isExpressionInline() && edgeAnalysisContext.isSelectClauseInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, iterationVar) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // Join our edge iteration variable to our vertex variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr vertexJoinExpr = aliasLookupTable.getJoinAlias(vertexVar);
+                        VariableExpr vertexVarCopy = graphixDeepCopyVisitor.visit(vertexJoinExpr, null);
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                                buildAccessorList(vertexVarCopy, elementLookupTable.getVertexKey(vertexIdentifier)),
+                                buildAccessorList(iterationVarCopy1, edgeKeyAccess.apply(edgeIdentifier)));
+                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression, iterationVarCopy2,
+                                null, vertexEdgeJoin, null);
+                        joinClause.setSourceLocation(edgePatternExpr.getSourceLocation());
+                        lowerList.addNonRepresentativeClause(joinClause);
+                    });
+
+                    // Inline our edge body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = edgePatternExpr.getEdgeDescriptor().getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, edgeVar, iterationVar));
+                    }
+
+                    // Bind our intermediate (join) variable and edge variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, iterationVarCopy1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addEdgeBinding(edgeVar, iterationVarCopy2);
+                    });
+                    aliasLookupTable.addIterationAlias(edgeVar, iterationVar);
+                    aliasLookupTable.addJoinAlias(edgeVar, intermediateVar);
+                }
+            };
+
+        } else if (edgeAnalysisContext.isExpressionInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, iterationVar) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // Join our edge iteration variable to our vertex variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr vertexJoinExpr = aliasLookupTable.getJoinAlias(vertexVar);
+                        VariableExpr vertexVarCopy = graphixDeepCopyVisitor.visit(vertexJoinExpr, null);
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                                buildAccessorList(vertexVarCopy, elementLookupTable.getVertexKey(vertexIdentifier)),
+                                buildAccessorList(iterationVarCopy1, edgeKeyAccess.apply(edgeIdentifier)));
+                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression, iterationVarCopy2,
+                                null, vertexEdgeJoin, null);
+                        joinClause.setSourceLocation(edgePatternExpr.getSourceLocation());
+                        lowerList.addNonRepresentativeClause(joinClause);
+                    });
+
+                    // Inline our edge body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = edgePatternExpr.getEdgeDescriptor().getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, edgeVar, iterationVar));
+                    }
+
+                    // Build a record constructor from our context to bind to our edge variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        RecordConstructor recordConstructor1 = buildRecordConstructor();
+                        RecordConstructor recordConstructor2 = buildRecordConstructor();
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, recordConstructor1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addEdgeBinding(edgeVar, recordConstructor2);
+                    });
+                    aliasLookupTable.addIterationAlias(edgeVar, iterationVar);
+                    aliasLookupTable.addJoinAlias(edgeVar, intermediateVar);
+                }
+            };
+
+        } else {
+            GraphElementDeclaration elementDeclaration = elementLookupTable.getElementDecl(edgeIdentifier);
+            return loweringEnvironment -> {
+                // Join our edge body to our vertex variable.
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    VariableExpr vertexJoinExpr = aliasLookupTable.getJoinAlias(vertexVar);
+                    VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                            buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
+                            buildAccessorList(iterationVarCopy1, edgeKeyAccess.apply(edgeIdentifier)));
+                    ILangExpression declBodyCopy = SqlppRewriteUtil.deepCopy(elementDeclaration.getNormalizedBody());
+                    JoinClause joinClause = new JoinClause(JoinType.INNER, (Expression) declBodyCopy, iterationVarCopy2,
+                            null, vertexEdgeJoin, null);
+                    joinClause.setSourceLocation(edgePatternExpr.getSourceLocation());
+                    lowerList.addNonRepresentativeClause(joinClause);
+                });
+
+                // If we have a filter expression, add it as a WHERE clause here.
+                final Expression filterExpr = edgePatternExpr.getEdgeDescriptor().getFilterExpr();
+                if (filterExpr != null) {
+                    loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, edgeVar, iterationVar));
+                }
+
+                // Bind our intermediate (join) variable and edge variable.
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                    LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, iterationVarCopy1);
+                    lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                    lowerList.addEdgeBinding(edgeVar, iterationVarCopy2);
+                });
+                aliasLookupTable.addIterationAlias(edgeVar, iterationVar);
+                aliasLookupTable.addJoinAlias(edgeVar, intermediateVar);
+            };
+        }
+    }
+
+    /**
+     * Build an {@link IEnvironmentAction} to introduce a WHERE-CLAUSE that will correlate a vertex and edge.
+     */
+    public IEnvironmentAction buildRawJoinVertexAction(VertexPatternExpr vertexPatternExpr,
+            EdgePatternExpr edgePatternExpr, Function<EdgeIdentifier, List<List<String>>> edgeKeyAccess)
+            throws CompilationException {
+        VariableExpr edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr();
+        VariableExpr vertexVar = vertexPatternExpr.getVariableExpr();
+
+        // We should only be working with one edge identifier...
+        List<EdgeIdentifier> edgeElementIDs = edgePatternExpr.generateIdentifiers(graphIdentifier);
+        if (edgeElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
+        }
+        EdgeIdentifier edgeIdentifier = edgeElementIDs.get(0);
+
+        // ...and only one vertex identifier (given that we only have one label).
+        List<VertexIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
+        if (vertexElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
+        }
+        VertexIdentifier vertexIdentifier = vertexElementIDs.get(0);
+        return loweringEnvironment -> {
+            // No aliases need to be introduced, we just need to add a WHERE-CONJUNCT.
+            VariableExpr edgeJoinExpr = aliasLookupTable.getJoinAlias(edgeVar);
+            VariableExpr vertexJoinExpr = aliasLookupTable.getJoinAlias(vertexVar);
+            VariableExpr edgeJoinExprCopy = graphixDeepCopyVisitor.visit(edgeJoinExpr, null);
+            VariableExpr vertexJoinExprCopy = graphixDeepCopyVisitor.visit(vertexJoinExpr, null);
+            loweringEnvironment.acceptTransformer(lowerList -> {
+                Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                        buildAccessorList(vertexJoinExprCopy, elementLookupTable.getVertexKey(vertexIdentifier)),
+                        buildAccessorList(edgeJoinExprCopy, edgeKeyAccess.apply(edgeIdentifier)));
+                WhereClause whereClause = new WhereClause(vertexEdgeJoin);
+                whereClause.setSourceLocation(edgePatternExpr.getSourceLocation());
+                lowerList.addNonRepresentativeClause(whereClause);
+            });
+        };
+    }
+
+    /**
+     * Build an {@link IEnvironmentAction} to handle a vertex that is bound to an existing (already introduced) edge.
+     * There are three possible {@link IEnvironmentAction}s generated here:
+     * <ul>
+     *  <li>An action for inlined vertices that have no projections.</li>
+     *  <li>An action for inlined vertices that have projections.</li>
+     *  <li>An action for non-inlined vertices.</li>
+     * </ul>
+     */
+    public IEnvironmentAction buildBoundVertexAction(VertexPatternExpr vertexPatternExpr,
+            EdgePatternExpr edgePatternExpr, Function<EdgeIdentifier, List<List<String>>> edgeKeyAccess)
+            throws CompilationException {
+        VariableExpr edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr();
+        VariableExpr vertexVar = vertexPatternExpr.getVariableExpr();
+        VariableExpr iterationVar = graphixRewritingContext.getGraphixVariableCopy(vertexVar);
+        VariableExpr intermediateVar = graphixRewritingContext.getGraphixVariableCopy(vertexVar);
+
+        // We should only be working with one edge identifier...
+        List<EdgeIdentifier> edgeElementIDs = edgePatternExpr.generateIdentifiers(graphIdentifier);
+        if (edgeElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
+        }
+        EdgeIdentifier edgeIdentifier = edgeElementIDs.get(0);
+
+        // ...and only one vertex identifier (given that we only have one label).
+        List<VertexIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
+        if (vertexElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
+        }
+        VertexIdentifier vertexIdentifier = vertexElementIDs.get(0);
+        ElementBodyAnalysisContext vertexAnalysisContext = analysisContextMap.get(vertexIdentifier);
+        Expression datasetCallExpression = vertexAnalysisContext.getDatasetCallExpression();
+        if (vertexAnalysisContext.isExpressionInline() && vertexAnalysisContext.isSelectClauseInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // Join our vertex iteration variable to our edge variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr edgeJoinExpr = aliasLookupTable.getJoinAlias(edgeVar);
+                        VariableExpr edgeJoinCopy = graphixDeepCopyVisitor.visit(edgeJoinExpr, null);
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                                buildAccessorList(iterationVarCopy1, elementLookupTable.getVertexKey(vertexIdentifier)),
+                                buildAccessorList(edgeJoinCopy, edgeKeyAccess.apply(edgeIdentifier)));
+                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression, iterationVarCopy2,
+                                null, vertexEdgeJoin, null);
+                        joinClause.setSourceLocation(vertexPatternExpr.getSourceLocation());
+                        lowerList.addNonRepresentativeClause(joinClause);
+                    });
+
+                    // Inline our vertex body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = vertexPatternExpr.getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, vertexVar, iterationVar));
+                    }
+
+                    // Bind our intermediate (join) variable and vertex variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, iterationVarCopy1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addVertexBinding(vertexVar, iterationVarCopy2);
+                    });
+                    aliasLookupTable.addIterationAlias(vertexVar, iterationVar);
+                    aliasLookupTable.addJoinAlias(vertexVar, intermediateVar);
+                }
+            };
+
+        } else if (vertexAnalysisContext.isExpressionInline()) {
+            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
+                @Override
+                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+                    // Join our vertex iteration variable to our edge variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr edgeJoinExpr = aliasLookupTable.getJoinAlias(edgeVar);
+                        VariableExpr edgeJoinCopy = graphixDeepCopyVisitor.visit(edgeJoinExpr, null);
+                        VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                                buildAccessorList(iterationVarCopy1, elementLookupTable.getVertexKey(vertexIdentifier)),
+                                buildAccessorList(edgeJoinCopy, edgeKeyAccess.apply(edgeIdentifier)));
+                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression, iterationVarCopy2,
+                                null, vertexEdgeJoin, null);
+                        joinClause.setSourceLocation(vertexPatternExpr.getSourceLocation());
+                        lowerList.addNonRepresentativeClause(joinClause);
+                    });
+
+                    // Inline our vertex body.
+                    super.apply(loweringEnvironment);
+
+                    // If we have a filter expression, add it as a WHERE clause here.
+                    final Expression filterExpr = vertexPatternExpr.getFilterExpr();
+                    if (filterExpr != null) {
+                        loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, vertexVar, iterationVar));
+                    }
+
+                    // Build a record constructor from our context to bind to our vertex variable.
+                    loweringEnvironment.acceptTransformer(lowerList -> {
+                        VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                        RecordConstructor recordConstructor1 = buildRecordConstructor();
+                        RecordConstructor recordConstructor2 = buildRecordConstructor();
+                        LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, recordConstructor1);
+                        lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                        lowerList.addVertexBinding(vertexVar, recordConstructor2);
+                    });
+                    aliasLookupTable.addIterationAlias(vertexVar, iterationVar);
+                    aliasLookupTable.addJoinAlias(vertexVar, intermediateVar);
+                }
+            };
+
+        } else {
+            GraphElementDeclaration elementDeclaration = elementLookupTable.getElementDecl(vertexIdentifier);
+            return loweringEnvironment -> {
+                // Join our vertex body to our edge variable.
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    VariableExpr edgeJoinExpr = aliasLookupTable.getJoinAlias(edgeVar);
+                    VariableExpr edgeJoinCopy = graphixDeepCopyVisitor.visit(edgeJoinExpr, null);
+                    VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    Expression vertexEdgeJoin = buildVertexEdgeJoin(
+                            buildAccessorList(iterationVarCopy1, elementLookupTable.getVertexKey(vertexIdentifier)),
+                            buildAccessorList(edgeJoinCopy, edgeKeyAccess.apply(edgeIdentifier)));
+                    ILangExpression declBodyCopy = SqlppRewriteUtil.deepCopy(elementDeclaration.getNormalizedBody());
+                    JoinClause joinClause = new JoinClause(JoinType.INNER, (Expression) declBodyCopy, iterationVarCopy2,
+                            null, vertexEdgeJoin, null);
+                    joinClause.setSourceLocation(vertexPatternExpr.getSourceLocation());
+                    lowerList.addNonRepresentativeClause(joinClause);
+                });
+
+                // If we have a filter expression, add it as a WHERE clause here.
+                final Expression filterExpr = vertexPatternExpr.getFilterExpr();
+                if (filterExpr != null) {
+                    loweringEnvironment.acceptAction(buildFilterExprAction(filterExpr, vertexVar, iterationVar));
+                }
+
+                // Bind our intermediate (join) variable and vertex variable.
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    VariableExpr iterationVarCopy1 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr iterationVarCopy2 = graphixDeepCopyVisitor.visit(iterationVar, null);
+                    VariableExpr intermediateVarCopy = graphixDeepCopyVisitor.visit(intermediateVar, null);
+                    LetClause nonRepresentativeBinding = new LetClause(intermediateVarCopy, iterationVarCopy1);
+                    lowerList.addNonRepresentativeClause(nonRepresentativeBinding);
+                    lowerList.addVertexBinding(vertexVar, iterationVarCopy2);
+                });
+                aliasLookupTable.addIterationAlias(vertexVar, iterationVar);
+                aliasLookupTable.addJoinAlias(vertexVar, intermediateVar);
+            };
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/LoweringEnvironment.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/LoweringEnvironment.java
new file mode 100644
index 0000000..ea80458
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/LoweringEnvironment.java
@@ -0,0 +1,366 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause.ClauseInputEnvironment;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause.ClauseOutputEnvironment;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.IEnvironmentAction;
+import org.apache.asterix.graphix.lang.rewrite.lower.action.ILowerListTransformer;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.CollectionTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.StateContainer;
+import org.apache.asterix.graphix.lang.rewrite.util.LowerRewritingUtil;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixLoweringVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.VariableRemapCloneVisitor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
+import org.apache.asterix.lang.common.base.Literal;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.clause.WhereClause;
+import org.apache.asterix.lang.common.expression.FieldAccessor;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.literal.TrueLiteral;
+import org.apache.asterix.lang.common.struct.OperatorType;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateWithConditionClause;
+import org.apache.asterix.lang.sqlpp.clause.JoinClause;
+import org.apache.asterix.lang.sqlpp.clause.Projection;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.SelectClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectRegular;
+import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.optype.JoinType;
+import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.lang.sqlpp.visitor.FreeVariableVisitor;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+
+/**
+ * @see GraphixLoweringVisitor
+ */
+public class LoweringEnvironment {
+    private final GraphixRewritingContext graphixRewritingContext;
+    private final GraphixDeepCopyVisitor graphixDeepCopyVisitor;
+    private final ClauseCollection mainClauseCollection;
+    private final GraphIdentifier graphIdentifier;
+    private final SourceLocation sourceLocation;
+
+    // The following are created through beginLeftMatch / beginTempLowerList / beginBranches.
+    private ClauseCollection leftClauseCollection;
+    private ClauseCollection tempClauseCollection;
+    private ClauseCollection branchClauseCollection;
+    private CollectionTable collectionTable;
+    private boolean isInlineLegal;
+
+    public LoweringEnvironment(GraphixRewritingContext graphixRewritingContext, GraphIdentifier graphIdentifier,
+            SourceLocation sourceLocation) {
+        this.mainClauseCollection = new ClauseCollection(sourceLocation);
+        this.graphixDeepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.graphIdentifier = graphIdentifier;
+        this.sourceLocation = sourceLocation;
+        this.leftClauseCollection = null;
+        this.tempClauseCollection = null;
+        this.branchClauseCollection = null;
+    }
+
+    public GraphIdentifier getGraphIdentifier() {
+        return graphIdentifier;
+    }
+
+    public void acceptAction(IEnvironmentAction environmentAction) throws CompilationException {
+        environmentAction.apply(this);
+    }
+
+    public void acceptTransformer(ILowerListTransformer sequenceTransformer) throws CompilationException {
+        // Fixed point lowering will always take precedence.
+        sequenceTransformer.accept(Objects.requireNonNullElseGet(tempClauseCollection,
+                () -> Objects.requireNonNullElseGet(branchClauseCollection,
+                        () -> Objects.requireNonNullElse(leftClauseCollection, mainClauseCollection))));
+    }
+
+    public void setInlineLegal(boolean isInlineLegal) {
+        this.isInlineLegal = isInlineLegal;
+    }
+
+    public boolean isInlineLegal() {
+        return isInlineLegal;
+    }
+
+    public void beginLeftMatch() throws CompilationException {
+        if (leftClauseCollection != null) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "LEFT-MATCH lowering is currently in progress!");
+        }
+        leftClauseCollection = new ClauseCollection(sourceLocation);
+    }
+
+    public void endLeftMatch() throws CompilationException {
+        if (leftClauseCollection.getNonRepresentativeClauses().isEmpty()) {
+            // This is an extraneous LEFT-MATCH. Do not modify anything.
+            leftClauseCollection = null;
+            return;
+        }
+
+        // Build our substitution visitor and environment.
+        VariableRemapCloneVisitor remapCloneVisitor = new VariableRemapCloneVisitor(graphixRewritingContext);
+        VariableExpr nestingVariable = graphixRewritingContext.getGraphixVariableCopy("_LeftMatch");
+        final Consumer<VariableExpr> substitutionAdder = v -> {
+            VariableExpr nestingVariableCopy = new VariableExpr(nestingVariable.getVar());
+            FieldAccessor fieldAccessor = new FieldAccessor(nestingVariableCopy, v.getVar());
+            remapCloneVisitor.addSubstitution(v, fieldAccessor);
+        };
+
+        // Build up our projection list.
+        List<Projection> projectionList = new ArrayList<>();
+        List<AbstractClause> leftLowerClauses = leftClauseCollection.getNonRepresentativeClauses();
+        for (AbstractClause workingClause : leftLowerClauses) {
+            if (workingClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
+                continue;
+            }
+
+            // Identify our right variable.
+            VariableExpr rightVariable;
+            if (workingClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                rightVariable = ((LetClause) workingClause).getVarExpr();
+
+            } else if (workingClause instanceof AbstractBinaryCorrelateClause) {
+                rightVariable = ((AbstractBinaryCorrelateClause) workingClause).getRightVariable();
+
+            } else {
+                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Illegal clause found!");
+            }
+            projectionList.add(new Projection(Projection.Kind.NAMED_EXPR, rightVariable,
+                    SqlppVariableUtil.toUserDefinedVariableName(rightVariable.getVar()).getValue()));
+            substitutionAdder.accept(rightVariable);
+        }
+
+        // Nestle our clauses in a SELECT-BLOCK.
+        LowerListClause leftLowerClause = new LowerListClause(leftClauseCollection);
+        SelectClause selectClause = new SelectClause(null, new SelectRegular(projectionList), false);
+        SelectBlock selectBlock = new SelectBlock(selectClause, null, null, null, null);
+        selectBlock.setFromClause(new FromGraphClause(leftLowerClause));
+        SetOperationInput setOperationInput = new SetOperationInput(selectBlock, null);
+        SelectSetOperation selectSetOperation = new SelectSetOperation(setOperationInput, null);
+        SelectExpression selectExpression = new SelectExpression(null, selectSetOperation, null, null, true);
+
+        // Merge the collection we just built with our main sequence.
+        IVisitorExtension visitorExtension = leftLowerClause.getVisitorExtension();
+        Expression conditionExpression = generateJoinCondition(leftLowerClauses.listIterator(), visitorExtension);
+        VariableExpr nestingVariableCopy = graphixDeepCopyVisitor.visit(nestingVariable, null);
+        JoinClause leftJoinClause = new JoinClause(JoinType.LEFTOUTER, selectExpression, nestingVariableCopy, null,
+                (Expression) remapCloneVisitor.substitute(conditionExpression), Literal.Type.MISSING);
+        mainClauseCollection.addNonRepresentativeClause(leftJoinClause);
+
+        // Introduce our representative variables back into our main sequence.
+        for (LetClause representativeVertexBinding : leftClauseCollection.getRepresentativeVertexBindings()) {
+            VariableExpr representativeVariable = representativeVertexBinding.getVarExpr();
+            VariableExpr representativeVariableCopy = graphixDeepCopyVisitor.visit(representativeVariable, null);
+            Expression rightExpression = representativeVertexBinding.getBindingExpr();
+            Expression reboundExpression = (Expression) remapCloneVisitor.substitute(rightExpression);
+            mainClauseCollection.addVertexBinding(representativeVariableCopy, reboundExpression);
+        }
+        for (LetClause representativeEdgeBinding : leftClauseCollection.getRepresentativeEdgeBindings()) {
+            VariableExpr representativeVariable = representativeEdgeBinding.getVarExpr();
+            VariableExpr representativeVariableCopy = graphixDeepCopyVisitor.visit(representativeVariable, null);
+            Expression rightExpression = representativeEdgeBinding.getBindingExpr();
+            Expression reboundExpression = (Expression) remapCloneVisitor.substitute(rightExpression);
+            mainClauseCollection.addEdgeBinding(representativeVariableCopy, reboundExpression);
+        }
+        for (LetClause representativePathBinding : leftClauseCollection.getRepresentativePathBindings()) {
+            VariableExpr representativeVariable = representativePathBinding.getVarExpr();
+            VariableExpr representativeVariableCopy = graphixDeepCopyVisitor.visit(representativeVariable, null);
+            Expression rightExpression = representativePathBinding.getBindingExpr();
+            Expression reboundExpression = (Expression) remapCloneVisitor.substitute(rightExpression);
+            mainClauseCollection.addPathBinding(representativeVariableCopy, reboundExpression);
+        }
+
+        // Do not reintroduce our vertex, edge, and path bindings.
+        leftClauseCollection.getRepresentativeVertexBindings().clear();
+        leftClauseCollection.getRepresentativeEdgeBindings().clear();
+        leftClauseCollection.getRepresentativePathBindings().clear();
+        leftClauseCollection = null;
+    }
+
+    public void beginTempLowerList() throws CompilationException {
+        if (tempClauseCollection != null) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Temp branch lowering is currently in progress!");
+        }
+        tempClauseCollection = new ClauseCollection(sourceLocation);
+    }
+
+    public void endTempLowerList() {
+        // We discard the collection we just built.
+        tempClauseCollection = null;
+    }
+
+    public void beginBranches() throws CompilationException {
+        if (collectionTable != null || branchClauseCollection != null) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Path branch lowering is currently in progress!");
+        }
+        collectionTable = new CollectionTable();
+        branchClauseCollection = new ClauseCollection(sourceLocation);
+    }
+
+    public void flushBranch(EdgePatternExpr edgePatternExpr, boolean isJoiningLeftToRight) throws CompilationException {
+        if (branchClauseCollection.getRepresentativeVertexBindings().size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Only one vertex should exist in the clause collection!");
+        }
+        if (branchClauseCollection.getRepresentativeEdgeBindings().size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Only one edge should exist in the clause collection!");
+        }
+        collectionTable.putCollection(edgePatternExpr, isJoiningLeftToRight, branchClauseCollection);
+        branchClauseCollection = new ClauseCollection(sourceLocation);
+    }
+
+    public void endBranches(ClauseOutputEnvironment clauseOutputEnvironment,
+            ClauseInputEnvironment clauseInputEnvironment, Map<ElementLabel, VariableExpr> inputMap,
+            Map<ElementLabel, VariableExpr> outputMap, AliasLookupTable aliasLookupTable, SourceLocation sourceLocation)
+            throws CompilationException {
+        // Build the input map for our collection table.
+        Map<ElementLabel, StateContainer> inputStateMap = new HashMap<>();
+        for (Map.Entry<ElementLabel, VariableExpr> mapEntry : inputMap.entrySet()) {
+            VariableExpr iterationAlias = aliasLookupTable.getIterationAlias(mapEntry.getValue());
+            VariableExpr joinAlias = aliasLookupTable.getJoinAlias(mapEntry.getValue());
+            inputStateMap.put(mapEntry.getKey(), new StateContainer(iterationAlias, joinAlias));
+        }
+        collectionTable.setInputMap(inputStateMap);
+
+        // ...and the output map for out collection table.
+        Map<ElementLabel, StateContainer> outputStateMap = new HashMap<>();
+        for (Map.Entry<ElementLabel, VariableExpr> mapEntry : outputMap.entrySet()) {
+            VariableExpr iterationAlias = aliasLookupTable.getIterationAlias(mapEntry.getValue());
+            VariableExpr joinAlias = aliasLookupTable.getJoinAlias(mapEntry.getValue());
+            outputStateMap.put(mapEntry.getKey(), new StateContainer(iterationAlias, joinAlias));
+        }
+        collectionTable.setOutputMap(outputStateMap);
+
+        // Add our GRAPH-CLAUSE to our main sequence.
+        LowerSwitchClause lowerSwitchClause =
+                new LowerSwitchClause(collectionTable, clauseInputEnvironment, clauseOutputEnvironment);
+        lowerSwitchClause.setSourceLocation(sourceLocation);
+        mainClauseCollection.addNonRepresentativeClause(lowerSwitchClause);
+        branchClauseCollection = null;
+        collectionTable = null;
+    }
+
+    public void endLowering(FromGraphClause targetFromClause) {
+        targetFromClause.setLowerClause(new LowerListClause(mainClauseCollection));
+    }
+
+    private static Expression generateJoinCondition(ListIterator<AbstractClause> lowerClauseIterator,
+            IVisitorExtension visitorExtension) throws CompilationException {
+        final List<Expression> joinConditionExpressions = new ArrayList<>();
+        final Collection<VariableExpr> freeVariables = new HashSet<>();
+        final FreeVariableVisitor freeVariableVisitor = new FreeVariableVisitor() {
+            @Override
+            public Void visit(IVisitorExtension visitorExtension, Collection<VariableExpr> freeVars)
+                    throws CompilationException {
+                Collection<VariableExpr> bindingVariables = new HashSet<>();
+                Collection<VariableExpr> conditionFreeVars = new HashSet<>();
+                Collection<VariableExpr> clauseFreeVars = new HashSet<>();
+                while (lowerClauseIterator.hasNext()) {
+                    AbstractClause lowerClause = lowerClauseIterator.next();
+                    clauseFreeVars.clear();
+                    if (lowerClause instanceof AbstractBinaryCorrelateClause) {
+                        AbstractBinaryCorrelateClause correlateClause = (AbstractBinaryCorrelateClause) lowerClause;
+                        correlateClause.getRightExpression().accept(this, clauseFreeVars);
+                        if (lowerClause.getClauseType() == Clause.ClauseType.UNNEST_CLAUSE) {
+                            clauseFreeVars.removeAll(bindingVariables);
+                            if (!clauseFreeVars.isEmpty()) {
+                                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                                        "Encountered UNNEST-CLAUSE with free variables.");
+                            }
+
+                        } else {
+                            AbstractBinaryCorrelateWithConditionClause clauseWithCondition =
+                                    (AbstractBinaryCorrelateWithConditionClause) correlateClause;
+                            conditionFreeVars.clear();
+                            clauseWithCondition.getConditionExpression().accept(this, conditionFreeVars);
+                            conditionFreeVars.removeAll(bindingVariables);
+                            conditionFreeVars.remove(correlateClause.getRightVariable());
+                            if (!conditionFreeVars.isEmpty()) {
+                                // We have found a JOIN with a free variable.
+                                joinConditionExpressions.add(clauseWithCondition.getConditionExpression());
+                                clauseWithCondition.setConditionExpression(new LiteralExpr(TrueLiteral.INSTANCE));
+                            }
+                            clauseFreeVars.addAll(conditionFreeVars);
+                        }
+
+                        // Adds binding variables.
+                        bindingVariables.add(correlateClause.getRightVariable());
+                        freeVars.addAll(clauseFreeVars);
+
+                    } else if (lowerClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
+                        WhereClause whereClause = (WhereClause) lowerClause;
+                        whereClause.getWhereExpr().accept(this, clauseFreeVars);
+                        clauseFreeVars.removeAll(bindingVariables);
+                        if (!clauseFreeVars.isEmpty()) {
+                            joinConditionExpressions.add(whereClause.getWhereExpr());
+                            lowerClauseIterator.remove();
+                        }
+                        freeVars.addAll(clauseFreeVars);
+
+                    } else if (lowerClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                        LetClause letClause = (LetClause) lowerClause;
+                        letClause.getBindingExpr().accept(this, clauseFreeVars);
+                        clauseFreeVars.removeAll(bindingVariables);
+                        bindingVariables.add(letClause.getVarExpr());
+                        if (!clauseFreeVars.isEmpty()) {
+                            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                                    "Encountered LET-CLAUSE with free variables.");
+                        }
+                    }
+                }
+                return null;
+            }
+        };
+        freeVariableVisitor.visit(visitorExtension, freeVariables);
+        return joinConditionExpressions.isEmpty() ? new LiteralExpr(TrueLiteral.INSTANCE)
+                : LowerRewritingUtil.buildConnectedClauses(joinConditionExpressions, OperatorType.AND);
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/AbstractInlineAction.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/AbstractInlineAction.java
new file mode 100644
index 0000000..da91946
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/AbstractInlineAction.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower.action;
+
+import static org.apache.asterix.graphix.lang.rewrite.visitor.ElementBodyAnalysisVisitor.ElementBodyAnalysisContext;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.lower.LoweringEnvironment;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.VariableRemapCloneVisitor;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.clause.WhereClause;
+import org.apache.asterix.lang.common.expression.FieldBinding;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.literal.StringLiteral;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.Projection;
+import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
+
+/**
+ * Inline an element body into a {@link LoweringEnvironment}. This includes:
+ * <ol>
+ *  <li>Copying {@link UnnestClause}, {@link LetClause}, and {@link WhereClause} AST nodes from our body analysis</li>
+ *  <li>Creating {@link RecordConstructor} AST nodes to inline
+ *  {@link org.apache.asterix.lang.sqlpp.clause.SelectRegular} nodes.</li>
+ * </ol>
+ */
+public abstract class AbstractInlineAction implements IEnvironmentAction {
+    protected final GraphixRewritingContext graphixRewritingContext;
+    protected final ElementBodyAnalysisContext bodyAnalysisContext;
+    protected final VariableRemapCloneVisitor remapCloneVisitor;
+    protected final GraphixDeepCopyVisitor deepCopyVisitor;
+
+    // This may be mutated by our child.
+    protected VariableExpr elementVariable;
+
+    protected AbstractInlineAction(GraphixRewritingContext graphixRewritingContext,
+            ElementBodyAnalysisContext bodyAnalysisContext, VariableExpr elementVariable) {
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.bodyAnalysisContext = bodyAnalysisContext;
+        this.elementVariable = elementVariable;
+        this.remapCloneVisitor = new VariableRemapCloneVisitor(graphixRewritingContext);
+        this.deepCopyVisitor = new GraphixDeepCopyVisitor();
+    }
+
+    @Override
+    public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+        final Function<VariableExpr, VariableExpr> substitutionAdder = v -> {
+            VariableExpr reboundVariableExpr = graphixRewritingContext.getGraphixVariableCopy(v);
+            remapCloneVisitor.addSubstitution(v, reboundVariableExpr);
+            return reboundVariableExpr;
+        };
+
+        // To inline, we need to ensure that we substitute variables accordingly.
+        remapCloneVisitor.resetSubstitutions();
+        if (bodyAnalysisContext.getFromTermVariable() != null) {
+            VariableExpr fromTermVariableExpr = bodyAnalysisContext.getFromTermVariable();
+            VariableExpr elementVariableExpr = new VariableExpr(elementVariable.getVar());
+            remapCloneVisitor.addSubstitution(fromTermVariableExpr, elementVariableExpr);
+        }
+
+        // If we have any UNNEST clauses, we need to add these.
+        if (bodyAnalysisContext.getUnnestClauses() != null) {
+            for (AbstractBinaryCorrelateClause unnestClause : bodyAnalysisContext.getUnnestClauses()) {
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    UnnestClause copiedClause = (UnnestClause) remapCloneVisitor.substitute(unnestClause);
+                    if (copiedClause.hasPositionalVariable()) {
+                        substitutionAdder.apply(copiedClause.getPositionalVariable());
+                    }
+                    VariableExpr reboundUnnestVariable = substitutionAdder.apply(copiedClause.getRightVariable());
+                    UnnestClause newUnnestClause =
+                            new UnnestClause(copiedClause.getUnnestType(), copiedClause.getRightExpression(),
+                                    reboundUnnestVariable, null, copiedClause.getOuterUnnestMissingValueType());
+                    newUnnestClause.setSourceLocation(unnestClause.getSourceLocation());
+                    lowerList.addNonRepresentativeClause(newUnnestClause);
+                });
+            }
+        }
+
+        // If we have any LET clauses, we need to substitute them in our WHERE and SELECT clauses.
+        if (bodyAnalysisContext.getLetClauses() != null) {
+            for (LetClause letClause : bodyAnalysisContext.getLetClauses()) {
+                // Remap this LET-CLAUSE to include our new variables. Move this to our correlated clauses.
+                LetClause copiedClause = (LetClause) remapCloneVisitor.substitute(letClause);
+                VariableExpr reboundLetVariable = substitutionAdder.apply(copiedClause.getVarExpr());
+                VariableExpr reboundLetVariableCopy = deepCopyVisitor.visit(reboundLetVariable, null);
+                Expression copiedBindingExpr = copiedClause.getBindingExpr();
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    LetClause reboundLetClause = new LetClause(reboundLetVariableCopy, copiedBindingExpr);
+                    reboundLetClause.setSourceLocation(letClause.getSourceLocation());
+                    lowerList.addNonRepresentativeClause(reboundLetClause);
+                });
+            }
+        }
+
+        // If we have any WHERE clauses, we need to add these.
+        if (bodyAnalysisContext.getWhereClauses() != null) {
+            for (WhereClause whereClause : bodyAnalysisContext.getWhereClauses()) {
+                WhereClause copiedClause = (WhereClause) remapCloneVisitor.substitute(whereClause);
+                loweringEnvironment.acceptTransformer(lowerList -> {
+                    WhereClause newWhereClause = new WhereClause(copiedClause.getWhereExpr());
+                    newWhereClause.setSourceLocation(whereClause.getSourceLocation());
+                    lowerList.addNonRepresentativeClause(newWhereClause);
+                });
+            }
+        }
+    }
+
+    protected RecordConstructor buildRecordConstructor() throws CompilationException {
+        if (bodyAnalysisContext.getSelectClauseProjections() != null) {
+            // Map our original variable to our element variable.
+            List<FieldBinding> fieldBindings = new ArrayList<>();
+            for (Projection projection : bodyAnalysisContext.getSelectClauseProjections()) {
+                LiteralExpr fieldNameExpr = new LiteralExpr(new StringLiteral(projection.getName()));
+                ILangExpression fieldValueExpr = remapCloneVisitor.substitute(projection.getExpression());
+                fieldBindings.add(new FieldBinding(fieldNameExpr, (Expression) fieldValueExpr));
+            }
+            return new RecordConstructor(fieldBindings);
+
+        } else {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Non-inlineable SELECT clause encountered, but was body was marked as inline!");
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/IEnvironmentAction.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/IEnvironmentAction.java
similarity index 87%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/IEnvironmentAction.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/IEnvironmentAction.java
index 4ab6030..90926bc 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/IEnvironmentAction.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/IEnvironmentAction.java
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.action;
+package org.apache.asterix.graphix.lang.rewrite.lower.action;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringEnvironment;
+import org.apache.asterix.graphix.lang.rewrite.lower.LoweringEnvironment;
 
 @FunctionalInterface
 public interface IEnvironmentAction {
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/ILowerListTransformer.java
similarity index 77%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/ILowerListTransformer.java
index 4509792..72a48f4 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/ILowerListTransformer.java
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.lang.rewrite.lower.action;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
 
 @FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+public interface ILowerListTransformer {
+    void accept(ClauseCollection lowerList) throws CompilationException;
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/MatchSemanticAction.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/MatchSemanticAction.java
new file mode 100644
index 0000000..0fa6483
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/MatchSemanticAction.java
@@ -0,0 +1,332 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower.action;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsNavigationOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SemanticsPatternOption;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.lower.AliasLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.LoweringEnvironment;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.rewrite.visitor.VariableRemapCloneVisitor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.clause.WhereClause;
+import org.apache.asterix.lang.common.expression.CallExpr;
+import org.apache.asterix.lang.common.expression.FieldAccessor;
+import org.apache.asterix.lang.common.expression.OperatorExpr;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.struct.OperatorType;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.JoinClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.optype.JoinType;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+
+/**
+ * Define the semantics of evaluating a basic graph pattern query (i.e. how much isomorphism do we enforce), and b)
+ * b) the semantics of navigating between vertices (i.e. what type of uniqueness in the path should be enforced). We
+ * assume that all elements are named at this point and that our {@link FromGraphClause} is in canonical form.
+ * <p>
+ * We enforce the following basic graph pattern query semantics (by default, we enforce total isomorphism):
+ * <ul>
+ *  <li>For total isomorphism, no vertex and no edge can appear more than once across all {@link MatchClause}
+ *  nodes.</li>
+ *  <li>For vertex-isomorphism, we enforce that no vertex can appear more than once across all {@link MatchClause}
+ *  nodes.</li>
+ *  <li>For edge-isomorphism, we enforce that no edge can appear more than once across all {@link MatchClause}
+ *  nodes.</li>
+ *  <li>For homomorphism, we enforce nothing. Edge adjacency is already implicitly preserved.</li>
+ * </ul>
+ * <p>
+ * We enforce the following navigation query semantics (by default, we enforce no-repeat-anything):
+ * <ul>
+ *  <li>For no-repeat-vertices, no vertex instance can appear more than once in a path instance.</li>
+ *  <li>For no-repeat-edges, no edge instance can appear more than once in a path instance.</li>
+ *  <li>For no-repeat-anything, no vertex or edge instance can appear more than once in a path instance.</li>
+ * </ul>
+ */
+public class MatchSemanticAction implements IEnvironmentAction {
+    // We will walk through our FROM-GRAPH-CLAUSE and determine our isomorphism conjuncts.
+    private final SemanticsNavigationOption navigationSemantics;
+    private final SemanticsPatternOption patternSemantics;
+    private final FromGraphClause fromGraphClause;
+    private final AliasLookupTable aliasLookupTable;
+    private final VariableRemapCloneVisitor remapCloneVisitor;
+    private final GraphixDeepCopyVisitor deepCopyVisitor;
+
+    public MatchSemanticAction(GraphixRewritingContext graphixRewritingContext, FromGraphClause fromGraphClause,
+            AliasLookupTable aliasLookupTable) throws CompilationException {
+        this.fromGraphClause = fromGraphClause;
+        this.aliasLookupTable = aliasLookupTable;
+        this.remapCloneVisitor = new VariableRemapCloneVisitor(graphixRewritingContext);
+        this.deepCopyVisitor = new GraphixDeepCopyVisitor();
+
+        // Determine our BGP query semantics.
+        String patternConfigKeyName = SemanticsPatternOption.OPTION_KEY_NAME;
+        this.patternSemantics = (SemanticsPatternOption) graphixRewritingContext.getSetting(patternConfigKeyName);
+
+        // Determine our navigation query semantics.
+        String navConfigKeyName = SemanticsNavigationOption.OPTION_KEY_NAME;
+        this.navigationSemantics = (SemanticsNavigationOption) graphixRewritingContext.getSetting(navConfigKeyName);
+    }
+
+    private static List<OperatorExpr> generateIsomorphismConjuncts(List<VariableExpr> variableList) {
+        List<OperatorExpr> isomorphismConjuncts = new ArrayList<>();
+
+        // Find all unique pairs from our list of variables.
+        for (int i = 0; i < variableList.size(); i++) {
+            for (int j = i + 1; j < variableList.size(); j++) {
+                OperatorExpr inequalityConjunct = new OperatorExpr();
+                inequalityConjunct.addOperator(OperatorType.NEQ);
+                inequalityConjunct.addOperand(variableList.get(i));
+                inequalityConjunct.addOperand(variableList.get(j));
+                isomorphismConjuncts.add(inequalityConjunct);
+            }
+        }
+
+        return isomorphismConjuncts;
+    }
+
+    @Override
+    public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
+        Map<ElementLabel, List<VariableExpr>> vertexVariableMap = new HashMap<>();
+        Map<ElementLabel, List<VariableExpr>> edgeVariableMap = new HashMap<>();
+
+        // Populate the collections above.
+        fromGraphClause.accept(new AbstractGraphixQueryVisitor() {
+            private void populateVariableMap(ElementLabel label, VariableExpr variableExpr,
+                    Map<ElementLabel, List<VariableExpr>> labelVariableMap) {
+                Function<VariableExpr, Boolean> mapMatchFinder = v -> {
+                    final String variableName = SqlppVariableUtil.toUserDefinedName(variableExpr.getVar().getValue());
+                    return variableName.equals(SqlppVariableUtil.toUserDefinedName(v.getVar().getValue()));
+                };
+                if (labelVariableMap.containsKey(label)) {
+                    if (labelVariableMap.get(label).stream().noneMatch(mapMatchFinder::apply)) {
+                        labelVariableMap.get(label).add(variableExpr);
+                    }
+
+                } else {
+                    List<VariableExpr> variableList = new ArrayList<>();
+                    variableList.add(variableExpr);
+                    labelVariableMap.put(label, variableList);
+                }
+            }
+
+            @Override
+            public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
+                // We only want to explore the top level of our FROM-GRAPH-CLAUSEs.
+                for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
+                    matchClause.accept(this, arg);
+                }
+                return null;
+            }
+
+            @Override
+            public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg)
+                    throws CompilationException {
+                VariableExpr vertexVariable = vertexPatternExpr.getVariableExpr();
+                VariableExpr iterationVariable = aliasLookupTable.getIterationAlias(vertexVariable);
+                ElementLabel elementLabel = vertexPatternExpr.getLabels().iterator().next();
+                iterationVariable.setSourceLocation(vertexVariable.getSourceLocation());
+                populateVariableMap(elementLabel, iterationVariable, vertexVariableMap);
+                return null;
+            }
+
+            @Override
+            public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
+                EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+                VariableExpr edgeVariable = edgeDescriptor.getVariableExpr();
+                VariableExpr iterationVariable = aliasLookupTable.getIterationAlias(edgeVariable);
+                ElementLabel elementLabel = edgeDescriptor.getEdgeLabels().iterator().next();
+                iterationVariable.setSourceLocation(edgeVariable.getSourceLocation());
+                populateVariableMap(elementLabel, iterationVariable, edgeVariableMap);
+                return null;
+            }
+        }, null);
+
+        // Construct our isomorphism conjuncts.
+        List<OperatorExpr> isomorphismConjuncts = new ArrayList<>();
+        if (patternSemantics == SemanticsPatternOption.ISOMORPHISM
+                || patternSemantics == SemanticsPatternOption.VERTEX_ISOMORPHISM) {
+            vertexVariableMap.values().stream().map(MatchSemanticAction::generateIsomorphismConjuncts)
+                    .forEach(isomorphismConjuncts::addAll);
+        }
+        if (patternSemantics == SemanticsPatternOption.ISOMORPHISM
+                || patternSemantics == SemanticsPatternOption.EDGE_ISOMORPHISM) {
+            edgeVariableMap.values().stream().map(MatchSemanticAction::generateIsomorphismConjuncts)
+                    .forEach(isomorphismConjuncts::addAll);
+        }
+
+        // Iterate through our clause sequence.
+        remapCloneVisitor.resetSubstitutions();
+        loweringEnvironment.acceptTransformer(new ILowerListTransformer() {
+            private final Set<VariableExpr> visitedVariables = new HashSet<>();
+
+            @Override
+            public void accept(ClauseCollection lowerList) throws CompilationException {
+                List<AbstractClause> nonRepresentativeClauses = lowerList.getNonRepresentativeClauses();
+                ListIterator<AbstractClause> clauseIterator = nonRepresentativeClauses.listIterator();
+                while (clauseIterator.hasNext()) {
+                    AbstractClause workingClause = clauseIterator.next();
+                    if (workingClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                        LetClause letClause = (LetClause) workingClause;
+                        visitedVariables.add(letClause.getVarExpr());
+
+                    } else if (workingClause.getClauseType() == Clause.ClauseType.EXTENSION) {
+                        // Navigation semantics will be introduced at the plan translator.
+                        LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) workingClause;
+                        lowerSwitchClause.setNavigationSemantics(navigationSemantics);
+
+                    } else if (workingClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
+                        continue;
+
+                    } else {
+                        AbstractBinaryCorrelateClause correlateClause = (AbstractBinaryCorrelateClause) workingClause;
+                        visitedVariables.add(correlateClause.getRightVariable());
+
+                        // If we encounter a LEFT-JOIN, then we have created a LEFT-MATCH branch.
+                        if (workingClause.getClauseType() == Clause.ClauseType.JOIN_CLAUSE) {
+                            JoinClause joinClause = (JoinClause) workingClause;
+                            if (joinClause.getJoinType() == JoinType.LEFTOUTER) {
+                                acceptLeftMatchJoin(clauseIterator, joinClause);
+                            }
+                        }
+                    }
+
+                    // Only introduce our conjunct if we have visited both variables (eagerly).
+                    Set<OperatorExpr> appliedIsomorphismConjuncts = new HashSet<>();
+                    for (OperatorExpr isomorphismConjunct : isomorphismConjuncts) {
+                        List<Expression> operandList = isomorphismConjunct.getExprList();
+                        VariableExpr termVariable1 = ((VariableExpr) operandList.get(0));
+                        VariableExpr termVariable2 = ((VariableExpr) operandList.get(1));
+                        if (visitedVariables.contains(termVariable1) && visitedVariables.contains(termVariable2)) {
+                            clauseIterator.add(new WhereClause(isomorphismConjunct));
+                            appliedIsomorphismConjuncts.add(isomorphismConjunct);
+                        }
+                    }
+                    isomorphismConjuncts.removeAll(appliedIsomorphismConjuncts);
+                }
+            }
+
+            private void acceptLeftMatchJoin(ListIterator<AbstractClause> clauseIterator, JoinClause joinClause)
+                    throws CompilationException {
+                // We can make the following assumptions about our JOIN here (i.e. the casts here are valid).
+                Expression rightExpression = joinClause.getRightExpression();
+                SelectExpression selectExpression = (SelectExpression) rightExpression;
+                SelectSetOperation selectSetOperation = selectExpression.getSelectSetOperation();
+                SelectBlock selectBlock = selectSetOperation.getLeftInput().getSelectBlock();
+                FromGraphClause fromGraphClause = (FromGraphClause) selectBlock.getFromClause();
+                LowerListClause lowerClause = (LowerListClause) fromGraphClause.getLowerClause();
+                Set<VariableExpr> localLiveVariables = new HashSet<>();
+                ListIterator<AbstractClause> leftClauseIterator =
+                        lowerClause.getClauseCollection().getNonRepresentativeClauses().listIterator();
+                while (leftClauseIterator.hasNext()) {
+                    AbstractClause workingClause = leftClauseIterator.next();
+                    VariableExpr rightVariable;
+                    if (workingClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
+                        continue;
+
+                    } else if (workingClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                        rightVariable = ((LetClause) workingClause).getVarExpr();
+
+                    } else {
+                        rightVariable = ((AbstractBinaryCorrelateClause) workingClause).getRightVariable();
+                    }
+
+                    // Add our isomorphism conjunct to our main iterator.
+                    localLiveVariables.add(rightVariable);
+                    Set<OperatorExpr> appliedIsomorphismConjuncts = new HashSet<>();
+                    for (OperatorExpr isomorphismConjunct : isomorphismConjuncts) {
+                        List<Expression> operandList = isomorphismConjunct.getExprList();
+                        VariableExpr termVariable1 = ((VariableExpr) operandList.get(0));
+                        VariableExpr termVariable2 = ((VariableExpr) operandList.get(1));
+                        VariableExpr leftVariable;
+                        if (termVariable1.equals(rightVariable)) {
+                            leftVariable = termVariable2;
+
+                        } else if (termVariable2.equals(rightVariable)) {
+                            leftVariable = termVariable1;
+
+                        } else {
+                            continue;
+                        }
+
+                        // Is our left variable introduced in our LEFT-CLAUSE-COLLECTION? Add the conjunct here.
+                        if (localLiveVariables.contains(leftVariable)) {
+                            leftClauseIterator.add(new WhereClause(isomorphismConjunct));
+                            appliedIsomorphismConjuncts.add(isomorphismConjunct);
+                            visitedVariables.add(rightVariable);
+                            continue;
+                        }
+
+                        // Have we seen our left variable somewhere else? Add our conjunct in our main collection.
+                        if (visitedVariables.contains(leftVariable)) {
+                            VariableExpr joinVariable1 = deepCopyVisitor.visit(joinClause.getRightVariable(), null);
+                            VariableExpr joinVariable2 = deepCopyVisitor.visit(joinClause.getRightVariable(), null);
+                            FieldAccessor fieldAccessor1 = new FieldAccessor(joinVariable1, rightVariable.getVar());
+                            FieldAccessor fieldAccessor2 = new FieldAccessor(joinVariable2, rightVariable.getVar());
+                            remapCloneVisitor.addSubstitution(rightVariable, fieldAccessor1);
+                            ILangExpression qualifiedConjunct = remapCloneVisitor.substitute(isomorphismConjunct);
+
+                            // Our right variable can also be optional.
+                            FunctionSignature functionSignature = new FunctionSignature(BuiltinFunctions.IS_MISSING);
+                            CallExpr isMissingCallExpr = new CallExpr(functionSignature, List.of(fieldAccessor2));
+                            OperatorExpr disjunctionExpr = new OperatorExpr();
+                            disjunctionExpr.addOperator(OperatorType.OR);
+                            disjunctionExpr.addOperand(isMissingCallExpr);
+                            disjunctionExpr.addOperand((Expression) qualifiedConjunct);
+                            clauseIterator.add(new WhereClause(disjunctionExpr));
+                            appliedIsomorphismConjuncts.add(isomorphismConjunct);
+                            visitedVariables.add(rightVariable);
+                        }
+                    }
+                    isomorphismConjuncts.removeAll(appliedIsomorphismConjuncts);
+                }
+            }
+        });
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/PathPatternAction.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/PathPatternAction.java
similarity index 76%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/PathPatternAction.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/PathPatternAction.java
index bb9f849..6a6f849 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/PathPatternAction.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/action/PathPatternAction.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.action;
+package org.apache.asterix.graphix.lang.rewrite.lower.action;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -24,18 +24,17 @@
 import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringEnvironment;
+import org.apache.asterix.graphix.lang.rewrite.lower.LoweringEnvironment;
+import org.apache.asterix.graphix.type.MaterializePathTypeComputer;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.ListConstructor;
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
-import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.literal.StringLiteral;
 
 /**
@@ -44,9 +43,6 @@
  * edge variables.
  */
 public class PathPatternAction implements IEnvironmentAction {
-    public final static String PATH_VERTICES_FIELD_NAME = "Vertices";
-    public final static String PATH_EDGES_FIELD_NAME = "Edges";
-
     private final PathPatternExpr pathPatternExpr;
 
     public PathPatternAction(PathPatternExpr pathPatternExpr) {
@@ -56,28 +52,27 @@
     @Override
     public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
         if (pathPatternExpr.getVariableExpr() != null) {
-            loweringEnvironment.acceptTransformer(clauseSequence -> {
+            loweringEnvironment.acceptTransformer(lowerList -> {
                 // We have a named non-sub-path.
                 RecordConstructor recordConstructor = new RecordConstructor();
+                recordConstructor.setSourceLocation(pathPatternExpr.getSourceLocation());
                 List<VertexPatternExpr> vertexExpressions = pathPatternExpr.getVertexExpressions();
                 List<EdgePatternExpr> edgeExpressions = pathPatternExpr.getEdgeExpressions();
                 buildPathRecord(vertexExpressions, edgeExpressions, recordConstructor);
-                VariableExpr pathVariableExpr = new VariableExpr(pathPatternExpr.getVariableExpr().getVar());
-                clauseSequence.addDeferredClause(new CorrLetClause(recordConstructor, pathVariableExpr, null));
+                lowerList.addPathBinding(pathPatternExpr.getVariableExpr(), recordConstructor);
             });
         }
         for (LetClause reboundSubPathExpression : pathPatternExpr.getReboundSubPathList()) {
-            loweringEnvironment.acceptTransformer(clauseSequence -> {
+            loweringEnvironment.acceptTransformer(lowerList -> {
                 // We have sub-paths we need to introduce.
-                VariableExpr pathVariableExpr = new VariableExpr(reboundSubPathExpression.getVarExpr().getVar());
                 Expression reboundExpression = reboundSubPathExpression.getBindingExpr();
-                clauseSequence.addDeferredClause(new CorrLetClause(reboundExpression, pathVariableExpr, null));
+                lowerList.addPathBinding(reboundSubPathExpression.getVarExpr(), reboundExpression);
             });
         }
     }
 
     public static void buildPathRecord(Collection<VertexPatternExpr> vertexExpressions,
-            List<EdgePatternExpr> edgeExpressions, RecordConstructor outputRecordConstructor) {
+            Collection<EdgePatternExpr> edgeExpressions, RecordConstructor outputRecordConstructor) {
         List<FieldBinding> fieldBindingList = new ArrayList<>();
 
         // Assemble our vertices into a list.
@@ -86,7 +81,9 @@
         ListConstructor vertexVariableList = new ListConstructor();
         vertexVariableList.setType(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR);
         vertexVariableList.setExprList(vertexVariableExprList);
-        LiteralExpr verticesFieldName = new LiteralExpr(new StringLiteral(PATH_VERTICES_FIELD_NAME));
+        vertexVariableList.setSourceLocation(outputRecordConstructor.getSourceLocation());
+        StringLiteral verticesFieldNameLiteral = new StringLiteral(MaterializePathTypeComputer.VERTICES_FIELD_NAME);
+        LiteralExpr verticesFieldName = new LiteralExpr(verticesFieldNameLiteral);
         fieldBindingList.add(new FieldBinding(verticesFieldName, vertexVariableList));
 
         // Assemble our edges into a list.
@@ -95,7 +92,9 @@
         ListConstructor edgeVariableList = new ListConstructor();
         edgeVariableList.setType(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR);
         edgeVariableList.setExprList(edgeVariableExprList);
-        LiteralExpr edgesFieldName = new LiteralExpr(new StringLiteral(PATH_EDGES_FIELD_NAME));
+        edgeVariableList.setSourceLocation(outputRecordConstructor.getSourceLocation());
+        StringLiteral edgesFieldNameLiteral = new StringLiteral(MaterializePathTypeComputer.EDGES_FIELD_NAME);
+        LiteralExpr edgesFieldName = new LiteralExpr(edgesFieldNameLiteral);
         fieldBindingList.add(new FieldBinding(edgesFieldName, edgeVariableList));
 
         // Set our field bindings in our output record constructor.
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/ClauseCollection.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/ClauseCollection.java
new file mode 100644
index 0000000..0c10586
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/ClauseCollection.java
@@ -0,0 +1,232 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower.struct;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+
+public class ClauseCollection implements Iterable<AbstractClause> {
+    private final List<LetClause> representativeVertexBindings = new ArrayList<>();
+    private final List<LetClause> representativeEdgeBindings = new ArrayList<>();
+    private final List<LetClause> representativePathBindings = new ArrayList<>();
+    private final List<AbstractClause> nonRepresentativeClauses = new LinkedList<>();
+    private final List<Pair<VariableExpr, LetClause>> eagerVertexBindings = new ArrayList<>();
+    private final List<AbstractBinaryCorrelateClause> userCorrelateClauses = new ArrayList<>();
+    private final SourceLocation sourceLocation;
+
+    public ClauseCollection(SourceLocation sourceLocation) {
+        this.sourceLocation = sourceLocation;
+    }
+
+    public void addVertexBinding(VariableExpr bindingVar, Expression boundExpression) throws CompilationException {
+        if (representativeVertexBindings.stream().anyMatch(v -> v.getVarExpr().equals(bindingVar))) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Duplicate vertex binding found!");
+        }
+        representativeVertexBindings.add(new LetClause(bindingVar, boundExpression));
+    }
+
+    public void addEdgeBinding(VariableExpr bindingVar, Expression boundExpression) throws CompilationException {
+        if (representativeEdgeBindings.stream().anyMatch(v -> v.getVarExpr().equals(bindingVar))) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Duplicate edge binding found!");
+        }
+        representativeEdgeBindings.add(new LetClause(bindingVar, boundExpression));
+    }
+
+    public void addPathBinding(VariableExpr bindingVar, Expression boundExpression) throws CompilationException {
+        if (representativePathBindings.stream().anyMatch(v -> v.getVarExpr().equals(bindingVar))) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Duplicate path binding found!");
+        }
+        representativePathBindings.add(new LetClause(bindingVar, boundExpression));
+    }
+
+    @SuppressWarnings("fallthrough")
+    public void addNonRepresentativeClause(AbstractClause abstractClause) throws CompilationException {
+        switch (abstractClause.getClauseType()) {
+            case JOIN_CLAUSE:
+            case UNNEST_CLAUSE:
+            case LET_CLAUSE:
+            case WHERE_CLAUSE:
+                nonRepresentativeClauses.add(abstractClause);
+                break;
+
+            case EXTENSION:
+                if (abstractClause instanceof LowerSwitchClause) {
+                    nonRepresentativeClauses.add(abstractClause);
+                    break;
+                }
+
+            default:
+                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, abstractClause.getSourceLocation(),
+                        "Illegal clause inserted into the lower clause list!");
+        }
+    }
+
+    public void addEagerVertexBinding(VariableExpr representativeVariable, LetClause vertexBinding)
+            throws CompilationException {
+        // An eager vertex binding should be found in the non-representative clauses...
+        boolean isIllegalVertexBinding = true;
+        for (AbstractClause nonRepresentativeClause : nonRepresentativeClauses) {
+            if (nonRepresentativeClause.getClauseType() != Clause.ClauseType.LET_CLAUSE) {
+                continue;
+            }
+            LetClause nonRepresentativeLetClause = (LetClause) nonRepresentativeClause;
+            if (nonRepresentativeLetClause.getBindingExpr().equals(vertexBinding.getBindingExpr())) {
+                isIllegalVertexBinding = false;
+                break;
+            }
+        }
+        if (isIllegalVertexBinding) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Illegal eager vertex binding added!");
+        }
+
+        // ... and the representative vertex bindings.
+        isIllegalVertexBinding = true;
+        for (LetClause representativeVertexBinding : representativeVertexBindings) {
+            if (representativeVertexBinding.getBindingExpr().equals(vertexBinding.getBindingExpr())
+                    && representativeVariable.equals(representativeVertexBinding.getVarExpr())) {
+                isIllegalVertexBinding = false;
+                break;
+            }
+        }
+        if (isIllegalVertexBinding) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Illegal eager vertex binding added!");
+        }
+        eagerVertexBindings.add(new Pair<>(representativeVariable, vertexBinding));
+    }
+
+    public void addUserDefinedCorrelateClause(AbstractBinaryCorrelateClause correlateClause) {
+        userCorrelateClauses.add(correlateClause);
+    }
+
+    public List<LetClause> getRepresentativeVertexBindings() {
+        return representativeVertexBindings;
+    }
+
+    public List<Pair<VariableExpr, LetClause>> getEagerVertexBindings() {
+        return eagerVertexBindings;
+    }
+
+    public List<LetClause> getRepresentativeEdgeBindings() {
+        return representativeEdgeBindings;
+    }
+
+    public List<LetClause> getRepresentativePathBindings() {
+        return representativePathBindings;
+    }
+
+    public List<AbstractClause> getNonRepresentativeClauses() {
+        return nonRepresentativeClauses;
+    }
+
+    public List<AbstractBinaryCorrelateClause> getUserDefinedCorrelateClauses() {
+        return userCorrelateClauses;
+    }
+
+    public SourceLocation getSourceLocation() {
+        return sourceLocation;
+    }
+
+    @Override
+    public Iterator<AbstractClause> iterator() {
+        Iterator<AbstractClause> nonRepresentativeIterator = nonRepresentativeClauses.iterator();
+        Iterator<LetClause> representativeVertexIterator = representativeVertexBindings.iterator();
+        Iterator<LetClause> representativeEdgeIterator = representativeEdgeBindings.iterator();
+        Iterator<LetClause> representativePathIterator = representativePathBindings.iterator();
+        Iterator<AbstractBinaryCorrelateClause> userCorrelateIterator = userCorrelateClauses.iterator();
+        return new Iterator<>() {
+            @Override
+            public boolean hasNext() {
+                return nonRepresentativeIterator.hasNext() || representativeVertexIterator.hasNext()
+                        || representativeEdgeIterator.hasNext() || representativePathIterator.hasNext()
+                        || userCorrelateIterator.hasNext();
+            }
+
+            @Override
+            public AbstractClause next() {
+                if (nonRepresentativeIterator.hasNext()) {
+                    return nonRepresentativeIterator.next();
+                }
+                if (representativeVertexIterator.hasNext()) {
+                    return representativeVertexIterator.next();
+                }
+                if (representativeEdgeIterator.hasNext()) {
+                    return representativeEdgeIterator.next();
+                }
+                if (representativePathIterator.hasNext()) {
+                    return representativePathIterator.next();
+                }
+                if (userCorrelateIterator.hasNext()) {
+                    return userCorrelateIterator.next();
+                }
+                throw new IllegalStateException();
+            }
+        };
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(nonRepresentativeClauses, representativeVertexBindings, representativeEdgeBindings,
+                eagerVertexBindings, representativePathBindings, userCorrelateClauses, sourceLocation);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof ClauseCollection)) {
+            return false;
+        }
+        ClauseCollection that = (ClauseCollection) object;
+        return Objects.equals(this.nonRepresentativeClauses, that.nonRepresentativeClauses)
+                && Objects.equals(this.representativeVertexBindings, that.representativeVertexBindings)
+                && Objects.equals(this.representativeEdgeBindings, that.representativeEdgeBindings)
+                && Objects.equals(this.representativePathBindings, that.representativePathBindings)
+                && Objects.equals(this.eagerVertexBindings, that.eagerVertexBindings)
+                && Objects.equals(this.userCorrelateClauses, that.userCorrelateClauses)
+                && Objects.equals(this.sourceLocation, that.sourceLocation);
+    }
+
+    @Override
+    public String toString() {
+        final Function<List<LetClause>, String> bindingPrinter = letClauses -> letClauses.stream()
+                .map(b -> b.getVarExpr().getVar().toString()).collect(Collectors.joining(","));
+        return String.format("clause-collection:\n\t%s\n\t%s\n\t%s\n",
+                "vertices: " + bindingPrinter.apply(representativeVertexBindings),
+                "edges: " + bindingPrinter.apply(representativeEdgeBindings),
+                "paths: " + bindingPrinter.apply(representativePathBindings));
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/CollectionTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/CollectionTable.java
new file mode 100644
index 0000000..29b1fa4
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/CollectionTable.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower.struct;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+public class CollectionTable implements Iterable<ClauseCollection> {
+    private final Map<ElementLabel, List<Entry>> collectionMap = new HashMap<>();
+    private Map<ElementLabel, StateContainer> inputMap;
+    private Map<ElementLabel, StateContainer> outputMap;
+
+    public static class Entry {
+        private final ElementLabel edgeLabel;
+        private final ElementLabel destinationLabel;
+        private final ClauseCollection clauseCollection;
+        private final EdgeDescriptor.EdgeDirection edgeDirection;
+
+        private Entry(ElementLabel edgeLabel, ElementLabel destinationLabel, ClauseCollection clauseCollection,
+                EdgeDescriptor.EdgeDirection edgeDirection) {
+            this.edgeLabel = edgeLabel;
+            this.destinationLabel = destinationLabel;
+            this.clauseCollection = clauseCollection;
+            this.edgeDirection = edgeDirection;
+        }
+
+        public ElementLabel getEdgeLabel() {
+            return edgeLabel;
+        }
+
+        public ElementLabel getDestinationLabel() {
+            return destinationLabel;
+        }
+
+        public ClauseCollection getClauseCollection() {
+            return clauseCollection;
+        }
+
+        public EdgeDescriptor.EdgeDirection getEdgeDirection() {
+            return edgeDirection;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(edgeLabel, destinationLabel, clauseCollection, edgeDirection);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (this == object) {
+                return true;
+            }
+            if (!(object instanceof Entry)) {
+                return false;
+            }
+            Entry that = (Entry) object;
+            return Objects.equals(this.edgeLabel, that.edgeLabel)
+                    && Objects.equals(this.destinationLabel, that.destinationLabel)
+                    && Objects.equals(this.clauseCollection, that.clauseCollection)
+                    && Objects.equals(this.edgeDirection, that.edgeDirection);
+        }
+    }
+
+    public void setInputMap(Map<ElementLabel, StateContainer> inputMap) {
+        this.inputMap = inputMap;
+    }
+
+    public void setOutputMap(Map<ElementLabel, StateContainer> outputMap) {
+        this.outputMap = outputMap;
+    }
+
+    public void putCollection(EdgePatternExpr edgePatternExpr, boolean isEvaluatingFromLeft,
+            ClauseCollection clauseCollection) {
+        // Determine our source and destination labels.
+        ElementLabel startLabel, edgeLabel, endLabel;
+        if (isEvaluatingFromLeft) {
+            startLabel = edgePatternExpr.getLeftVertex().getLabels().iterator().next();
+            endLabel = edgePatternExpr.getRightVertex().getLabels().iterator().next();
+
+        } else {
+            startLabel = edgePatternExpr.getRightVertex().getLabels().iterator().next();
+            endLabel = edgePatternExpr.getLeftVertex().getLabels().iterator().next();
+        }
+        edgeLabel = edgePatternExpr.getEdgeDescriptor().getEdgeLabels().iterator().next();
+
+        // Insert our collection.
+        EdgeDescriptor.EdgeDirection edgeDirection = edgePatternExpr.getEdgeDescriptor().getEdgeDirection();
+        putCollection(startLabel, edgeLabel, endLabel, clauseCollection, edgeDirection);
+    }
+
+    public void putCollection(ElementLabel startLabel, ElementLabel edgeLabel, ElementLabel endLabel,
+            ClauseCollection clauseCollection, EdgeDescriptor.EdgeDirection edgeDirection) {
+        if (!collectionMap.containsKey(startLabel)) {
+            collectionMap.put(startLabel, new ArrayList<>());
+        }
+        collectionMap.get(startLabel).add(new Entry(edgeLabel, endLabel, clauseCollection, edgeDirection));
+    }
+
+    public Map<ElementLabel, StateContainer> getInputMap() {
+        return inputMap;
+    }
+
+    public Map<ElementLabel, StateContainer> getOutputMap() {
+        return outputMap;
+    }
+
+    public Iterator<Pair<ElementLabel, List<Entry>>> entryIterator() {
+        return collectionMap.entrySet().stream().map(e -> new Pair<>(e.getKey(), e.getValue())).iterator();
+    }
+
+    @Override
+    public Iterator<ClauseCollection> iterator() {
+        return collectionMap.values().stream().flatMap(e -> e.stream().map(c -> c.clauseCollection)).iterator();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(collectionMap, inputMap, outputMap);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof CollectionTable)) {
+            return false;
+        }
+        CollectionTable that = (CollectionTable) object;
+        return Objects.equals(this.collectionMap, that.collectionMap) && Objects.equals(this.inputMap, that.inputMap)
+                && Objects.equals(this.outputMap, that.outputMap);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("collection-table: \n");
+        Iterator<Pair<ElementLabel, List<Entry>>> entryIterator = this.entryIterator();
+        while (entryIterator.hasNext()) {
+            Pair<ElementLabel, List<Entry>> mapEntry = entryIterator.next();
+            for (Entry entry : mapEntry.second) {
+                sb.append("\t").append(mapEntry.getFirst()).append(" to ");
+                sb.append(entry.getDestinationLabel()).append(" [ ");
+                sb.append(entry.getEdgeLabel()).append(" ]\n");
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/StateContainer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/StateContainer.java
new file mode 100644
index 0000000..379bf78
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/lower/struct/StateContainer.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.lower.struct;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import org.apache.asterix.lang.common.expression.VariableExpr;
+
+public class StateContainer implements Iterable<VariableExpr> {
+    private final VariableExpr iterationVariable;
+    private final VariableExpr joinVariable;
+
+    public StateContainer(VariableExpr iterationVariable, VariableExpr joinVariable) {
+        this.iterationVariable = iterationVariable;
+        this.joinVariable = joinVariable;
+    }
+
+    public VariableExpr getIterationVariable() {
+        return iterationVariable;
+    }
+
+    public VariableExpr getJoinVariable() {
+        return joinVariable;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(iterationVariable, joinVariable);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof StateContainer)) {
+            return false;
+        }
+        StateContainer that = (StateContainer) object;
+        return Objects.equals(this.iterationVariable, that.iterationVariable)
+                && Objects.equals(this.joinVariable, that.joinVariable);
+    }
+
+    @Override
+    public Iterator<VariableExpr> iterator() {
+        return List.of(iterationVariable, joinVariable).iterator();
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/GraphixASTPrintVisitor.java
similarity index 85%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/GraphixASTPrintVisitor.java
index fba1762..2f70c01 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/GraphixASTPrintVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.print;
+package org.apache.asterix.graphix.lang.rewrite.print;
 
 import java.io.PrintWriter;
 import java.util.List;
@@ -24,21 +24,19 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
 import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
 import org.apache.asterix.graphix.lang.statement.CreateGraphStatement;
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
-import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
 import org.apache.asterix.lang.sqlpp.visitor.SqlppAstPrintVisitor;
 
 public class GraphixASTPrintVisitor extends SqlppAstPrintVisitor implements IGraphixLangVisitor<Void, Integer> {
@@ -80,34 +78,9 @@
     }
 
     @Override
-    public Void visit(SelectBlock selectBlock, Integer step) throws CompilationException {
-        return (selectBlock instanceof GraphSelectBlock) ? this.visit((GraphSelectBlock) selectBlock, step)
-                : super.visit(selectBlock, step);
-    }
-
-    @Override
-    public Void visit(GraphSelectBlock graphSelectBlock, Integer step) throws CompilationException {
-        graphSelectBlock.getSelectClause().accept(this, step);
-        if (graphSelectBlock.hasFromClause()) {
-            graphSelectBlock.getFromClause().accept(this, step);
-
-        } else if (graphSelectBlock.hasFromGraphClause()) {
-            graphSelectBlock.getFromGraphClause().accept(this, step);
-        }
-        if (graphSelectBlock.hasLetWhereClauses()) {
-            for (AbstractClause letWhereClause : graphSelectBlock.getLetWhereList()) {
-                letWhereClause.accept(this, step);
-            }
-        }
-        if (graphSelectBlock.hasGroupbyClause()) {
-            graphSelectBlock.getGroupbyClause().accept(this, step);
-            if (graphSelectBlock.hasLetHavingClausesAfterGroupby()) {
-                for (AbstractClause letHavingClause : graphSelectBlock.getLetHavingListAfterGroupby()) {
-                    letHavingClause.accept(this, step);
-                }
-            }
-        }
-        return null;
+    public Void visit(FromClause fromClause, Integer step) throws CompilationException {
+        return (fromClause instanceof FromGraphClause) ? this.visit((FromGraphClause) fromClause, step)
+                : super.visit(fromClause, step);
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitorFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/GraphixASTPrintVisitorFactory.java
similarity index 95%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitorFactory.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/GraphixASTPrintVisitorFactory.java
index ff00077..f3955e6 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/GraphixASTPrintVisitorFactory.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/GraphixASTPrintVisitorFactory.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.print;
+package org.apache.asterix.graphix.lang.rewrite.print;
 
 import java.io.PrintWriter;
 
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/SqlppASTPrintQueryVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/SqlppASTPrintQueryVisitor.java
similarity index 84%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/SqlppASTPrintQueryVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/SqlppASTPrintQueryVisitor.java
index 0a1b942..33ef30e 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/print/SqlppASTPrintQueryVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/print/SqlppASTPrintQueryVisitor.java
@@ -14,20 +14,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.print;
+package org.apache.asterix.graphix.lang.rewrite.print;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Spliterator;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import java.util.stream.StreamSupport;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.graphix.lang.clause.CorrWhereClause;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.CollectionTable;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.lang.common.base.AbstractClause;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.base.IVisitorExtension;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.clause.LimitClause;
@@ -35,7 +45,6 @@
 import org.apache.asterix.lang.common.clause.WhereClause;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.FieldAccessor;
-import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
 import org.apache.asterix.lang.common.expression.IfExpr;
 import org.apache.asterix.lang.common.expression.IndexAccessor;
 import org.apache.asterix.lang.common.expression.ListConstructor;
@@ -47,6 +56,7 @@
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.statement.Query;
+import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
 import org.apache.asterix.lang.sqlpp.clause.FromClause;
@@ -69,16 +79,11 @@
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppQueryExpressionVisitor;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
+import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 
 /**
- * Visitor class to create a _valid_ SQL++ query out of a **valid** AST. The only exception to the validity of the
- * printed SQL++ is the presence of {@link CorrLetClause} and {@link CorrWhereClause}, denoted using "WITH ..." before
- * (or after) JOIN / UNNEST clauses. We make the following assumptions:
- * 1. The entry point is a {@link Query}, which we will print to.
- * 2. All {@link GroupbyClause} nodes only have one set of {@link GbyVariableExpressionPair} (i.e. the GROUP-BY
- * rewrites should have fired).
- * 3. No {@link WindowExpression} nodes are included (this is on the TODO list).
+ * Visitor class to create a somewhat-valid SQL++ query out of a <b>valid</b> AST.
  */
 public class SqlppASTPrintQueryVisitor extends AbstractSqlppQueryExpressionVisitor<String, Void> {
     private final PrintWriter printWriter;
@@ -194,8 +199,58 @@
 
     @Override
     public String visit(FromClause fromClause, Void arg) {
-        return String.format(" FROM %s ", fromClause.getFromTerms().stream().map(this::visitAndSwallowException)
-                .collect(Collectors.joining(", ")));
+        final Function<AbstractClause, String> abstractClauseFormatter = c -> {
+            if (c.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                return " LET " + visitAndSwallowException(c);
+
+            } else if (c.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
+                return " WHERE " + visitAndSwallowException(c);
+            }
+            return visitAndSwallowException(c);
+        };
+        final Function<LowerSwitchClause, String> fixedPointClauseFormatter = c -> {
+            LowerSwitchClause.ClauseOutputEnvironment outputEnvironment = c.getClauseOutputEnvironment();
+            String outputString =
+                    String.format("`%s` = { \"vertex-iteration\": `%s`, \"vertex-join\": `%s`, \"path\": `%s` }",
+                            formatIdentifierForQuery(outputEnvironment.getOutputVariable().getVar()),
+                            formatIdentifierForQuery(outputEnvironment.getOutputVertexIterationVariable().getVar()),
+                            formatIdentifierForQuery(outputEnvironment.getOutputVertexJoinVariable().getVar()),
+                            formatIdentifierForQuery(outputEnvironment.getPathVariable().getVar()));
+            Iterator<Pair<ElementLabel, List<CollectionTable.Entry>>> entryIterator =
+                    c.getCollectionLookupTable().entryIterator();
+            List<String> collectionKeyValuePairStrings = new ArrayList<>();
+            while (entryIterator.hasNext()) {
+                Pair<ElementLabel, List<CollectionTable.Entry>> mapEntry = entryIterator.next();
+                for (CollectionTable.Entry entry : mapEntry.second) {
+                    collectionKeyValuePairStrings
+                            .add(String.format("\"%s TO %s [ %s ] TO %s\":  [ %s ] ", mapEntry.getFirst(),
+                                    entry.getEdgeLabel(), entry.getEdgeDirection(), entry.getDestinationLabel(),
+                                    StreamSupport.stream(entry.getClauseCollection().spliterator(), false)
+                                            .map(abstractClauseFormatter).collect(Collectors.joining(", "))));
+                }
+            }
+            ElementLabel startingLabel = c.getClauseInputEnvironment().getStartingLabel();
+            return String.format("%s = { \"StartLabel\": %s, %s }", outputString, startingLabel,
+                    String.join(",", collectionKeyValuePairStrings));
+        };
+
+        if (fromClause instanceof FromGraphClause) {
+            FromGraphClause fromGraphClause = (FromGraphClause) fromClause;
+            LowerListClause lowerClause = (LowerListClause) fromGraphClause.getLowerClause();
+            Spliterator<AbstractClause> clauseCollectionIterator = lowerClause.getClauseCollection().spliterator();
+            return String.format(" FROM %s ", StreamSupport.stream(clauseCollectionIterator, false).map(c -> {
+                if (c instanceof LowerSwitchClause) {
+                    return " FIXED-POINT " + fixedPointClauseFormatter.apply((LowerSwitchClause) c);
+
+                } else {
+                    return abstractClauseFormatter.apply(c);
+                }
+            }).collect(Collectors.joining(", ")));
+
+        } else {
+            return String.format(" FROM %s ", fromClause.getFromTerms().stream().map(this::visitAndSwallowException)
+                    .collect(Collectors.joining(", ")));
+        }
     }
 
     @Override
@@ -211,9 +266,6 @@
             sb.append(fromTerm.getPositionalVariable().accept(this, arg));
         }
         for (AbstractBinaryCorrelateClause correlateClause : fromTerm.getCorrelateClauses()) {
-            if (correlateClause instanceof CorrLetClause || correlateClause instanceof CorrWhereClause) {
-                sb.append(" WITH ");
-            }
             sb.append(correlateClause.accept(this, arg));
         }
         return sb.toString();
@@ -238,11 +290,9 @@
             sb.append(groupbyClause.getGroupVar().accept(this, arg));
             if (groupbyClause.hasGroupFieldList()) {
                 sb.append(" ( ");
-                sb.append(
-                        groupbyClause.getGroupFieldList().stream()
-                                .map(f -> visitAndSwallowException(f.first) + " AS "
-                                        + formatIdentifierForQuery(f.second.getValue()))
-                                .collect(Collectors.joining(", ")));
+                sb.append(groupbyClause.getGroupFieldList().stream()
+                        .map(f -> visitAndSwallowException(f.first) + " AS " + formatIdentifierForQuery(f.second))
+                        .collect(Collectors.joining(", ")));
                 sb.append(" ) ");
             }
         }
@@ -441,7 +491,7 @@
 
     @Override
     public String visit(VariableExpr variableExpr, Void arg) {
-        return "`" + formatIdentifierForQuery(variableExpr.getVar().getValue()) + "`";
+        return "`" + formatIdentifierForQuery(variableExpr.getVar()) + "`";
     }
 
     @Override
@@ -560,8 +610,8 @@
 
     @Override
     public String visit(FieldAccessor fieldAccessor, Void arg) throws CompilationException {
-        return fieldAccessor.getExpr().accept(this, arg) + ".`"
-                + formatIdentifierForQuery(fieldAccessor.getIdent().getValue()) + "`";
+        return fieldAccessor.getExpr().accept(this, arg) + ".`" + formatIdentifierForQuery(fieldAccessor.getIdent())
+                + "`";
     }
 
     @Override
@@ -595,6 +645,12 @@
     }
 
     @Override
+    public String visit(IVisitorExtension extensionClause, Void arg) throws CompilationException {
+        // TODO (GLENN): Push this class to AsterixDB, and create a hook.
+        return null;
+    }
+
+    @Override
     public String visit(UnaryExpr unaryExpr, Void arg) throws CompilationException {
         StringBuilder sb = new StringBuilder();
         if (unaryExpr.getExprType() != null) {
@@ -665,7 +721,7 @@
 
     @Override
     public String visit(WindowExpression windowExpression, Void arg) {
-        // TODO: Add support for WINDOW-EXPR here.
+        // TODO (GLENN): Add support for WINDOW-EXPR here.
         throw new NotImplementedException("WindowExpression not currently supported!");
     }
 
@@ -693,4 +749,8 @@
             return identifier;
         }
     }
+
+    private String formatIdentifierForQuery(Identifier identifier) {
+        return formatIdentifierForQuery(identifier.getValue());
+    }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/ExhaustiveSearchResolver.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/ExhaustiveSearchResolver.java
new file mode 100644
index 0000000..4c52a53
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/ExhaustiveSearchResolver.java
@@ -0,0 +1,502 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.resolve;
+
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.expandElementLabels;
+import static org.apache.asterix.graphix.lang.rewrite.util.CanonicalElementUtil.expandFixedPathPattern;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.graphix.lang.annotation.SubqueryVertexJoinAnnotation;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor.EdgeDirection;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.struct.PatternGroup;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+
+public class ExhaustiveSearchResolver implements IPatternGroupResolver {
+    private final GraphixDeepCopyVisitor deepCopyVisitor;
+    private final SchemaKnowledgeTable schemaKnowledgeTable;
+
+    // Vertex / edge expression map to a list of canonical vertex / edge expressions.
+    private final Map<VariableExpr, List<AbstractExpression>> canonicalExpressionsMap;
+    private final Map<VariableExpr, AbstractExpression> originalExpressionMap;
+
+    public ExhaustiveSearchResolver(SchemaKnowledgeTable schemaKnowledgeTable) {
+        this.schemaKnowledgeTable = schemaKnowledgeTable;
+        this.deepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.canonicalExpressionsMap = new LinkedHashMap<>();
+        this.originalExpressionMap = new LinkedHashMap<>();
+    }
+
+    private void expandVertexPattern(VertexPatternExpr unexpandedVertexPattern, Deque<PatternGroup> inputPatternGroups,
+            Deque<PatternGroup> outputPatternGroups) throws CompilationException {
+        VariableExpr vertexVariable = unexpandedVertexPattern.getVariableExpr();
+        Set<ElementLabel> vertexLabelSet = unexpandedVertexPattern.getLabels();
+        Set<ElementLabel> expandedLabelSet =
+                expandElementLabels(unexpandedVertexPattern, vertexLabelSet, schemaKnowledgeTable);
+        while (!inputPatternGroups.isEmpty()) {
+            PatternGroup unexpandedPatternGroup = inputPatternGroups.pop();
+            for (ElementLabel vertexLabel : expandedLabelSet) {
+                PatternGroup expandedPatternGroup = new PatternGroup();
+                for (VertexPatternExpr vertexPatternExpr : unexpandedPatternGroup.getVertexPatternSet()) {
+                    VertexPatternExpr clonedVertexPattern = deepCopyVisitor.visit(vertexPatternExpr, null);
+                    SubqueryVertexJoinAnnotation hint = vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                    if (vertexPatternExpr.getVariableExpr().equals(vertexVariable)
+                            || (hint != null && hint.getSourceVertexVariable().equals(vertexVariable))) {
+                        clonedVertexPattern.getLabels().clear();
+                        clonedVertexPattern.getLabels().add(vertexLabel);
+                    }
+                    expandedPatternGroup.getVertexPatternSet().add(clonedVertexPattern);
+                }
+                for (EdgePatternExpr unexpandedEdgePattern : unexpandedPatternGroup.getEdgePatternSet()) {
+                    EdgePatternExpr clonedEdgePattern = deepCopyVisitor.visit(unexpandedEdgePattern, null);
+                    VertexPatternExpr clonedLeftVertex = clonedEdgePattern.getLeftVertex();
+                    SubqueryVertexJoinAnnotation hint1 = clonedLeftVertex.findHint(SubqueryVertexJoinAnnotation.class);
+                    if (clonedLeftVertex.getVariableExpr().equals(vertexVariable)
+                            || (hint1 != null && hint1.getSourceVertexVariable().equals(vertexVariable))) {
+                        clonedLeftVertex.getLabels().clear();
+                        clonedLeftVertex.getLabels().add(vertexLabel);
+                    }
+
+                    VertexPatternExpr clonedRightVertex = clonedEdgePattern.getRightVertex();
+                    SubqueryVertexJoinAnnotation hint2 = clonedLeftVertex.findHint(SubqueryVertexJoinAnnotation.class);
+                    if (clonedRightVertex.getVariableExpr().equals(vertexVariable)
+                            || (hint2 != null && hint2.getSourceVertexVariable().equals(vertexVariable))) {
+                        clonedRightVertex.getLabels().clear();
+                        clonedRightVertex.getLabels().add(vertexLabel);
+                    }
+                    expandedPatternGroup.getEdgePatternSet().add(clonedEdgePattern);
+                }
+                unifyVertexLabels(expandedPatternGroup);
+                outputPatternGroups.push(expandedPatternGroup);
+            }
+        }
+    }
+
+    private void expandEdgePattern(EdgePatternExpr unexpandedEdgePattern, Deque<PatternGroup> inputPatternGroups,
+            Deque<PatternGroup> outputPatternGroups) throws CompilationException {
+        EdgeDescriptor unexpandedEdgeDescriptor = unexpandedEdgePattern.getEdgeDescriptor();
+        VariableExpr edgeVariable = unexpandedEdgeDescriptor.getVariableExpr();
+        Set<ElementLabel> edgeLabelSet = unexpandedEdgeDescriptor.getEdgeLabels();
+        Set<ElementLabel> expandedLabelSet =
+                expandElementLabels(unexpandedEdgePattern, edgeLabelSet, schemaKnowledgeTable);
+
+        // Determine the direction of our edge.
+        Set<EdgeDirection> edgeDirectionSet = new HashSet<>();
+        if (unexpandedEdgeDescriptor.getEdgeDirection() != EdgeDirection.RIGHT_TO_LEFT) {
+            edgeDirectionSet.add(EdgeDirection.LEFT_TO_RIGHT);
+        }
+        if (unexpandedEdgeDescriptor.getEdgeDirection() != EdgeDirection.LEFT_TO_RIGHT) {
+            edgeDirectionSet.add(EdgeDirection.RIGHT_TO_LEFT);
+        }
+
+        // Expand an edge pattern.
+        while (!inputPatternGroups.isEmpty()) {
+            PatternGroup unexpandedPatternGroup = inputPatternGroups.pop();
+            for (ElementLabel edgeLabel : expandedLabelSet) {
+                for (EdgeDirection edgeDirection : edgeDirectionSet) {
+                    PatternGroup expandedPatternGroup = new PatternGroup();
+                    expandedPatternGroup.getVertexPatternSet().addAll(unexpandedPatternGroup.getVertexPatternSet());
+                    for (EdgePatternExpr edgePatternExpr : unexpandedPatternGroup.getEdgePatternSet()) {
+                        // Update our edge descriptor, if necessary.
+                        EdgePatternExpr clonedEdgePattern = deepCopyVisitor.visit(edgePatternExpr, null);
+                        if (edgeVariable.equals(edgePatternExpr.getEdgeDescriptor().getVariableExpr())) {
+                            clonedEdgePattern.getEdgeDescriptor().getEdgeLabels().clear();
+                            clonedEdgePattern.getEdgeDescriptor().getEdgeLabels().add(edgeLabel);
+                            clonedEdgePattern.getEdgeDescriptor().setEdgeDirection(edgeDirection);
+                        }
+                        expandedPatternGroup.getEdgePatternSet().add(clonedEdgePattern);
+                    }
+                    unifyVertexLabels(expandedPatternGroup);
+                    outputPatternGroups.push(expandedPatternGroup);
+                }
+            }
+        }
+    }
+
+    private void expandPathPattern(EdgePatternExpr unexpandedPathPattern, Deque<PatternGroup> inputPatternGroups,
+            Deque<PatternGroup> outputPatternGroups) throws CompilationException {
+        EdgeDescriptor unexpandedEdgeDescriptor = unexpandedPathPattern.getEdgeDescriptor();
+        VariableExpr edgeVariable = unexpandedEdgeDescriptor.getVariableExpr();
+        Set<ElementLabel> edgeLabelSet = unexpandedEdgeDescriptor.getEdgeLabels();
+        Set<ElementLabel> expandedEdgeLabelSet =
+                expandElementLabels(unexpandedPathPattern, edgeLabelSet, schemaKnowledgeTable);
+
+        // Determine our candidates for internal vertex labels.
+        Set<ElementLabel> vertexLabelSet = schemaKnowledgeTable.getVertexLabels();
+
+        // Determine the direction of our edges.
+        Set<EdgeDirection> edgeDirectionSet = new HashSet<>();
+        if (unexpandedEdgeDescriptor.getEdgeDirection() != EdgeDirection.RIGHT_TO_LEFT) {
+            edgeDirectionSet.add(EdgeDirection.LEFT_TO_RIGHT);
+        }
+        if (unexpandedEdgeDescriptor.getEdgeDirection() != EdgeDirection.LEFT_TO_RIGHT) {
+            edgeDirectionSet.add(EdgeDirection.RIGHT_TO_LEFT);
+        }
+
+        // Determine the length of **expanded** path. For {N,M} w/ E labels... MIN(M, (1 + 2(E-1))).
+        int minimumExpansionLength, expansionLength;
+        Integer minimumHops = unexpandedEdgeDescriptor.getMinimumHops();
+        Integer maximumHops = unexpandedEdgeDescriptor.getMaximumHops();
+        if (Objects.equals(minimumHops, maximumHops) && minimumHops != null && minimumHops == 1) {
+            // Special case: we have a path disguised as an edge.
+            minimumExpansionLength = 1;
+            expansionLength = 1;
+
+        } else {
+            int maximumExpansionLength = 1 + 2 * (expandedEdgeLabelSet.size() - 1);
+            minimumExpansionLength = Objects.requireNonNullElse(minimumHops, 1);
+            expansionLength = Objects.requireNonNullElse(maximumHops, maximumExpansionLength);
+            if (minimumExpansionLength > expansionLength) {
+                minimumExpansionLength = expansionLength;
+            }
+        }
+
+        // Generate all possible paths, from minimumExpansionLength to expansionLength.
+        List<List<EdgePatternExpr>> candidatePaths = new ArrayList<>();
+        for (int pathLength = minimumExpansionLength; pathLength <= expansionLength; pathLength++) {
+            List<List<EdgePatternExpr>> expandedPathPattern = expandFixedPathPattern(pathLength, unexpandedPathPattern,
+                    expandedEdgeLabelSet, vertexLabelSet, edgeDirectionSet, deepCopyVisitor,
+                    () -> deepCopyVisitor.visit(unexpandedPathPattern.getInternalVertex(), null));
+            candidatePaths.addAll(expandedPathPattern);
+        }
+
+        // Push the labels of our pattern group to our edge.
+        final BiConsumer<PatternGroup, EdgePatternExpr> vertexLabelUpdater = (p, e) -> {
+            VariableExpr leftVariable = e.getLeftVertex().getVariableExpr();
+            VariableExpr rightVariable = e.getRightVertex().getVariableExpr();
+            p.getVertexPatternSet().forEach(v -> {
+                VariableExpr vertexVariable = v.getVariableExpr();
+                if (leftVariable.equals(vertexVariable)) {
+                    e.getLeftVertex().getLabels().clear();
+                    e.getLeftVertex().getLabels().addAll(v.getLabels());
+                }
+                if (rightVariable.equals(vertexVariable)) {
+                    e.getRightVertex().getLabels().clear();
+                    e.getRightVertex().getLabels().addAll(v.getLabels());
+                }
+            });
+        };
+
+        // Push our expansion to our pattern groups.
+        while (!inputPatternGroups.isEmpty()) {
+            PatternGroup unexpandedPatternGroup = inputPatternGroups.pop();
+            for (List<EdgePatternExpr> candidatePath : candidatePaths) {
+                PatternGroup expandedPatternGroup = new PatternGroup();
+                expandedPatternGroup.getVertexPatternSet().addAll(unexpandedPatternGroup.getVertexPatternSet());
+                for (EdgePatternExpr edgePatternExpr : unexpandedPatternGroup.getEdgePatternSet()) {
+                    if (edgePatternExpr.getEdgeDescriptor().getVariableExpr().equals(edgeVariable)) {
+                        for (EdgePatternExpr candidateEdge : candidatePath) {
+                            EdgePatternExpr copyEdgePattern = deepCopyVisitor.visit(candidateEdge, null);
+                            vertexLabelUpdater.accept(expandedPatternGroup, copyEdgePattern);
+                            expandedPatternGroup.getEdgePatternSet().add(copyEdgePattern);
+                        }
+
+                    } else {
+                        EdgePatternExpr copyEdgePattern = deepCopyVisitor.visit(edgePatternExpr, null);
+                        vertexLabelUpdater.accept(expandedPatternGroup, copyEdgePattern);
+                        expandedPatternGroup.getEdgePatternSet().add(copyEdgePattern);
+                    }
+                }
+                outputPatternGroups.push(expandedPatternGroup);
+            }
+        }
+    }
+
+    private List<PatternGroup> expandPatternGroups(PatternGroup patternGroup) throws CompilationException {
+        // First pass: unify our vertex labels.
+        unifyVertexLabels(patternGroup);
+
+        // Second pass: collect all ambiguous graph elements.
+        Set<AbstractExpression> ambiguousExpressionSet = new LinkedHashSet<>();
+        for (AbstractExpression originalExpr : patternGroup) {
+            if (originalExpr instanceof VertexPatternExpr) {
+                VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) originalExpr;
+                if (vertexPatternExpr.getLabels().size() != 1
+                        || vertexPatternExpr.getLabels().iterator().next().isNegated()) {
+                    ambiguousExpressionSet.add(vertexPatternExpr);
+                }
+
+            } else { // originalExpr instanceof EdgePatternExpr
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) originalExpr;
+                EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+                if (edgeDescriptor.getEdgeLabels().size() != 1
+                        || edgeDescriptor.getEdgeLabels().iterator().next().isNegated()
+                        || edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH
+                        || edgeDescriptor.getEdgeDirection() == EdgeDirection.UNDIRECTED) {
+                    ambiguousExpressionSet.add(edgePatternExpr);
+                }
+            }
+        }
+        if (ambiguousExpressionSet.isEmpty()) {
+            // Our list must always be mutable.
+            return new ArrayList<>(List.of(patternGroup));
+        }
+
+        // Third pass: expand the ambiguous expressions.
+        Deque<PatternGroup> redPatternGroups = new ArrayDeque<>();
+        Deque<PatternGroup> blackPatternGroups = new ArrayDeque<>();
+        redPatternGroups.add(patternGroup);
+        for (AbstractExpression ambiguousExpression : ambiguousExpressionSet) {
+            // Determine our read and write pattern groups.
+            Deque<PatternGroup> readPatternGroups, writePatternGroups;
+            if (redPatternGroups.isEmpty()) {
+                readPatternGroups = blackPatternGroups;
+                writePatternGroups = redPatternGroups;
+
+            } else {
+                readPatternGroups = redPatternGroups;
+                writePatternGroups = blackPatternGroups;
+            }
+
+            // Expand our vertex / edge patterns.
+            if (ambiguousExpression instanceof VertexPatternExpr) {
+                VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) ambiguousExpression;
+                expandVertexPattern(vertexPatternExpr, readPatternGroups, writePatternGroups);
+
+            } else { // ambiguousExpression instance EdgePatternExpr
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) ambiguousExpression;
+                if (edgePatternExpr.getEdgeDescriptor().getPatternType() == EdgeDescriptor.PatternType.EDGE) {
+                    expandEdgePattern(edgePatternExpr, readPatternGroups, writePatternGroups);
+
+                } else { // edgePatternExpr.getEdgeDescriptor().getPatternType() == EdgeDescriptor.PatternType.PATH
+                    expandPathPattern(edgePatternExpr, readPatternGroups, writePatternGroups);
+                }
+            }
+        }
+        return new ArrayList<>(redPatternGroups.isEmpty() ? blackPatternGroups : redPatternGroups);
+    }
+
+    private List<PatternGroup> pruneInvalidPatternGroups(List<PatternGroup> sourceGroups) {
+        ListIterator<PatternGroup> sourceGroupIterator = sourceGroups.listIterator();
+        while (sourceGroupIterator.hasNext()) {
+            PatternGroup workingPatternGroup = sourceGroupIterator.next();
+            for (AbstractExpression abstractExpression : workingPatternGroup) {
+                if (!(abstractExpression instanceof EdgePatternExpr)) {
+                    continue;
+                }
+
+                // Prune any groups with bad edges.
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) abstractExpression;
+                if (!schemaKnowledgeTable.isValidEdge(edgePatternExpr)) {
+                    sourceGroupIterator.remove();
+                    break;
+                }
+            }
+        }
+        return sourceGroups;
+    }
+
+    private void unifyVertexLabels(PatternGroup patternGroup) {
+        // Pass #1: Collect all vertex variables and their labels.
+        Map<VariableExpr, Set<ElementLabel>> vertexVariableMap = new HashMap<>();
+        for (AbstractExpression abstractExpression : patternGroup) {
+            if (abstractExpression instanceof VertexPatternExpr) {
+                VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) abstractExpression;
+                VariableExpr vertexVariable = vertexPatternExpr.getVariableExpr();
+                vertexVariableMap.putIfAbsent(vertexVariable, new HashSet<>());
+                vertexVariableMap.get(vertexVariable).addAll(vertexPatternExpr.getLabels());
+                SubqueryVertexJoinAnnotation hint = vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                if (hint != null) {
+                    VariableExpr sourceVertexVariable = hint.getSourceVertexVariable();
+                    vertexVariableMap.putIfAbsent(sourceVertexVariable, new HashSet<>());
+                    vertexVariableMap.get(sourceVertexVariable).addAll(vertexPatternExpr.getLabels());
+                }
+
+            } else { // abstractExpression instanceof EdgePatternExpr
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) abstractExpression;
+                VertexPatternExpr leftVertexExpr = edgePatternExpr.getLeftVertex();
+                VertexPatternExpr rightVertexExpr = edgePatternExpr.getRightVertex();
+                VariableExpr leftVariable = leftVertexExpr.getVariableExpr();
+                VariableExpr rightVariable = rightVertexExpr.getVariableExpr();
+
+                // Visit the vertices of our edges and their labels as well.
+                vertexVariableMap.putIfAbsent(leftVariable, new HashSet<>());
+                vertexVariableMap.putIfAbsent(rightVariable, new HashSet<>());
+                vertexVariableMap.get(leftVariable).addAll(leftVertexExpr.getLabels());
+                vertexVariableMap.get(rightVariable).addAll(rightVertexExpr.getLabels());
+                SubqueryVertexJoinAnnotation leftHint = leftVertexExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                SubqueryVertexJoinAnnotation rightHint = rightVertexExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                if (leftHint != null) {
+                    VariableExpr sourceVertexVariable = leftHint.getSourceVertexVariable();
+                    vertexVariableMap.putIfAbsent(sourceVertexVariable, new HashSet<>());
+                    vertexVariableMap.get(sourceVertexVariable).addAll(leftVertexExpr.getLabels());
+                }
+                if (rightHint != null) {
+                    VariableExpr sourceVertexVariable = rightHint.getSourceVertexVariable();
+                    vertexVariableMap.putIfAbsent(sourceVertexVariable, new HashSet<>());
+                    vertexVariableMap.get(sourceVertexVariable).addAll(rightVertexExpr.getLabels());
+                }
+            }
+        }
+
+        // Pass #2: Copy the vertex label sets to all vertices of the same variable.
+        for (AbstractExpression abstractExpression : patternGroup) {
+            if (abstractExpression instanceof VertexPatternExpr) {
+                VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) abstractExpression;
+                VariableExpr vertexVariable = vertexPatternExpr.getVariableExpr();
+                vertexPatternExpr.getLabels().addAll(vertexVariableMap.get(vertexVariable));
+                SubqueryVertexJoinAnnotation hint = vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                if (hint != null) {
+                    vertexPatternExpr.getLabels().addAll(vertexVariableMap.get(hint.getSourceVertexVariable()));
+                }
+
+            } else { // abstractExpression instanceof EdgePatternExpr
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) abstractExpression;
+                VertexPatternExpr leftVertexExpr = edgePatternExpr.getLeftVertex();
+                VertexPatternExpr rightVertexExpr = edgePatternExpr.getRightVertex();
+
+                // Visit the vertices of our edge as well.
+                VariableExpr leftVariable = leftVertexExpr.getVariableExpr();
+                VariableExpr rightVariable = rightVertexExpr.getVariableExpr();
+                leftVertexExpr.getLabels().addAll(vertexVariableMap.get(leftVariable));
+                rightVertexExpr.getLabels().addAll(vertexVariableMap.get(rightVariable));
+                SubqueryVertexJoinAnnotation leftHint = leftVertexExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                SubqueryVertexJoinAnnotation rightHint = rightVertexExpr.findHint(SubqueryVertexJoinAnnotation.class);
+                if (leftHint != null) {
+                    leftVertexExpr.getLabels().addAll(vertexVariableMap.get(leftHint.getSourceVertexVariable()));
+                }
+                if (rightHint != null) {
+                    rightVertexExpr.getLabels().addAll(vertexVariableMap.get(rightHint.getSourceVertexVariable()));
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public void resolve(PatternGroup patternGroup) throws CompilationException {
+        // Populate our vertex / edge expression map.
+        for (VertexPatternExpr vertexPatternExpr : patternGroup.getVertexPatternSet()) {
+            VariableExpr vertexVariable = vertexPatternExpr.getVariableExpr();
+            canonicalExpressionsMap.putIfAbsent(vertexVariable, new ArrayList<>());
+            originalExpressionMap.put(vertexVariable, vertexPatternExpr);
+        }
+        for (EdgePatternExpr edgePatternExpr : patternGroup.getEdgePatternSet()) {
+            EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+            VariableExpr edgeVariable = edgeDescriptor.getVariableExpr();
+            canonicalExpressionsMap.putIfAbsent(edgeVariable, new ArrayList<>());
+            originalExpressionMap.put(edgeVariable, edgePatternExpr);
+        }
+
+        // Expand the given pattern group and then prune the invalid pattern groups.
+        List<PatternGroup> validPatternGroups = pruneInvalidPatternGroups(expandPatternGroups(patternGroup));
+        for (PatternGroup validPatternGroup : validPatternGroups) {
+            for (AbstractExpression canonicalExpr : validPatternGroup) {
+                if (canonicalExpr instanceof VertexPatternExpr) {
+                    VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) canonicalExpr;
+                    VariableExpr vertexVariable = vertexPatternExpr.getVariableExpr();
+                    canonicalExpressionsMap.get(vertexVariable).add(deepCopyVisitor.visit(vertexPatternExpr, null));
+
+                } else { // canonicalExpr instanceof EdgePatternExpr
+                    EdgePatternExpr edgePatternExpr = (EdgePatternExpr) canonicalExpr;
+                    EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+                    VariableExpr edgeVariable = edgeDescriptor.getVariableExpr();
+                    canonicalExpressionsMap.get(edgeVariable).add(deepCopyVisitor.visit(edgePatternExpr, null));
+
+                    // We must also visit the vertices of our edge (to find internal vertices).
+                    VertexPatternExpr leftVertex = edgePatternExpr.getLeftVertex();
+                    VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
+                    VariableExpr leftVariable = leftVertex.getVariableExpr();
+                    VariableExpr rightVariable = rightVertex.getVariableExpr();
+                    canonicalExpressionsMap.putIfAbsent(leftVariable, new ArrayList<>());
+                    canonicalExpressionsMap.putIfAbsent(rightVariable, new ArrayList<>());
+                    canonicalExpressionsMap.get(leftVariable).add(deepCopyVisitor.visit(leftVertex, null));
+                    canonicalExpressionsMap.get(rightVariable).add(deepCopyVisitor.visit(rightVertex, null));
+                }
+            }
+        }
+
+        // Propagate the facts of our expression map to the original expressions.
+        final Function<VariableExpr, Stream<VertexPatternExpr>> canonicalVertexStreamProvider =
+                v -> canonicalExpressionsMap.get(v).stream().map(t -> (VertexPatternExpr) t);
+        final Function<VariableExpr, Stream<EdgePatternExpr>> canonicalEdgeStreamProvider =
+                v -> canonicalExpressionsMap.get(v).stream().map(t -> (EdgePatternExpr) t);
+        for (Map.Entry<VariableExpr, AbstractExpression> mapEntry : originalExpressionMap.entrySet()) {
+            if (canonicalExpressionsMap.get(mapEntry.getKey()).isEmpty()) {
+                SourceLocation sourceLocation = mapEntry.getValue().getSourceLocation();
+                throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLocation,
+                        "Encountered graph element that does not conform the queried graph schema!");
+            }
+
+            if (mapEntry.getValue() instanceof VertexPatternExpr) {
+                VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) mapEntry.getValue();
+                vertexPatternExpr.getLabels().clear();
+                Stream<VertexPatternExpr> vertexStream = canonicalVertexStreamProvider.apply(mapEntry.getKey());
+                vertexStream.forEach(v -> vertexPatternExpr.getLabels().addAll(v.getLabels()));
+
+            } else { // originalExpr instanceof EdgePatternExpr
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) mapEntry.getValue();
+                EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+                Integer maximumHopLength = edgeDescriptor.getMaximumHops();
+
+                // Update our edge labels.
+                edgeDescriptor.getEdgeLabels().clear();
+                Stream<EdgePatternExpr> edgeStream = canonicalEdgeStreamProvider.apply(mapEntry.getKey());
+                edgeStream.forEach(e -> edgeDescriptor.getEdgeLabels().addAll(e.getEdgeDescriptor().getEdgeLabels()));
+
+                // Update our direction, if we have resolved it.
+                Set<EdgeDirection> resolvedDirections = canonicalEdgeStreamProvider.apply(mapEntry.getKey())
+                        .map(e -> e.getEdgeDescriptor().getEdgeDirection()).collect(Collectors.toSet());
+                if (resolvedDirections.size() == 1) {
+                    edgeDescriptor.setEdgeDirection(resolvedDirections.iterator().next());
+                }
+
+                // Update the vertex references of our edge.
+                VariableExpr leftVariable = edgePatternExpr.getLeftVertex().getVariableExpr();
+                VariableExpr rightVariable = edgePatternExpr.getRightVertex().getVariableExpr();
+                edgePatternExpr.getLeftVertex().getLabels().clear();
+                edgePatternExpr.getRightVertex().getLabels().clear();
+                Stream<VertexPatternExpr> leftStream = canonicalVertexStreamProvider.apply(leftVariable);
+                Stream<VertexPatternExpr> rightStream = canonicalVertexStreamProvider.apply(rightVariable);
+                leftStream.forEach(v -> edgePatternExpr.getLeftVertex().getLabels().addAll(v.getLabels()));
+                rightStream.forEach(v -> edgePatternExpr.getRightVertex().getLabels().addAll(v.getLabels()));
+                if (edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH && maximumHopLength != 1) {
+                    VariableExpr internalVariable = edgePatternExpr.getInternalVertex().getVariableExpr();
+                    edgePatternExpr.getInternalVertex().getLabels().clear();
+                    Stream<VertexPatternExpr> internalStream = canonicalVertexStreamProvider.apply(internalVariable);
+                    internalStream.forEach(v -> edgePatternExpr.getInternalVertex().getLabels().addAll(v.getLabels()));
+                }
+            }
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/IInternalVertexSupplier.java
similarity index 79%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/IInternalVertexSupplier.java
index 4509792..931f979 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/IInternalVertexSupplier.java
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.lang.rewrite.resolve;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
 
 @FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+public interface IInternalVertexSupplier {
+    VertexPatternExpr get() throws CompilationException;
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/IPatternGroupResolver.java
similarity index 79%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/IPatternGroupResolver.java
index 4509792..c0129fb 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/IPatternGroupResolver.java
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
+package org.apache.asterix.graphix.lang.rewrite.resolve;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.struct.PatternGroup;
 
 @FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
+public interface IPatternGroupResolver {
+    void resolve(PatternGroup patternGroup) throws CompilationException;
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/SchemaKnowledgeTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/SchemaKnowledgeTable.java
new file mode 100644
index 0000000..e0eb8ad
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/resolve/SchemaKnowledgeTable.java
@@ -0,0 +1,227 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.resolve;
+
+import static org.apache.asterix.graphix.extension.GraphixMetadataExtension.getGraph;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.GraphConstructor;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.metadata.entity.schema.Edge;
+import org.apache.asterix.graphix.metadata.entity.schema.Graph;
+import org.apache.asterix.graphix.metadata.entity.schema.Vertex;
+import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+
+/**
+ * A collection of ground truths, derived from the graph schema (either a {@link Graph} or {@link GraphConstructor}).
+ */
+public class SchemaKnowledgeTable implements Iterable<SchemaKnowledgeTable.KnowledgeRecord> {
+    private final Set<KnowledgeRecord> knowledgeRecordSet = new HashSet<>();
+    private final Set<VertexIdentifier> vertexIdentifierSet = new HashSet<>();
+    private final Set<EdgeIdentifier> edgeIdentifierSet = new HashSet<>();
+    private final GraphIdentifier graphIdentifier;
+
+    public SchemaKnowledgeTable(FromGraphClause fromGraphClause, GraphixRewritingContext graphixRewritingContext)
+            throws CompilationException {
+        MetadataProvider metadataProvider = graphixRewritingContext.getMetadataProvider();
+        DataverseName dataverseName = (fromGraphClause.getDataverseName() == null)
+                ? metadataProvider.getDefaultDataverseName() : fromGraphClause.getDataverseName();
+        graphIdentifier = fromGraphClause.getGraphIdentifier(metadataProvider);
+
+        // Establish our schema knowledge.
+        GraphConstructor graphConstructor = fromGraphClause.getGraphConstructor();
+        if (graphConstructor == null) {
+            Identifier graphName = fromGraphClause.getGraphName();
+
+            // First, try to find our graph inside our declared graph set.
+            Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs = graphixRewritingContext.getDeclaredGraphs();
+            DeclareGraphStatement declaredGraph = declaredGraphs.get(graphIdentifier);
+            if (declaredGraph != null) {
+                initializeWithGraphConstructor(declaredGraph.getGraphConstructor());
+
+            } else {
+                // Otherwise, fetch the graph from our metadata.
+                try {
+                    MetadataTransactionContext metadataTxnContext = metadataProvider.getMetadataTxnContext();
+                    Graph graphFromMetadata = getGraph(metadataTxnContext, dataverseName, graphName.getValue());
+                    if (graphFromMetadata == null) {
+                        throw new CompilationException(ErrorCode.COMPILATION_ERROR, fromGraphClause.getSourceLocation(),
+                                "Graph " + graphName.getValue() + " does not exist.");
+                    }
+                    initializeWithMetadataGraph(graphFromMetadata);
+
+                } catch (AlgebricksException e) {
+                    throw new CompilationException(ErrorCode.COMPILATION_ERROR, fromGraphClause.getSourceLocation(),
+                            "Graph " + graphName.getValue() + " does not exist.");
+                }
+            }
+
+        } else {
+            initializeWithGraphConstructor(graphConstructor);
+        }
+    }
+
+    private void initializeWithMetadataGraph(Graph graph) {
+        for (Vertex vertex : graph.getGraphSchema().getVertices()) {
+            VertexIdentifier vertexIdentifier = vertex.getIdentifier();
+            vertexIdentifierSet.add(vertexIdentifier);
+        }
+        for (Edge edge : graph.getGraphSchema().getEdges()) {
+            ElementLabel sourceLabel = edge.getSourceLabel();
+            ElementLabel edgeLabel = edge.getLabel();
+            ElementLabel destLabel = edge.getDestinationLabel();
+
+            // Build our source and destination vertex identifiers.
+            VertexIdentifier sourceIdentifier = new VertexIdentifier(graphIdentifier, sourceLabel);
+            VertexIdentifier destIdentifier = new VertexIdentifier(graphIdentifier, destLabel);
+            vertexIdentifierSet.add(sourceIdentifier);
+            vertexIdentifierSet.add(destIdentifier);
+            edgeIdentifierSet.add(edge.getIdentifier());
+
+            // Update our knowledge set.
+            knowledgeRecordSet.add(new KnowledgeRecord(sourceLabel, edgeLabel, destLabel));
+        }
+    }
+
+    private void initializeWithGraphConstructor(GraphConstructor graphConstructor) {
+        for (GraphConstructor.VertexConstructor vertexElement : graphConstructor.getVertexElements()) {
+            VertexIdentifier vertexIdentifier = new VertexIdentifier(graphIdentifier, vertexElement.getLabel());
+            vertexIdentifierSet.add(vertexIdentifier);
+        }
+        for (GraphConstructor.EdgeConstructor edgeElement : graphConstructor.getEdgeElements()) {
+            ElementLabel sourceLabel = edgeElement.getSourceLabel();
+            ElementLabel edgeLabel = edgeElement.getEdgeLabel();
+            ElementLabel destLabel = edgeElement.getDestinationLabel();
+
+            // Build our edge identifiers, and source & destination vertex identifiers.
+            VertexIdentifier sourceIdentifier = new VertexIdentifier(graphIdentifier, sourceLabel);
+            VertexIdentifier destIdentifier = new VertexIdentifier(graphIdentifier, destLabel);
+            EdgeIdentifier edgeIdentifier = new EdgeIdentifier(graphIdentifier, sourceLabel, edgeLabel, destLabel);
+            vertexIdentifierSet.add(sourceIdentifier);
+            vertexIdentifierSet.add(destIdentifier);
+            edgeIdentifierSet.add(edgeIdentifier);
+
+            // Update our knowledge set.
+            knowledgeRecordSet.add(new KnowledgeRecord(sourceLabel, edgeLabel, destLabel));
+        }
+    }
+
+    public Set<ElementLabel> getVertexLabels() {
+        return vertexIdentifierSet.stream().map(VertexIdentifier::getVertexLabel).collect(Collectors.toSet());
+    }
+
+    public Set<ElementLabel> getEdgeLabels() {
+        return edgeIdentifierSet.stream().map(EdgeIdentifier::getEdgeLabel).collect(Collectors.toSet());
+    }
+
+    public boolean isValidEdge(EdgePatternExpr edgePatternExpr) {
+        for (ElementLabel leftLabel : edgePatternExpr.getLeftVertex().getLabels()) {
+            for (ElementLabel rightLabel : edgePatternExpr.getRightVertex().getLabels()) {
+                EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+                for (ElementLabel edgeLabel : edgeDescriptor.getEdgeLabels()) {
+                    if (edgeDescriptor.getEdgeDirection() != EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT) {
+                        EdgeIdentifier id = new EdgeIdentifier(graphIdentifier, leftLabel, edgeLabel, rightLabel);
+                        if (!edgeIdentifierSet.contains(id)) {
+                            return false;
+                        }
+                    }
+                    if (edgeDescriptor.getEdgeDirection() != EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
+                        EdgeIdentifier id = new EdgeIdentifier(graphIdentifier, rightLabel, edgeLabel, leftLabel);
+                        if (!edgeIdentifierSet.contains(id)) {
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public Iterator<KnowledgeRecord> iterator() {
+        return knowledgeRecordSet.iterator();
+    }
+
+    public static class KnowledgeRecord {
+        private final ElementLabel sourceElementLabel;
+        private final ElementLabel destElementLabel;
+        private final ElementLabel edgeLabel;
+
+        public KnowledgeRecord(ElementLabel sourceElementLabel, ElementLabel edgeLabel, ElementLabel destElementLabel) {
+            this.sourceElementLabel = Objects.requireNonNull(sourceElementLabel);
+            this.destElementLabel = Objects.requireNonNull(destElementLabel);
+            this.edgeLabel = Objects.requireNonNull(edgeLabel);
+        }
+
+        public ElementLabel getSourceVertexLabel() {
+            return sourceElementLabel;
+        }
+
+        public ElementLabel getDestVertexLabel() {
+            return destElementLabel;
+        }
+
+        public ElementLabel getEdgeLabel() {
+            return edgeLabel;
+        }
+
+        @Override
+        public String toString() {
+            return String.format("(%s)-[%s]->(%s)", sourceElementLabel, edgeLabel, destElementLabel);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (this == object) {
+                return true;
+            }
+            if (!(object instanceof KnowledgeRecord)) {
+                return false;
+            }
+            KnowledgeRecord target = (KnowledgeRecord) object;
+            return sourceElementLabel.equals(target.sourceElementLabel)
+                    && destElementLabel.equals(target.destElementLabel) && edgeLabel.equals(target.edgeLabel);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(sourceElementLabel, destElementLabel, edgeLabel);
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/util/CanonicalElementUtil.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/util/CanonicalElementUtil.java
new file mode 100644
index 0000000..36d1fc0
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/util/CanonicalElementUtil.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.util;
+
+import static org.apache.asterix.graphix.lang.struct.EdgeDescriptor.EdgeDirection;
+import static org.apache.asterix.graphix.lang.struct.EdgeDescriptor.PatternType;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.resolve.IInternalVertexSupplier;
+import org.apache.asterix.graphix.lang.rewrite.resolve.SchemaKnowledgeTable;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.paukov.combinatorics3.Generator;
+
+public final class CanonicalElementUtil {
+    public static Set<ElementLabel> expandElementLabels(AbstractExpression originalExpr,
+            Set<ElementLabel> elementLabels, SchemaKnowledgeTable schemaKnowledgeTable) {
+        Set<ElementLabel> schemaLabels = (originalExpr instanceof VertexPatternExpr)
+                ? schemaKnowledgeTable.getVertexLabels() : schemaKnowledgeTable.getEdgeLabels();
+        if (elementLabels.isEmpty()) {
+            // If our set is empty, then return all the element labels associated with our schema.
+            return schemaLabels;
+        }
+
+        // If we have any negated element labels, then we return the difference between our schema and this set.
+        Set<String> negatedElementLabels = elementLabels.stream().filter(ElementLabel::isNegated)
+                .map(ElementLabel::getLabelName).collect(Collectors.toSet());
+        if (!negatedElementLabels.isEmpty()) {
+            return schemaLabels.stream().filter(s -> !negatedElementLabels.contains(s.getLabelName()))
+                    .collect(Collectors.toSet());
+        }
+
+        // Otherwise, we return our input set of labels.
+        return elementLabels;
+    }
+
+    public static Set<EdgeDirection> expandEdgeDirection(EdgeDescriptor edgeDescriptor) {
+        Set<EdgeDirection> edgeDirectionList = new HashSet<>();
+        if (edgeDescriptor.getEdgeDirection() != EdgeDirection.RIGHT_TO_LEFT) {
+            edgeDirectionList.add(EdgeDirection.LEFT_TO_RIGHT);
+        }
+        if (edgeDescriptor.getEdgeDirection() != EdgeDirection.LEFT_TO_RIGHT) {
+            edgeDirectionList.add(EdgeDirection.RIGHT_TO_LEFT);
+        }
+        return edgeDirectionList;
+    }
+
+    public static List<List<EdgePatternExpr>> expandFixedPathPattern(int pathLength, EdgePatternExpr edgePattern,
+            Set<ElementLabel> edgeLabels, Set<ElementLabel> vertexLabels, Set<EdgeDirection> edgeDirections,
+            GraphixDeepCopyVisitor deepCopyVisitor, IInternalVertexSupplier internalVertexSupplier)
+            throws CompilationException {
+        VertexPatternExpr leftVertex = edgePattern.getLeftVertex();
+        VertexPatternExpr rightVertex = edgePattern.getRightVertex();
+        VariableExpr edgeVariableExpr = edgePattern.getEdgeDescriptor().getVariableExpr();
+
+        // Generate all possible edge label K-permutations w/ repetitions.
+        List<List<ElementLabel>> edgeLabelPermutations = new ArrayList<>();
+        Generator.combination(edgeLabels).multi(pathLength).stream()
+                .forEach(c -> Generator.permutation(c).simple().forEach(edgeLabelPermutations::add));
+
+        // Generate all possible direction K-permutations w/ repetitions.
+        List<List<EdgeDirection>> directionPermutations = new ArrayList<>();
+        Generator.combination(edgeDirections).multi(pathLength).stream()
+                .forEach(c -> Generator.permutation(c).simple().forEach(directionPermutations::add));
+
+        // Special case: if we have a path of length one, we do not need to permute our vertices.
+        if (pathLength == 1) {
+            List<List<EdgePatternExpr>> expandedPathPatterns = new ArrayList<>();
+            for (List<ElementLabel> edgeLabelPermutation : edgeLabelPermutations) {
+                ElementLabel edgeLabel = edgeLabelPermutation.get(0);
+                for (List<EdgeDirection> directionPermutation : directionPermutations) {
+                    EdgeDirection edgeDirection = directionPermutation.get(0);
+                    EdgeDescriptor edgeDescriptor = new EdgeDescriptor(edgeDirection, PatternType.EDGE,
+                            Set.of(edgeLabel), null, deepCopyVisitor.visit(edgeVariableExpr, null), null, null);
+                    expandedPathPatterns.add(List.of(new EdgePatternExpr(leftVertex, rightVertex, edgeDescriptor)));
+                }
+            }
+            return expandedPathPatterns;
+        }
+
+        // Otherwise... generate all possible (K-1)-permutations w/ repetitions.
+        List<List<ElementLabel>> vertexLabelPermutations = new ArrayList<>();
+        Generator.combination(vertexLabels).multi(pathLength - 1).stream()
+                .forEach(c -> Generator.permutation(c).simple().forEach(vertexLabelPermutations::add));
+
+        // ... and perform a cartesian product of all three sets above.
+        List<List<EdgePatternExpr>> expandedPathPatterns = new ArrayList<>();
+        for (List<ElementLabel> edgeLabelPermutation : edgeLabelPermutations) {
+            for (List<EdgeDirection> directionPermutation : directionPermutations) {
+                for (List<ElementLabel> vertexLabelPermutation : vertexLabelPermutations) {
+                    Iterator<ElementLabel> edgeLabelIterator = edgeLabelPermutation.iterator();
+                    Iterator<EdgeDirection> directionIterator = directionPermutation.iterator();
+                    Iterator<ElementLabel> vertexLabelIterator = vertexLabelPermutation.iterator();
+
+                    // Build one path.
+                    List<EdgePatternExpr> pathPattern = new ArrayList<>();
+                    VertexPatternExpr previousRightVertex = null;
+                    for (int i = 0; edgeLabelIterator.hasNext(); i++) {
+                        Set<ElementLabel> edgeLabelSet = Set.of(edgeLabelIterator.next());
+                        EdgeDirection edgeDirection = directionIterator.next();
+
+                        // Determine our left vertex.
+                        VertexPatternExpr workingLeftVertex;
+                        if (i == 0) {
+                            workingLeftVertex = deepCopyVisitor.visit(leftVertex, null);
+                        } else {
+                            workingLeftVertex = deepCopyVisitor.visit(previousRightVertex, null);
+                        }
+
+                        // Determine our right vertex.
+                        VertexPatternExpr workingRightVertex;
+                        if (!edgeLabelIterator.hasNext()) {
+                            workingRightVertex = deepCopyVisitor.visit(rightVertex, null);
+
+                        } else {
+                            workingRightVertex = internalVertexSupplier.get();
+                            workingRightVertex.getLabels().clear();
+                            workingRightVertex.getLabels().add(vertexLabelIterator.next());
+                        }
+                        previousRightVertex = workingRightVertex;
+
+                        // And build the edge to add to our path.
+                        EdgeDescriptor edgeDescriptor = new EdgeDescriptor(edgeDirection, PatternType.EDGE,
+                                edgeLabelSet, null, deepCopyVisitor.visit(edgeVariableExpr, null), null, null);
+                        pathPattern.add(new EdgePatternExpr(workingLeftVertex, workingRightVertex, edgeDescriptor));
+                    }
+                    expandedPathPatterns.add(pathPattern);
+                }
+            }
+        }
+        return expandedPathPatterns;
+    }
+
+    public static List<EdgePatternExpr> deepCopyPathPattern(List<EdgePatternExpr> pathPattern,
+            GraphixDeepCopyVisitor deepCopyVisitor) throws CompilationException {
+        List<EdgePatternExpr> deepCopyEdgeList = new ArrayList<>();
+        for (EdgePatternExpr edgePatternExpr : pathPattern) {
+            deepCopyEdgeList.add(deepCopyVisitor.visit(edgePatternExpr, null));
+        }
+        return deepCopyEdgeList;
+    }
+
+    public static void replaceVertexInIterator(Map<VertexPatternExpr, VertexPatternExpr> replaceMap,
+            ListIterator<VertexPatternExpr> elementIterator, GraphixDeepCopyVisitor deepCopyVisitor)
+            throws CompilationException {
+        while (elementIterator.hasNext()) {
+            VertexPatternExpr nextElement = elementIterator.next();
+            if (replaceMap.containsKey(nextElement)) {
+                VertexPatternExpr replacementElement = replaceMap.get(nextElement);
+                elementIterator.set((VertexPatternExpr) replacementElement.accept(deepCopyVisitor, null));
+            }
+        }
+    }
+
+    public static void replaceEdgeInIterator(Map<EdgePatternExpr, EdgePatternExpr> replaceMap,
+            ListIterator<EdgePatternExpr> elementIterator, GraphixDeepCopyVisitor deepCopyVisitor)
+            throws CompilationException {
+        // Build a map of vertices to vertices from our replace map.
+        Map<VertexPatternExpr, VertexPatternExpr> replaceVertexMap = new HashMap<>();
+        for (Map.Entry<EdgePatternExpr, EdgePatternExpr> mapEntry : replaceMap.entrySet()) {
+            VertexPatternExpr keyLeftVertex = mapEntry.getKey().getLeftVertex();
+            VertexPatternExpr keyRightVertex = mapEntry.getKey().getRightVertex();
+            VertexPatternExpr valueLeftVertex = mapEntry.getValue().getLeftVertex();
+            VertexPatternExpr valueRightVertex = mapEntry.getValue().getRightVertex();
+            replaceVertexMap.put(keyLeftVertex, valueLeftVertex);
+            replaceVertexMap.put(keyRightVertex, valueRightVertex);
+        }
+
+        while (elementIterator.hasNext()) {
+            EdgePatternExpr nextElement = elementIterator.next();
+            if (replaceMap.containsKey(nextElement)) {
+                EdgePatternExpr replacementElement = replaceMap.get(nextElement);
+                elementIterator.set((EdgePatternExpr) replacementElement.accept(deepCopyVisitor, null));
+
+            } else {
+                if (replaceVertexMap.containsKey(nextElement.getLeftVertex())) {
+                    VertexPatternExpr replaceLeftVertex = replaceVertexMap.get(nextElement.getLeftVertex());
+                    nextElement.setLeftVertex(deepCopyVisitor.visit(replaceLeftVertex, null));
+                }
+                if (replaceVertexMap.containsKey(nextElement.getRightVertex())) {
+                    VertexPatternExpr replaceRightVertex = replaceVertexMap.get(nextElement.getRightVertex());
+                    nextElement.setRightVertex(deepCopyVisitor.visit(replaceRightVertex, null));
+                }
+            }
+        }
+    }
+
+    private CanonicalElementUtil() {
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/util/LowerRewritingUtil.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/util/LowerRewritingUtil.java
similarity index 90%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/util/LowerRewritingUtil.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/util/LowerRewritingUtil.java
index 616138e..78d7aea 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/util/LowerRewritingUtil.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/util/LowerRewritingUtil.java
@@ -16,19 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.util;
+package org.apache.asterix.graphix.lang.rewrite.util;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.rewrite.visitor.GraphixDeepCopyVisitor;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.FieldAccessor;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.struct.OperatorType;
-import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
 
 public final class LowerRewritingUtil {
     public static Expression buildConnectedClauses(List<Expression> clauses, OperatorType connector) {
@@ -59,9 +59,10 @@
 
     public static List<FieldAccessor> buildAccessorList(Expression startingExpr, List<List<String>> fieldNames)
             throws CompilationException {
+        GraphixDeepCopyVisitor deepCopyVisitor = new GraphixDeepCopyVisitor();
         List<FieldAccessor> fieldAccessors = new ArrayList<>();
         for (List<String> nestedField : fieldNames) {
-            Expression copiedStartingExpr = (Expression) SqlppRewriteUtil.deepCopy(startingExpr);
+            Expression copiedStartingExpr = (Expression) startingExpr.accept(deepCopyVisitor, null);
             FieldAccessor workingAccessor = new FieldAccessor(copiedStartingExpr, new Identifier(nestedField.get(0)));
             for (String field : nestedField.subList(1, nestedField.size())) {
                 workingAccessor = new FieldAccessor(workingAccessor, new Identifier(field));
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/AmbiguousElementVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/AmbiguousElementVisitor.java
new file mode 100644
index 0000000..da9bff9
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/AmbiguousElementVisitor.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.algebra.compiler.option.ElementEvaluationOption;
+import org.apache.asterix.graphix.algebra.compiler.option.IGraphixCompilerOption;
+import org.apache.asterix.graphix.lang.annotation.ElementEvaluationAnnotation;
+import org.apache.asterix.graphix.lang.annotation.SubqueryVertexJoinAnnotation;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.canonical.CanonicalElementGeneratorFactory;
+import org.apache.asterix.graphix.lang.rewrite.resolve.SchemaKnowledgeTable;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+
+/**
+ * @see QueryCanonicalizationVisitor
+ */
+public class AmbiguousElementVisitor extends AbstractGraphixQueryVisitor {
+    private final Map<AbstractExpression, Context> elementContextMap;
+    private final Deque<CanonicalElementGeneratorFactory> factoryStack;
+    private final Deque<SelectBlock> selectBlockStack;
+
+    private final GraphixRewritingContext graphixRewritingContext;
+    private final ElementEvaluationOption defaultElementEvaluation;
+
+    private static class Context {
+        final CanonicalElementGeneratorFactory generatorFactory;
+        final ElementEvaluationOption elementEvaluationOption;
+        final SelectBlock sourceSelectBlock;
+
+        private Context(CanonicalElementGeneratorFactory generatorFactory,
+                ElementEvaluationOption elementEvaluationOption, SelectBlock sourceSelectBlock) {
+            this.generatorFactory = generatorFactory;
+            this.elementEvaluationOption = elementEvaluationOption;
+            this.sourceSelectBlock = sourceSelectBlock;
+        }
+    }
+
+    public AmbiguousElementVisitor(GraphixRewritingContext graphixRewritingContext) throws CompilationException {
+        IGraphixCompilerOption setting = graphixRewritingContext.getSetting(ElementEvaluationOption.OPTION_KEY_NAME);
+        this.defaultElementEvaluation = (ElementEvaluationOption) setting;
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.elementContextMap = new HashMap<>();
+        this.selectBlockStack = new ArrayDeque<>();
+        this.factoryStack = new ArrayDeque<>();
+    }
+
+    @Override
+    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        selectBlockStack.push(selectBlock);
+        super.visit(selectBlock, arg);
+        selectBlockStack.pop();
+        return null;
+    }
+
+    @Override
+    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
+        SchemaKnowledgeTable knowledgeTable = new SchemaKnowledgeTable(fromGraphClause, graphixRewritingContext);
+        factoryStack.push(new CanonicalElementGeneratorFactory(graphixRewritingContext, knowledgeTable));
+        super.visit(fromGraphClause, arg);
+        factoryStack.pop();
+        return null;
+    }
+
+    @Override
+    public Expression visit(PathPatternExpr pathPatternExpr, ILangExpression arg) throws CompilationException {
+        Set<VariableExpr> visitedVertices = new HashSet<>();
+        for (EdgePatternExpr edgeExpression : pathPatternExpr.getEdgeExpressions()) {
+            edgeExpression.accept(this, arg);
+            visitedVertices.add(edgeExpression.getLeftVertex().getVariableExpr());
+            visitedVertices.add(edgeExpression.getRightVertex().getVariableExpr());
+        }
+        for (VertexPatternExpr vertexExpression : pathPatternExpr.getVertexExpressions()) {
+            if (!visitedVertices.contains(vertexExpression.getVariableExpr())) {
+                vertexExpression.accept(this, arg);
+            }
+        }
+        return pathPatternExpr;
+    }
+
+    @Override
+    public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
+        VertexPatternExpr leftVertex = edgePatternExpr.getLeftVertex();
+        VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
+        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+        if ((edgeDescriptor.getEdgeLabels().size() + leftVertex.getLabels().size() + rightVertex.getLabels().size()) > 3
+                || edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH
+                || edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.UNDIRECTED) {
+            elementContextMap.put(edgePatternExpr, new Context(factoryStack.peek(),
+                    getEvaluationFromAnnotation(edgePatternExpr), selectBlockStack.peek()));
+        }
+        return super.visit(edgePatternExpr, arg);
+    }
+
+    @Override
+    public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) throws CompilationException {
+        if (vertexPatternExpr.getLabels().size() > 1
+                && vertexPatternExpr.findHint(SubqueryVertexJoinAnnotation.class) == null) {
+            elementContextMap.put(vertexPatternExpr, new Context(factoryStack.peek(),
+                    ElementEvaluationOption.EXPAND_AND_UNION, selectBlockStack.peek()));
+        }
+        return super.visit(vertexPatternExpr, arg);
+    }
+
+    private ElementEvaluationOption getEvaluationFromAnnotation(AbstractExpression expression) {
+        ElementEvaluationAnnotation hint = expression.findHint(ElementEvaluationAnnotation.class);
+        if (hint == null) {
+            return defaultElementEvaluation;
+
+        } else if (hint.getKind() == ElementEvaluationAnnotation.Kind.EXPAND_AND_UNION) {
+            return ElementEvaluationOption.EXPAND_AND_UNION;
+
+        } else { // hint.getKind() == ElementEvaluationAnnotation.Kind.SWITCH_AND_CYCLE
+            return ElementEvaluationOption.SWITCH_AND_CYCLE;
+        }
+    }
+
+    public Set<AbstractExpression> getAmbiguousElements() {
+        return elementContextMap.keySet();
+    }
+
+    public CanonicalElementGeneratorFactory getGeneratorFactory(AbstractExpression ambiguousElement) {
+        return elementContextMap.get(ambiguousElement).generatorFactory;
+    }
+
+    public SelectBlock getSourceSelectBlock(AbstractExpression ambiguousElement) {
+        return elementContextMap.get(ambiguousElement).sourceSelectBlock;
+    }
+
+    public ElementEvaluationOption getElementEvaluationOption(AbstractExpression ambiguousElement) {
+        return elementContextMap.get(ambiguousElement).elementEvaluationOption;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ElementBodyAnalysisVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementBodyAnalysisVisitor.java
similarity index 90%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ElementBodyAnalysisVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementBodyAnalysisVisitor.java
index 448f698..1fca964 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ElementBodyAnalysisVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementBodyAnalysisVisitor.java
@@ -16,10 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
@@ -42,6 +43,7 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectClause;
 import org.apache.asterix.lang.sqlpp.clause.SelectRegular;
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
 import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
@@ -52,13 +54,15 @@
 /**
  * Perform an analysis of a normalized graph element body (i.e. no Graphix AST nodes) to determine if we can inline
  * this graph element body with the greater SELECT-BLOCK node during lowering.
- * 1. Is this a dataset CALL-EXPR? If so, we can inline this directly.
- * 2. Is this expression a SELECT-EXPR containing a single FROM-TERM w/ possibly only UNNEST clauses? If so, we can
- * inline this expression.
- * 3. Are there are LET-WHERE expressions? We can inline these if the two questions are true.
- * 4. Are there any aggregate functions (or any aggregation)? If so, we cannot inline this expression.
- * 5. Are there any UNION-ALLs? If so, we cannot inline this expression.
- * 6. Are there any ORDER-BY or LIMIT clauses? If so, we cannot inline this expression.
+ * <ol>
+ *  <li>Is this a dataset CALL-EXPR? If so, we can inline this directly.</li>
+ *  <li>Is this expression a SELECT-EXPR containing a single FROM-TERM w/ possibly only UNNEST clauses? If so, we can
+ *  inline this expression.</li>
+ *  <li>Are there are LET-WHERE expressions? We can inline these if the two questions are true.</li>
+ *  <li>Are there any aggregate functions (or any aggregation)? If so, we cannot inline this expression.</li>
+ *  <li>Are there any UNION-ALLs? If so, we cannot inline this expression.</li>
+ *  <li>Are there any ORDER-BY or LIMIT clauses? If so, we cannot inline this expression.</li>
+ * </ol>
  */
 public class ElementBodyAnalysisVisitor extends AbstractSqlppSimpleExpressionVisitor {
     private final ElementBodyAnalysisContext elementBodyAnalysisContext = new ElementBodyAnalysisContext();
@@ -225,7 +229,10 @@
     @Override
     public Expression visit(FromTerm fromTerm, ILangExpression arg) throws CompilationException {
         List<AbstractBinaryCorrelateClause> correlateClauses = fromTerm.getCorrelateClauses();
-        if (correlateClauses.stream().anyMatch(c -> !c.getClauseType().equals(Clause.ClauseType.UNNEST_CLAUSE))) {
+        List<AbstractBinaryCorrelateClause> unnestClauses =
+                correlateClauses.stream().filter(c -> c.getClauseType().equals(Clause.ClauseType.UNNEST_CLAUSE))
+                        .map(c -> (UnnestClause) c).collect(Collectors.toList());
+        if (correlateClauses.size() != unnestClauses.size()) {
             elementBodyAnalysisContext.isExpressionInline = false;
             return null;
 
@@ -233,10 +240,10 @@
             // TODO (GLENN): Add support for positional variables.
             elementBodyAnalysisContext.isExpressionInline = false;
             return null;
-
         }
-        if (!correlateClauses.isEmpty()) {
-            elementBodyAnalysisContext.unnestClauses = correlateClauses;
+
+        if (!unnestClauses.isEmpty()) {
+            elementBodyAnalysisContext.unnestClauses = unnestClauses;
         }
         fromTerm.getLeftExpression().accept(this, arg);
         elementBodyAnalysisContext.fromTermVariable = fromTerm.getLeftVariable();
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ElementLookupTableVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementLookupTableVisitor.java
similarity index 83%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ElementLookupTableVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementLookupTableVisitor.java
index 6ba1d87..9bbe3f0 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ElementLookupTableVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementLookupTableVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import static org.apache.asterix.graphix.lang.parser.GraphElementBodyParser.parse;
 
@@ -28,8 +28,9 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
 import org.apache.asterix.graphix.extension.GraphixMetadataExtension;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
@@ -37,12 +38,13 @@
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
 import org.apache.asterix.graphix.lang.parser.GraphixParserFactory;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
 import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
 import org.apache.asterix.graphix.metadata.entity.schema.Edge;
 import org.apache.asterix.graphix.metadata.entity.schema.Graph;
 import org.apache.asterix.graphix.metadata.entity.schema.Vertex;
@@ -55,7 +57,7 @@
 
 /**
  * Populate the given graph element table, which will hold all referenced {@link GraphElementDeclaration}s. We assume
- * that our graph elements are properly labeled at this point (i.e. {@link StructureResolutionVisitor} must run before
+ * that our graph elements are properly labeled at this point (i.e. {@link PatternGraphGroupVisitor} must run before
  * this).
  */
 public class ElementLookupTableVisitor extends AbstractGraphixQueryVisitor {
@@ -63,7 +65,7 @@
     private final MetadataProvider metadataProvider;
     private final GraphixParserFactory parserFactory;
 
-    private final Set<ElementLabel> referencedVertexLabels = new HashSet<>();
+    private final Set<ElementLabel> referencedElementLabels = new HashSet<>();
     private final Set<ElementLabel> referencedEdgeLabels = new HashSet<>();
     private final ElementLookupTable elementLookupTable;
     private final Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs;
@@ -84,14 +86,13 @@
         }
 
         GraphConstructor graphConstructor = fromGraphClause.getGraphConstructor();
-        GraphIdentifier graphIdentifier = null;
+        GraphIdentifier graphIdentifier = fromGraphClause.getGraphIdentifier(metadataProvider);
         if (graphConstructor == null) {
             DataverseName dataverseName = (fromGraphClause.getDataverseName() == null)
                     ? metadataProvider.getDefaultDataverseName() : fromGraphClause.getDataverseName();
             Identifier graphName = fromGraphClause.getGraphName();
 
             // Our query refers to a named graph. First see if we can find this in our declared graph set.
-            graphIdentifier = new GraphIdentifier(dataverseName, graphName.getValue());
             DeclareGraphStatement declaredGraph = declaredGraphs.get(graphIdentifier);
             if (declaredGraph != null) {
                 graphConstructor = declaredGraph.getGraphConstructor();
@@ -113,7 +114,7 @@
                 }
 
                 for (Vertex vertex : graphFromMetadata.getGraphSchema().getVertices()) {
-                    if (referencedVertexLabels.contains(vertex.getLabel())) {
+                    if (referencedElementLabels.contains(vertex.getLabel())) {
                         GraphElementDeclaration vertexDecl = parse(vertex, parserFactory, warningCollector);
                         elementLookupTable.put(vertex.getIdentifier(), vertexDecl);
                         elementLookupTable.putVertexKey(vertex.getIdentifier(), vertex.getPrimaryKeyFieldNames());
@@ -130,24 +131,17 @@
             }
         }
         if (graphConstructor != null) {
-            if (graphIdentifier == null) {
-                // We have been provided an anonymous graph. Load the referenced elements from our walk.
-                DataverseName defaultDataverse = metadataProvider.getDefaultDataverse().getDataverseName();
-                graphIdentifier = new GraphIdentifier(defaultDataverse, graphConstructor.getInstanceID());
-            }
-
             for (GraphConstructor.VertexConstructor vertex : graphConstructor.getVertexElements()) {
-                if (referencedVertexLabels.contains(vertex.getLabel())) {
-                    GraphElementIdentifier identifier = new GraphElementIdentifier(graphIdentifier,
-                            GraphElementIdentifier.Kind.VERTEX, vertex.getLabel());
+                if (referencedElementLabels.contains(vertex.getLabel())) {
+                    VertexIdentifier identifier = new VertexIdentifier(graphIdentifier, vertex.getLabel());
                     elementLookupTable.put(identifier, new GraphElementDeclaration(identifier, vertex.getExpression()));
                     elementLookupTable.putVertexKey(identifier, vertex.getPrimaryKeyFields());
                 }
             }
             for (GraphConstructor.EdgeConstructor edge : graphConstructor.getEdgeElements()) {
                 if (referencedEdgeLabels.contains(edge.getEdgeLabel())) {
-                    GraphElementIdentifier identifier = new GraphElementIdentifier(graphIdentifier,
-                            GraphElementIdentifier.Kind.EDGE, edge.getEdgeLabel());
+                    EdgeIdentifier identifier = new EdgeIdentifier(graphIdentifier, edge.getSourceLabel(),
+                            edge.getEdgeLabel(), edge.getDestinationLabel());
                     elementLookupTable.put(identifier, new GraphElementDeclaration(identifier, edge.getExpression()));
                     elementLookupTable.putEdgeKeys(identifier, edge.getSourceKeyFields(),
                             edge.getDestinationKeyFields());
@@ -164,8 +158,8 @@
                     "EdgePatternExpr found without labels. Elements should have been resolved earlier.");
         }
         referencedEdgeLabels.addAll(edgeDescriptor.getEdgeLabels());
-        for (VertexPatternExpr internalVertex : edgeExpression.getInternalVertices()) {
-            internalVertex.accept(this, arg);
+        if (edgeExpression.getInternalVertex() != null && edgeDescriptor.getMaximumHops() != 1) {
+            edgeExpression.getInternalVertex().accept(this, arg);
         }
         return edgeExpression;
     }
@@ -175,7 +169,7 @@
             throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, vertexExpression.getSourceLocation(),
                     "VertexPatternExpr found without labels. Elements should have been resolved earlier.");
         }
-        referencedVertexLabels.addAll(vertexExpression.getLabels());
+        referencedElementLabels.addAll(vertexExpression.getLabels());
         return vertexExpression;
     }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementSubstitutionVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementSubstitutionVisitor.java
new file mode 100644
index 0000000..16c5200
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/ElementSubstitutionVisitor.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.List;
+import java.util.ListIterator;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+
+/**
+ * Visitor to replace a {@link VertexPatternExpr}, a {@link EdgePatternExpr}, or a {@link PathPatternExpr}.
+ */
+public class ElementSubstitutionVisitor<T extends AbstractExpression> extends AbstractGraphixQueryVisitor {
+    private final T replacementElementExpression;
+    private final T originalElementExpression;
+
+    public ElementSubstitutionVisitor(T replacementElementExpression, T originalElementExpression) {
+        this.replacementElementExpression = replacementElementExpression;
+        this.originalElementExpression = originalElementExpression;
+        if (!((replacementElementExpression instanceof VertexPatternExpr)
+                || (replacementElementExpression instanceof EdgePatternExpr)
+                || (replacementElementExpression instanceof PathPatternExpr))) {
+            throw new IllegalArgumentException(
+                    "Only VertexPatternExpr, EdgePatternExpr, or PathPatternExpr " + "instances should be given.");
+        }
+    }
+
+    @Override
+    public Expression visit(MatchClause matchClause, ILangExpression arg) throws CompilationException {
+        if (replacementElementExpression instanceof PathPatternExpr) {
+            ListIterator<PathPatternExpr> pathIterator = matchClause.getPathExpressions().listIterator();
+            while (pathIterator.hasNext()) {
+                PathPatternExpr pathPatternExpr = pathIterator.next();
+                if (pathPatternExpr.equals(originalElementExpression)) {
+                    pathIterator.set((PathPatternExpr) replacementElementExpression);
+                    break;
+                }
+            }
+            return null;
+        }
+        return super.visit(matchClause, arg);
+    }
+
+    @Override
+    public Expression visit(PathPatternExpr pathPatternExpr, ILangExpression arg) throws CompilationException {
+        if (replacementElementExpression instanceof VertexPatternExpr) {
+            ListIterator<VertexPatternExpr> vertexExprIterator = pathPatternExpr.getVertexExpressions().listIterator();
+            while (vertexExprIterator.hasNext()) {
+                VertexPatternExpr workingVertexExpression = vertexExprIterator.next();
+                if (workingVertexExpression.equals(originalElementExpression)) {
+                    vertexExprIterator.set((VertexPatternExpr) replacementElementExpression);
+                    break;
+                }
+            }
+            List<EdgePatternExpr> edgeExpressions = pathPatternExpr.getEdgeExpressions();
+            for (EdgePatternExpr workingEdgeExpression : edgeExpressions) {
+                if (workingEdgeExpression.getLeftVertex().equals(originalElementExpression)) {
+                    workingEdgeExpression.setLeftVertex((VertexPatternExpr) replacementElementExpression);
+                }
+                if (workingEdgeExpression.getRightVertex().equals(originalElementExpression)) {
+                    workingEdgeExpression.setRightVertex((VertexPatternExpr) replacementElementExpression);
+                }
+            }
+
+        } else { // replacementElementExpression instanceof EdgePatternExpr
+            ListIterator<EdgePatternExpr> edgeExprIterator = pathPatternExpr.getEdgeExpressions().listIterator();
+            while (edgeExprIterator.hasNext()) {
+                EdgePatternExpr workingEdgeExpression = edgeExprIterator.next();
+                if (workingEdgeExpression.equals(originalElementExpression)) {
+                    edgeExprIterator.set((EdgePatternExpr) replacementElementExpression);
+                    break;
+                }
+            }
+        }
+        return pathPatternExpr;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/FunctionResolutionVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/FunctionResolutionVisitor.java
similarity index 90%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/FunctionResolutionVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/FunctionResolutionVisitor.java
index 689f58f..961c270 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/FunctionResolutionVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/FunctionResolutionVisitor.java
@@ -14,12 +14,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.graphix.function.GraphixFunctionResolver;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.expression.CallExpr;
@@ -49,8 +50,9 @@
         FunctionSignature functionSignature = graphixFunctionResolver.resolve(callExpr, allowNonStoredUdfCalls);
         if (functionSignature != null) {
             callExpr.setFunctionSignature(functionSignature);
+            return super.visit(callExpr, arg);
         }
-        return super.visit(callExpr, arg);
+        return sqlppFunctionCallResolverVisitor.visit(callExpr, arg);
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixDeepCopyVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixDeepCopyVisitor.java
similarity index 66%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixDeepCopyVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixDeepCopyVisitor.java
index 8a4b93c..2280e75 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixDeepCopyVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixDeepCopyVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -25,7 +25,6 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
@@ -37,13 +36,16 @@
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
 import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
 import org.apache.asterix.lang.sqlpp.clause.SelectClause;
 import org.apache.asterix.lang.sqlpp.visitor.DeepCopyVisitor;
 
@@ -52,23 +54,31 @@
  */
 public class GraphixDeepCopyVisitor extends DeepCopyVisitor implements IGraphixLangVisitor<ILangExpression, Void> {
     @Override
-    public GraphSelectBlock visit(GraphSelectBlock graphSelectBlock, Void arg) throws CompilationException {
-        SelectClause clonedSelectClause = this.visit(graphSelectBlock.getSelectClause(), arg);
-        FromGraphClause clonedFromGraphClause = this.visit(graphSelectBlock.getFromGraphClause(), arg);
+    public SelectBlock visit(SelectBlock selectBlock, Void arg) throws CompilationException {
+        SelectClause clonedSelectClause = this.visit(selectBlock.getSelectClause(), arg);
+        FromClause clonedFromClause = null;
+        if (selectBlock.hasFromClause() && selectBlock.getFromClause() instanceof FromGraphClause) {
+            clonedFromClause = this.visit((FromGraphClause) selectBlock.getFromClause(), arg);
+
+        } else if (selectBlock.hasFromClause()) {
+            clonedFromClause = super.visit(selectBlock.getFromClause(), arg);
+        }
         GroupbyClause clonedGroupByClause = null;
-        if (graphSelectBlock.hasGroupbyClause()) {
-            clonedGroupByClause = this.visit(graphSelectBlock.getGroupbyClause(), arg);
+        if (selectBlock.hasGroupbyClause()) {
+            clonedGroupByClause = this.visit(selectBlock.getGroupbyClause(), arg);
         }
         List<AbstractClause> clonedLetWhereClauses = new ArrayList<>();
         List<AbstractClause> clonedLetHavingClauses = new ArrayList<>();
-        for (AbstractClause letWhereClause : graphSelectBlock.getLetWhereList()) {
+        for (AbstractClause letWhereClause : selectBlock.getLetWhereList()) {
             clonedLetWhereClauses.add((AbstractClause) letWhereClause.accept(this, arg));
         }
-        for (AbstractClause letHavingClause : graphSelectBlock.getLetHavingListAfterGroupby()) {
+        for (AbstractClause letHavingClause : selectBlock.getLetHavingListAfterGroupby()) {
             clonedLetHavingClauses.add((AbstractClause) letHavingClause.accept(this, arg));
         }
-        return new GraphSelectBlock(clonedSelectClause, clonedFromGraphClause, clonedLetWhereClauses,
+        SelectBlock clonedSelectBlock = new SelectBlock(clonedSelectClause, clonedFromClause, clonedLetWhereClauses,
                 clonedGroupByClause, clonedLetHavingClauses);
+        clonedSelectBlock.setSourceLocation(selectBlock.getSourceLocation());
+        return clonedSelectBlock;
     }
 
     @Override
@@ -81,14 +91,17 @@
         for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
             clonedMatchClauses.add(this.visit(matchClause, arg));
         }
+        FromGraphClause clonedFromGraphClause;
         if (fromGraphClause.getGraphConstructor() != null) {
             GraphConstructor graphConstructor = fromGraphClause.getGraphConstructor();
-            return new FromGraphClause(graphConstructor, clonedMatchClauses, clonedCorrelateClauses);
+            clonedFromGraphClause = new FromGraphClause(graphConstructor, clonedMatchClauses, clonedCorrelateClauses);
 
         } else {
-            return new FromGraphClause(fromGraphClause.getDataverseName(), fromGraphClause.getGraphName(),
-                    clonedMatchClauses, clonedCorrelateClauses);
+            clonedFromGraphClause = new FromGraphClause(fromGraphClause.getDataverseName(),
+                    fromGraphClause.getGraphName(), clonedMatchClauses, clonedCorrelateClauses);
         }
+        clonedFromGraphClause.setSourceLocation(fromGraphClause.getSourceLocation());
+        return clonedFromGraphClause;
     }
 
     @Override
@@ -97,7 +110,9 @@
         for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
             clonedPathExpression.add(this.visit(pathExpression, arg));
         }
-        return new MatchClause(clonedPathExpression, matchClause.getMatchType());
+        MatchClause clonedMatchClause = new MatchClause(clonedPathExpression, matchClause.getMatchType());
+        clonedMatchClause.setSourceLocation(matchClause.getSourceLocation());
+        return clonedMatchClause;
     }
 
     @Override
@@ -110,26 +125,31 @@
         }
 
         // Only visit dangling vertices in our edge.
-        Set<VarIdentifier> visitedVertices = new HashSet<>();
+        Set<VariableExpr> visitedVertices = new HashSet<>();
         for (EdgePatternExpr edgeExpression : pathPatternExpr.getEdgeExpressions()) {
             EdgePatternExpr clonedEdgeExpression = this.visit(edgeExpression, arg);
             clonedEdgeExpressions.add(clonedEdgeExpression);
-            clonedVertexExpressions.add(clonedEdgeExpression.getLeftVertex());
-            clonedVertexExpressions.add(clonedEdgeExpression.getRightVertex());
-            visitedVertices.add(clonedEdgeExpression.getRightVertex().getVariableExpr().getVar());
-            visitedVertices.add(clonedEdgeExpression.getLeftVertex().getVariableExpr().getVar());
+            clonedEdgeExpression.setSourceLocation(edgeExpression.getSourceLocation());
+            VertexPatternExpr clonedLeftVertex = clonedEdgeExpression.getLeftVertex();
+            VertexPatternExpr clonedRightVertex = clonedEdgeExpression.getRightVertex();
+            clonedVertexExpressions.add(clonedLeftVertex);
+            clonedVertexExpressions.add(clonedRightVertex);
+            visitedVertices.add(clonedLeftVertex.getVariableExpr());
+            visitedVertices.add(clonedRightVertex.getVariableExpr());
         }
         for (VertexPatternExpr vertexExpression : pathPatternExpr.getVertexExpressions()) {
-            if (!visitedVertices.contains(vertexExpression.getVariableExpr().getVar())) {
+            if (!visitedVertices.contains(vertexExpression.getVariableExpr())) {
                 VertexPatternExpr clonedVertexExpression = this.visit(vertexExpression, arg);
+                clonedVertexExpression.setSourceLocation(vertexExpression.getSourceLocation());
                 clonedVertexExpressions.add(clonedVertexExpression);
-                visitedVertices.add(clonedVertexExpression.getVariableExpr().getVar());
+                visitedVertices.add(clonedVertexExpression.getVariableExpr());
             }
         }
 
         // Clone our sub-path expressions.
         PathPatternExpr clonedPathPatternExpr =
                 new PathPatternExpr(clonedVertexExpressions, clonedEdgeExpressions, clonedVariableExpr);
+        clonedPathPatternExpr.setSourceLocation(pathPatternExpr.getSourceLocation());
         for (LetClause letClause : pathPatternExpr.getReboundSubPathList()) {
             clonedPathPatternExpr.getReboundSubPathList().add(this.visit(letClause, arg));
         }
@@ -141,23 +161,30 @@
         // Clone our expressions.
         VertexPatternExpr clonedLeftVertex = this.visit(edgePatternExpr.getLeftVertex(), arg);
         VertexPatternExpr clonedRightVertex = this.visit(edgePatternExpr.getRightVertex(), arg);
-        List<VertexPatternExpr> clonedInternalVertices = new ArrayList<>();
-        for (VertexPatternExpr internalVertex : edgePatternExpr.getInternalVertices()) {
-            clonedInternalVertices.add(this.visit(internalVertex, arg));
+        VertexPatternExpr clonedInternalVertex = null;
+        if (edgePatternExpr.getInternalVertex() != null) {
+            clonedInternalVertex = this.visit(edgePatternExpr.getInternalVertex(), arg);
         }
         VariableExpr clonedVariableExpr = null;
         if (edgePatternExpr.getEdgeDescriptor().getVariableExpr() != null) {
             clonedVariableExpr = this.visit(edgePatternExpr.getEdgeDescriptor().getVariableExpr(), arg);
         }
+        clonedLeftVertex.setSourceLocation(edgePatternExpr.getLeftVertex().getSourceLocation());
+        clonedRightVertex.setSourceLocation(edgePatternExpr.getRightVertex().getSourceLocation());
 
         // Generate a cloned edge.
         EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
         Set<ElementLabel> clonedEdgeDescriptorLabels = new HashSet<>(edgeDescriptor.getEdgeLabels());
+        Expression clonedFilterExpr = null;
+        if (edgeDescriptor.getFilterExpr() != null) {
+            clonedFilterExpr = (Expression) edgeDescriptor.getFilterExpr().accept(this, arg);
+        }
         EdgeDescriptor clonedDescriptor = new EdgeDescriptor(edgeDescriptor.getEdgeDirection(),
-                edgeDescriptor.getPatternType(), clonedEdgeDescriptorLabels, clonedVariableExpr,
+                edgeDescriptor.getPatternType(), clonedEdgeDescriptorLabels, clonedFilterExpr, clonedVariableExpr,
                 edgeDescriptor.getMinimumHops(), edgeDescriptor.getMaximumHops());
         EdgePatternExpr clonedEdge = new EdgePatternExpr(clonedLeftVertex, clonedRightVertex, clonedDescriptor);
-        clonedEdge.replaceInternalVertices(clonedInternalVertices);
+        clonedEdge.setInternalVertex(clonedInternalVertex);
+        clonedEdge.setSourceLocation(edgePatternExpr.getSourceLocation());
         return clonedEdge;
     }
 
@@ -167,8 +194,15 @@
         if (vertexPatternExpr.getVariableExpr() != null) {
             clonedVariableExpr = this.visit(vertexPatternExpr.getVariableExpr(), arg);
         }
-        Set<ElementLabel> clonedVertexLabels = new HashSet<>(vertexPatternExpr.getLabels());
-        return new VertexPatternExpr(clonedVariableExpr, clonedVertexLabels);
+        Expression clonedFilterExpr = null;
+        if (vertexPatternExpr.getFilterExpr() != null) {
+            clonedFilterExpr = (Expression) vertexPatternExpr.getFilterExpr().accept(this, arg);
+        }
+        Set<ElementLabel> clonedElementLabels = new HashSet<>(vertexPatternExpr.getLabels());
+        VertexPatternExpr clonedVertexExpr =
+                new VertexPatternExpr(clonedVariableExpr, clonedFilterExpr, clonedElementLabels);
+        clonedVertexExpr.setSourceLocation(vertexPatternExpr.getSourceLocation());
+        return clonedVertexExpr;
     }
 
     // We do not touch our GRAPH-CONSTRUCTOR here.
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixFunctionCallVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixFunctionCallVisitor.java
similarity index 96%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixFunctionCallVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixFunctionCallVisitor.java
index 399cb43..de34713 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixFunctionCallVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixFunctionCallVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import java.util.Map;
 
@@ -27,7 +27,7 @@
 import org.apache.asterix.graphix.function.GraphixFunctionMap;
 import org.apache.asterix.graphix.function.GraphixFunctionResolver;
 import org.apache.asterix.graphix.function.rewrite.IFunctionRewrite;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.expression.CallExpr;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixLoweringVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixLoweringVisitor.java
new file mode 100644
index 0000000..088e698
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/GraphixLoweringVisitor.java
@@ -0,0 +1,530 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.isEdgeFunction;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.isVertexFunction;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.graphix.algebra.compiler.option.IGraphixCompilerOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateEdgeOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateVertexOption;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.common.metadata.IElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.graphix.lang.annotation.LoweringExemptAnnotation;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause.ClauseInputEnvironment;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause.ClauseOutputEnvironment;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.optype.MatchType;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.common.BranchLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.AliasLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.EnvironmentActionFactory;
+import org.apache.asterix.graphix.lang.rewrite.lower.LoweringEnvironment;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.graphix.lang.rewrite.visitor.ElementBodyAnalysisVisitor.ElementBodyAnalysisContext;
+import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.CallExpr;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.statement.Query;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+
+/**
+ * Rewrite a graph AST to utilize non-graph AST nodes (i.e. replace FROM-GRAPH-CLAUSEs with a LOWER-{LIST|BFS}-CLAUSE).
+ */
+public class GraphixLoweringVisitor extends AbstractGraphixQueryVisitor {
+    private final GraphixDeepCopyVisitor graphixDeepCopyVisitor;
+    private final VariableRemapCloneVisitor variableRemapCloneVisitor;
+    private final ElementLookupTable elementLookupTable;
+    private final GraphixRewritingContext graphixRewritingContext;
+    private SelectExpression topLevelSelectExpression;
+
+    // Our stack corresponds to which GRAPH-SELECT-BLOCK we are currently working with.
+    private final Map<IElementIdentifier, ElementBodyAnalysisContext> analysisContextMap;
+    private final Deque<LoweringEnvironment> environmentStack;
+    private final AliasLookupTable aliasLookupTable;
+    private final BranchLookupTable branchLookupTable;
+    private final EnvironmentActionFactory actionFactory;
+
+    public GraphixLoweringVisitor(GraphixRewritingContext graphixRewritingContext,
+            ElementLookupTable elementLookupTable, BranchLookupTable branchLookupTable) {
+        this.branchLookupTable = Objects.requireNonNull(branchLookupTable);
+        this.elementLookupTable = Objects.requireNonNull(elementLookupTable);
+        this.graphixRewritingContext = Objects.requireNonNull(graphixRewritingContext);
+        this.variableRemapCloneVisitor = new VariableRemapCloneVisitor(graphixRewritingContext);
+        this.graphixDeepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.aliasLookupTable = new AliasLookupTable();
+        this.environmentStack = new ArrayDeque<>();
+        this.analysisContextMap = new HashMap<>();
+
+        // All actions on our environment are supplied by the factory below.
+        this.actionFactory = new EnvironmentActionFactory(analysisContextMap, elementLookupTable, aliasLookupTable,
+                graphixRewritingContext);
+    }
+
+    @Override
+    public Expression visit(Query query, ILangExpression arg) throws CompilationException {
+        boolean isTopLevelQuery = query.isTopLevel();
+        boolean isSelectExpr = query.getBody().getKind() == Expression.Kind.SELECT_EXPRESSION;
+        if (isSelectExpr && (isTopLevelQuery || topLevelSelectExpression == null)) {
+            topLevelSelectExpression = (SelectExpression) query.getBody();
+        }
+        return super.visit(query, arg);
+    }
+
+    @Override
+    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        SelectExpression selectExpression = (SelectExpression) arg;
+        if (selectBlock.hasFromClause() && selectBlock.getFromClause() instanceof FromGraphClause) {
+            FromGraphClause fromGraphClause = (FromGraphClause) selectBlock.getFromClause();
+            MetadataProvider metadataProvider = graphixRewritingContext.getMetadataProvider();
+            GraphIdentifier graphIdentifier = fromGraphClause.getGraphIdentifier(metadataProvider);
+            SourceLocation sourceLocation = fromGraphClause.getSourceLocation();
+
+            // Initialize a new lowering environment.
+            LoweringEnvironment newEnvironment =
+                    new LoweringEnvironment(graphixRewritingContext, graphIdentifier, sourceLocation);
+            actionFactory.reset(graphIdentifier);
+
+            // We will remove the FROM-GRAPH node and replace this with a FROM node on the child visit.
+            environmentStack.addLast(newEnvironment);
+            super.visit(selectBlock, arg);
+            environmentStack.removeLast();
+
+            // See if we need to perform a pass for schema enrichment. By default, we decorate "as-needed".
+            String schemaDecorateVertexKey = SchemaDecorateVertexOption.OPTION_KEY_NAME;
+            String schemaDecorateEdgeKey = SchemaDecorateEdgeOption.OPTION_KEY_NAME;
+            IGraphixCompilerOption vertexModeOption = graphixRewritingContext.getSetting(schemaDecorateVertexKey);
+            IGraphixCompilerOption edgeModeOption = graphixRewritingContext.getSetting(schemaDecorateEdgeKey);
+            SchemaDecorateVertexOption vertexMode = (SchemaDecorateVertexOption) vertexModeOption;
+            SchemaDecorateEdgeOption edgeMode = (SchemaDecorateEdgeOption) edgeModeOption;
+
+            // See if there are any Graphix functions used in our query.
+            Set<FunctionIdentifier> graphixFunctionSet = new LinkedHashSet<>();
+            topLevelSelectExpression.accept(new AbstractGraphixQueryVisitor() {
+                @Override
+                public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
+                    FunctionSignature functionSignature = callExpr.getFunctionSignature();
+                    if (functionSignature.getDataverseName().equals(GraphixFunctionIdentifiers.GRAPHIX_DV)) {
+                        FunctionIdentifier functionID = functionSignature.createFunctionIdentifier();
+                        if ((vertexMode == SchemaDecorateVertexOption.NEVER && isVertexFunction(functionID))
+                                || (edgeMode == SchemaDecorateEdgeOption.NEVER && isEdgeFunction(functionID))) {
+                            throw new CompilationException(ErrorCode.COMPILATION_ERROR, callExpr.getSourceLocation(),
+                                    "Schema-decorate mode has been set to 'NEVER', but schema-decoration is required "
+                                            + "to realize the function" + functionSignature + "!");
+                        }
+                        graphixFunctionSet.add(functionID);
+                    }
+                    return super.visit(callExpr, arg);
+                }
+            }, null);
+
+            // Perform a pass for schema enrichment, if needed.
+            boolean isVertexModeAlways = vertexMode == SchemaDecorateVertexOption.ALWAYS;
+            boolean isEdgeModeAlways = edgeMode == SchemaDecorateEdgeOption.ALWAYS;
+            if (!graphixFunctionSet.isEmpty() || isVertexModeAlways || isEdgeModeAlways) {
+                SchemaEnrichmentVisitor schemaEnrichmentVisitor = new SchemaEnrichmentVisitor(vertexMode, edgeMode,
+                        elementLookupTable, branchLookupTable, graphIdentifier, selectBlock, graphixFunctionSet);
+                selectExpression.accept(schemaEnrichmentVisitor, null);
+                if (selectExpression.hasOrderby()) {
+                    selectExpression.getOrderbyClause().accept(schemaEnrichmentVisitor, null);
+                }
+                if (selectExpression.hasLimit()) {
+                    selectExpression.getLimitClause().accept(schemaEnrichmentVisitor, null);
+                }
+            }
+
+        } else {
+            super.visit(selectBlock, arg);
+        }
+        return null;
+    }
+
+    @Override
+    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
+        // Perform an analysis pass over each element body. We need to determine what we can and can't inline.
+        for (GraphElementDeclaration graphElementDeclaration : elementLookupTable) {
+            ElementBodyAnalysisVisitor elementBodyAnalysisVisitor = new ElementBodyAnalysisVisitor();
+            IElementIdentifier elementIdentifier = graphElementDeclaration.getIdentifier();
+            graphElementDeclaration.getNormalizedBody().accept(elementBodyAnalysisVisitor, null);
+            analysisContextMap.put(elementIdentifier, elementBodyAnalysisVisitor.getElementBodyAnalysisContext());
+        }
+        LoweringEnvironment workingEnvironment = environmentStack.getLast();
+
+        // TODO (GLENN): Perform smarter analysis to determine when a vertex / edge is inlineable w/ LEFT-MATCH.
+        Stream<MatchClause> matchClauseStream = fromGraphClause.getMatchClauses().stream();
+        workingEnvironment.setInlineLegal(matchClauseStream.noneMatch(c -> c.getMatchType() == MatchType.LEFTOUTER));
+
+        // Lower our MATCH-CLAUSEs. We should be working with canonical-ized patterns.
+        for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
+            if (matchClause.getMatchType() == MatchType.LEFTOUTER) {
+                workingEnvironment.beginLeftMatch();
+            }
+            for (PathPatternExpr pathPatternExpr : matchClause.getPathExpressions()) {
+                for (EdgePatternExpr edgePatternExpr : pathPatternExpr.getEdgeExpressions()) {
+                    edgePatternExpr.accept(this, fromGraphClause);
+                }
+                for (VertexPatternExpr vertexPatternExpr : pathPatternExpr.getVertexExpressions()) {
+                    VariableExpr vertexVariableExpr = vertexPatternExpr.getVariableExpr();
+                    if (aliasLookupTable.getIterationAlias(vertexVariableExpr) != null) {
+                        continue;
+                    }
+                    workingEnvironment.acceptAction(actionFactory.buildDanglingVertexAction(vertexPatternExpr));
+                }
+                workingEnvironment.acceptAction(actionFactory.buildPathPatternAction(pathPatternExpr));
+            }
+            if (matchClause.getMatchType() == MatchType.LEFTOUTER) {
+                workingEnvironment.endLeftMatch();
+            }
+        }
+        workingEnvironment.acceptAction(actionFactory.buildMatchSemanticAction(fromGraphClause));
+
+        // Finalize our lowering by moving our lower list to our environment.
+        workingEnvironment.endLowering(fromGraphClause);
+
+        // Add our correlate clauses, if any, to our tail FROM-TERM.
+        if (!fromGraphClause.getCorrelateClauses().isEmpty()) {
+            LowerListClause lowerClause = (LowerListClause) fromGraphClause.getLowerClause();
+            ClauseCollection clauseCollection = lowerClause.getClauseCollection();
+            fromGraphClause.getCorrelateClauses().forEach(clauseCollection::addUserDefinedCorrelateClause);
+        }
+        return null;
+    }
+
+    @Override
+    public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
+        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+        if (edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.EDGE) {
+            lowerCanonicalExpandedEdge(edgePatternExpr, environmentStack.getLast());
+
+        } else { // edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH
+            lowerCanonicalExpandedPath(edgePatternExpr, environmentStack.getLast());
+        }
+        return edgePatternExpr;
+    }
+
+    private void lowerCanonicalExpandedEdge(EdgePatternExpr edgePatternExpr, LoweringEnvironment environment)
+            throws CompilationException {
+        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+
+        // We should be working with a canonical edge.
+        GraphIdentifier graphIdentifier = environment.getGraphIdentifier();
+        List<EdgeIdentifier> edgeElementIDs = edgePatternExpr.generateIdentifiers(graphIdentifier);
+        if (edgeElementIDs.size() != 1) {
+            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
+                    "Encountered non-fixed-point edge pattern!");
+        }
+        EdgeIdentifier edgeIdentifier = edgeElementIDs.get(0);
+        ElementBodyAnalysisContext edgeBodyAnalysisContext = analysisContextMap.get(edgeIdentifier);
+        DataverseName edgeDataverseName = edgeBodyAnalysisContext.getDataverseName();
+        String edgeDatasetName = edgeBodyAnalysisContext.getDatasetName();
+
+        // Determine our source and destination vertices.
+        VertexPatternExpr sourceVertex, destVertex;
+        if (edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
+            sourceVertex = edgePatternExpr.getLeftVertex();
+            destVertex = edgePatternExpr.getRightVertex();
+
+        } else { // edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT
+            sourceVertex = edgePatternExpr.getRightVertex();
+            destVertex = edgePatternExpr.getLeftVertex();
+        }
+
+        // Collect information about our source vertex.
+        VertexIdentifier sourceIdentifier = sourceVertex.generateIdentifiers(graphIdentifier).get(0);
+        ElementBodyAnalysisContext sourceBodyAnalysisContext = analysisContextMap.get(sourceIdentifier);
+        VariableExpr sourceVertexVariable = sourceVertex.getVariableExpr();
+        List<List<String>> sourceVertexKey = elementLookupTable.getVertexKey(sourceIdentifier);
+        Function<EdgeIdentifier, List<List<String>>> sourceKey = elementLookupTable::getEdgeSourceKey;
+        boolean isSourceInline = sourceBodyAnalysisContext.isExpressionInline() && environment.isInlineLegal();
+        boolean isSourceIntroduced = aliasLookupTable.getIterationAlias(sourceVertexVariable) != null;
+
+        // ...and our destination vertex...
+        VertexIdentifier destIdentifier = destVertex.generateIdentifiers(graphIdentifier).get(0);
+        ElementBodyAnalysisContext destBodyAnalysisContext = analysisContextMap.get(destIdentifier);
+        VariableExpr destVertexVariable = destVertex.getVariableExpr();
+        List<List<String>> destVertexKey = elementLookupTable.getVertexKey(destIdentifier);
+        Function<EdgeIdentifier, List<List<String>>> destKey = elementLookupTable::getEdgeDestKey;
+        boolean isDestInline = destBodyAnalysisContext.isExpressionInline() && environment.isInlineLegal();
+        boolean isDestIntroduced = aliasLookupTable.getIterationAlias(destVertexVariable) != null;
+
+        // ...and our edge.
+        List<List<String>> sourceEdgeKey = elementLookupTable.getEdgeSourceKey(edgeIdentifier);
+        List<List<String>> destEdgeKey = elementLookupTable.getEdgeDestKey(edgeIdentifier);
+        String sourceBodyDatasetName = sourceBodyAnalysisContext.getDatasetName();
+        String destBodyDatasetName = destBodyAnalysisContext.getDatasetName();
+        boolean isEdgeInline = edgeBodyAnalysisContext.isExpressionInline() && environment.isInlineLegal();
+        boolean isSourceFolded = isSourceInline && sourceBodyDatasetName.equals(edgeDatasetName)
+                && sourceBodyAnalysisContext.getDataverseName().equals(edgeDataverseName)
+                && sourceVertexKey.equals(sourceEdgeKey);
+        boolean isDestFolded = isDestInline && destBodyDatasetName.equals(edgeDatasetName)
+                && destBodyAnalysisContext.getDataverseName().equals(edgeDataverseName)
+                && destVertexKey.equals(destEdgeKey);
+
+        // Condition our strategy on which vertices are currently introduced.
+        if (isEdgeInline && isSourceFolded) {
+            if (!isSourceIntroduced) {
+                environment.acceptAction(actionFactory.buildDanglingVertexAction(sourceVertex));
+            }
+            environment.acceptAction(actionFactory.buildFoldedEdgeAction(sourceVertex, edgePatternExpr));
+            environment.acceptAction(
+                    !isDestIntroduced ? actionFactory.buildBoundVertexAction(destVertex, edgePatternExpr, destKey)
+                            : actionFactory.buildRawJoinVertexAction(destVertex, edgePatternExpr, destKey));
+
+        } else if (isEdgeInline && isDestFolded) {
+            if (!isDestIntroduced) {
+                environment.acceptAction(actionFactory.buildDanglingVertexAction(destVertex));
+            }
+            environment.acceptAction(actionFactory.buildFoldedEdgeAction(destVertex, edgePatternExpr));
+            environment.acceptAction(
+                    !isSourceIntroduced ? actionFactory.buildBoundVertexAction(sourceVertex, edgePatternExpr, sourceKey)
+                            : actionFactory.buildRawJoinVertexAction(sourceVertex, edgePatternExpr, sourceKey));
+
+        } else if (isSourceIntroduced && isDestIntroduced) {
+            environment.acceptAction(actionFactory.buildNonFoldedEdgeAction(sourceVertex, edgePatternExpr, sourceKey));
+            environment.acceptAction(actionFactory.buildRawJoinVertexAction(destVertex, edgePatternExpr, destKey));
+
+        } else if (isSourceIntroduced) { // !isDestIntroduced
+            environment.acceptAction(actionFactory.buildNonFoldedEdgeAction(sourceVertex, edgePatternExpr, sourceKey));
+            environment.acceptAction(actionFactory.buildBoundVertexAction(destVertex, edgePatternExpr, destKey));
+
+        } else if (isDestIntroduced) { // !isSourceIntroduced
+            environment.acceptAction(actionFactory.buildNonFoldedEdgeAction(destVertex, edgePatternExpr, destKey));
+            environment.acceptAction(actionFactory.buildBoundVertexAction(sourceVertex, edgePatternExpr, sourceKey));
+
+        } else { // !isSourceIntroduced && !isDestIntroduced
+            // When nothing is introduced, start off from LEFT to RIGHT instead of considering our source and dest.
+            VertexPatternExpr leftVertex = edgePatternExpr.getLeftVertex();
+            VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
+            Function<EdgeIdentifier, List<List<String>>> leftKey;
+            Function<EdgeIdentifier, List<List<String>>> rightKey;
+            if (edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
+                leftKey = sourceKey;
+                rightKey = destKey;
+
+            } else { // edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT
+                leftKey = destKey;
+                rightKey = sourceKey;
+            }
+            environment.acceptAction(actionFactory.buildDanglingVertexAction(leftVertex));
+            environment.acceptAction(actionFactory.buildNonFoldedEdgeAction(leftVertex, edgePatternExpr, leftKey));
+            environment.acceptAction(actionFactory.buildBoundVertexAction(rightVertex, edgePatternExpr, rightKey));
+        }
+    }
+
+    private void lowerCanonicalExpandedPath(EdgePatternExpr edgePatternExpr, LoweringEnvironment environment)
+            throws CompilationException {
+        // Determine the starting vertex of our path.
+        VariableExpr leftVertexVariable = edgePatternExpr.getLeftVertex().getVariableExpr();
+        VariableExpr rightVertexVariable = edgePatternExpr.getRightVertex().getVariableExpr();
+        boolean isLeftVertexIntroduced = aliasLookupTable.getIterationAlias(leftVertexVariable) != null;
+        boolean isRightVertexIntroduced = aliasLookupTable.getIterationAlias(rightVertexVariable) != null;
+        boolean isJoiningLeftToRight = isLeftVertexIntroduced || !isRightVertexIntroduced;
+        VertexPatternExpr inputVertex, outputVertex;
+        if (isJoiningLeftToRight) {
+            inputVertex = edgePatternExpr.getLeftVertex();
+            outputVertex = edgePatternExpr.getRightVertex();
+
+        } else {
+            inputVertex = edgePatternExpr.getRightVertex();
+            outputVertex = edgePatternExpr.getLeftVertex();
+        }
+        VariableExpr inputVertexVariable = inputVertex.getVariableExpr();
+        VariableExpr outputVertexVariable = outputVertex.getVariableExpr();
+
+        // If we need to, introduce our left vertex (only occurs if nothing has been introduced).
+        if (!isLeftVertexIntroduced && !isRightVertexIntroduced) {
+            environment.acceptAction(actionFactory.buildDanglingVertexAction(edgePatternExpr.getLeftVertex()));
+        }
+
+        // Our input vertex must be introduced eagerly to be given to our graph clause as input.
+        VariableExpr inputClauseVariable = graphixRewritingContext.getGraphixVariableCopy(inputVertexVariable);
+        environment.acceptTransformer(lowerList -> {
+            // Find the representative vertex associated with our input.
+            Expression representativeVertexExpr = null;
+            for (LetClause vertexBinding : lowerList.getRepresentativeVertexBindings()) {
+                if (vertexBinding.getVarExpr().equals(inputVertex.getVariableExpr())) {
+                    representativeVertexExpr = vertexBinding.getBindingExpr();
+                    break;
+                }
+            }
+            if (representativeVertexExpr == null) {
+                throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Input vertex not found!");
+            }
+
+            // Once all variables of our representative LET-CLAUSE have been introduced, introduce our input binding.
+            Set<VariableExpr> usedVariables = SqlppVariableUtil.getFreeVariables(representativeVertexExpr);
+            ListIterator<AbstractClause> nonRepresentativeClauseIterator =
+                    lowerList.getNonRepresentativeClauses().listIterator();
+            while (nonRepresentativeClauseIterator.hasNext()) {
+                AbstractClause workingClause = nonRepresentativeClauseIterator.next();
+                List<VariableExpr> bindingVariables = SqlppVariableUtil.getBindingVariables(workingClause);
+                bindingVariables.forEach(usedVariables::remove);
+                if (usedVariables.isEmpty()) {
+                    VariableExpr inputClauseVariableCopy = graphixDeepCopyVisitor.visit(inputClauseVariable, null);
+                    LetClause clauseInputBinding = new LetClause(inputClauseVariableCopy, representativeVertexExpr);
+                    nonRepresentativeClauseIterator.add(clauseInputBinding);
+                    lowerList.addEagerVertexBinding(inputVertex.getVariableExpr(), clauseInputBinding);
+                    break;
+                }
+            }
+        });
+
+        // Lower each of our branches.
+        environment.beginBranches();
+        Map<ElementLabel, VariableExpr> labelInputVariableMap = new HashMap<>();
+        Map<ElementLabel, VariableExpr> labelOutputVariableMap = new HashMap<>();
+        for (EdgePatternExpr branch : branchLookupTable.getBranches(edgePatternExpr)) {
+            VertexPatternExpr inputBranchVertex, outputBranchVertex;
+            if (isJoiningLeftToRight) {
+                inputBranchVertex = branch.getLeftVertex();
+                outputBranchVertex = branch.getRightVertex();
+
+            } else {
+                inputBranchVertex = branch.getRightVertex();
+                outputBranchVertex = branch.getLeftVertex();
+            }
+
+            // Introduce the alias-- but do not lower our source vertex.
+            environment.beginTempLowerList();
+            environment.acceptAction(actionFactory.buildDanglingVertexAction(inputBranchVertex));
+            environment.endTempLowerList();
+            synchronizeVariables(environment, inputBranchVertex, labelInputVariableMap);
+            inputBranchVertex.addHint(LoweringExemptAnnotation.INSTANCE);
+
+            // Lower our branch, having introduced our source vertex.
+            lowerCanonicalExpandedEdge(branch, environment);
+            synchronizeVariables(environment, outputBranchVertex, labelOutputVariableMap);
+            environment.flushBranch(branch, isJoiningLeftToRight);
+        }
+
+        // Our output vertex will be aliased by the following:
+        VariableExpr outputVertexIterationAlias = graphixRewritingContext.getGraphixVariableCopy(outputVertexVariable);
+        VariableExpr outputVertexJoinAlias = graphixRewritingContext.getGraphixVariableCopy(outputVertexVariable);
+        aliasLookupTable.addIterationAlias(outputVertexVariable, outputVertexIterationAlias);
+        aliasLookupTable.addJoinAlias(outputVertexVariable, outputVertexJoinAlias);
+
+        // Introduce a SWITCH node, finalizing our path lowering.
+        VariableExpr pathVariable = edgePatternExpr.getEdgeDescriptor().getVariableExpr();
+        VariableExpr outputClauseVariable = graphixRewritingContext.getGraphixVariableCopy(outputVertexVariable);
+        ClauseOutputEnvironment outputEnvironment = new ClauseOutputEnvironment(outputClauseVariable,
+                aliasLookupTable.getIterationAlias(outputVertexVariable),
+                aliasLookupTable.getJoinAlias(outputVertexVariable), pathVariable,
+                outputVertex.getLabels().iterator().next());
+        ClauseInputEnvironment inputEnvironment = new ClauseInputEnvironment(
+                graphixDeepCopyVisitor.visit(inputClauseVariable, null), inputVertex.getLabels().iterator().next());
+        environment.endBranches(outputEnvironment, inputEnvironment, labelInputVariableMap, labelOutputVariableMap,
+                aliasLookupTable, edgePatternExpr.getSourceLocation());
+
+        // Expose our output vertex and path to the remainder of our query.
+        environment.acceptTransformer(lowerList -> {
+            VariableExpr iterationVariableCopy1 = graphixDeepCopyVisitor.visit(outputVertexIterationAlias, null);
+            VariableExpr iterationVariableCopy2 = graphixDeepCopyVisitor.visit(outputVertexIterationAlias, null);
+            VariableExpr joinVariableCopy = graphixDeepCopyVisitor.visit(outputVertexJoinAlias, null);
+            Expression iterationVariableAccess = outputEnvironment.buildIterationVariableAccess();
+            Expression joinVariableAccess = outputEnvironment.buildJoinVariableAccess();
+            lowerList.addNonRepresentativeClause(new LetClause(iterationVariableCopy1, iterationVariableAccess));
+            lowerList.addNonRepresentativeClause(new LetClause(joinVariableCopy, joinVariableAccess));
+            lowerList.addVertexBinding(outputVertexVariable, iterationVariableCopy2);
+            lowerList.addPathBinding(pathVariable, outputEnvironment.buildPathVariableAccess());
+        });
+    }
+
+    private void synchronizeVariables(LoweringEnvironment workingEnvironment, VertexPatternExpr branchVertex,
+            Map<ElementLabel, VariableExpr> labelVariableMap) throws CompilationException {
+        VariableExpr vertexVariable = branchVertex.getVariableExpr();
+        VariableExpr iterationAlias = aliasLookupTable.getIterationAlias(vertexVariable);
+        VariableExpr joinAlias = aliasLookupTable.getJoinAlias(vertexVariable);
+        ElementLabel elementLabel = branchVertex.getLabels().iterator().next();
+        if (labelVariableMap.containsKey(elementLabel)) {
+            VariableExpr targetVertexVariable = labelVariableMap.get(elementLabel);
+            VariableExpr targetIterationAlias = aliasLookupTable.getIterationAlias(targetVertexVariable);
+            VariableExpr targetJoinAlias = aliasLookupTable.getJoinAlias(targetVertexVariable);
+            variableRemapCloneVisitor.resetSubstitutions();
+            variableRemapCloneVisitor.addSubstitution(iterationAlias, targetIterationAlias);
+            variableRemapCloneVisitor.addSubstitution(joinAlias, targetJoinAlias);
+            variableRemapCloneVisitor.addSubstitution(vertexVariable, targetVertexVariable);
+
+            workingEnvironment.acceptTransformer(lowerList -> {
+                // Transform our non-representative clauses.
+                ListIterator<AbstractClause> nonRepresentativeIterator =
+                        lowerList.getNonRepresentativeClauses().listIterator();
+                while (nonRepresentativeIterator.hasNext()) {
+                    AbstractClause workingClause = nonRepresentativeIterator.next();
+                    nonRepresentativeIterator.set((AbstractClause) variableRemapCloneVisitor.substitute(workingClause));
+                }
+
+                // Transform our vertex bindings.
+                ListIterator<LetClause> vertexBindingIterator =
+                        lowerList.getRepresentativeVertexBindings().listIterator();
+                while (vertexBindingIterator.hasNext()) {
+                    LetClause vertexBinding = vertexBindingIterator.next();
+                    vertexBindingIterator.set((LetClause) variableRemapCloneVisitor.substitute(vertexBinding));
+                }
+
+                // Transform our edge bindings.
+                ListIterator<LetClause> edgeBindingIterator = lowerList.getRepresentativeEdgeBindings().listIterator();
+                while (edgeBindingIterator.hasNext()) {
+                    LetClause edgeBinding = edgeBindingIterator.next();
+                    edgeBindingIterator.set((LetClause) variableRemapCloneVisitor.substitute(edgeBinding));
+                }
+            });
+            branchVertex.setVariableExpr(targetVertexVariable);
+
+        } else {
+            labelVariableMap.put(elementLabel, vertexVariable);
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PatternGraphGroupVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PatternGraphGroupVisitor.java
new file mode 100644
index 0000000..98842d1
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PatternGraphGroupVisitor.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.Map;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.struct.PatternGroup;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+
+/**
+ * Aggregate all query patterns, grouped by the graph being queried.
+ *
+ * @see PatternGroup
+ */
+public class PatternGraphGroupVisitor extends AbstractGraphixQueryVisitor {
+    private final Map<GraphIdentifier, PatternGroup> patternGroupMap;
+    private final Deque<GraphIdentifier> graphIdentifierStack;
+    protected final MetadataProvider metadataProvider;
+
+    public PatternGraphGroupVisitor(Map<GraphIdentifier, PatternGroup> patternGroupMap,
+            GraphixRewritingContext graphixRewritingContext) {
+        this.metadataProvider = graphixRewritingContext.getMetadataProvider();
+        this.graphIdentifierStack = new ArrayDeque<>();
+        this.patternGroupMap = patternGroupMap;
+    }
+
+    @Override
+    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
+        // Collect the vertices and edges in this FROM-GRAPH-CLAUSE.
+        graphIdentifierStack.push(fromGraphClause.getGraphIdentifier(metadataProvider));
+        for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
+            matchClause.accept(this, arg);
+        }
+        for (AbstractBinaryCorrelateClause correlateClause : fromGraphClause.getCorrelateClauses()) {
+            correlateClause.accept(this, arg);
+        }
+        graphIdentifierStack.pop();
+        return null;
+    }
+
+    @Override
+    public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) throws CompilationException {
+        patternGroupMap.putIfAbsent(graphIdentifierStack.peek(), new PatternGroup());
+        patternGroupMap.get(graphIdentifierStack.peek()).getVertexPatternSet().add(vertexPatternExpr);
+        return super.visit(vertexPatternExpr, arg);
+    }
+
+    // We do not visit our internal vertices here.
+    @Override
+    public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
+        patternGroupMap.putIfAbsent(graphIdentifierStack.peek(), new PatternGroup());
+        patternGroupMap.get(graphIdentifierStack.peek()).getEdgePatternSet().add(edgePatternExpr);
+        if (edgePatternExpr.getEdgeDescriptor().getFilterExpr() != null) {
+            edgePatternExpr.getEdgeDescriptor().getFilterExpr().accept(this, arg);
+        }
+        return edgePatternExpr;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PopulateUnknownsVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PopulateUnknownsVisitor.java
new file mode 100644
index 0000000..37f341f
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PopulateUnknownsVisitor.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
+import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.rewrites.visitor.GenerateColumnNameVisitor;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+/**
+ * A pre-Graphix transformation pass to populate a number of unknowns in our Graphix AST.
+ * <ol>
+ *  <li>Populate all unknown graph elements (vertices and edges).</li>
+ *  <li>Populate all unknown column names in SELECT-CLAUSEs.</li>
+ *  <li>Populate all unknown GROUP-BY keys.</li>
+ *  <li>Fill in all GROUP-BY fields.</li>
+ * </ol>
+ */
+public class PopulateUnknownsVisitor extends AbstractGraphixQueryVisitor {
+    private final GenerateColumnNameVisitor generateColumnNameVisitor;
+    private final Supplier<VariableExpr> newVariableSupplier;
+
+    public PopulateUnknownsVisitor(GraphixRewritingContext graphixRewritingContext) {
+        generateColumnNameVisitor = new GenerateColumnNameVisitor(graphixRewritingContext);
+        newVariableSupplier = () -> new VariableExpr(graphixRewritingContext.newVariable());
+    }
+
+    @Override
+    public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
+        selectExpression.accept(generateColumnNameVisitor, arg);
+        return super.visit(selectExpression, arg);
+    }
+
+    @Override
+    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        super.visit(selectBlock, arg);
+
+        if (selectBlock.hasGroupbyClause()) {
+            // Collect all variables that should belong in the GROUP-BY field list.
+            Set<VariableExpr> userLiveVariables = new HashSet<>();
+            if (selectBlock.hasFromClause() && selectBlock.getFromClause() instanceof FromGraphClause) {
+                FromGraphClause fromGraphClause = (FromGraphClause) selectBlock.getFromClause();
+                for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
+                    for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
+                        if (pathExpression.getVariableExpr() != null) {
+                            userLiveVariables.add(pathExpression.getVariableExpr());
+                        }
+                        for (VertexPatternExpr vertexExpression : pathExpression.getVertexExpressions()) {
+                            userLiveVariables.add(vertexExpression.getVariableExpr());
+                        }
+                        for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
+                            userLiveVariables.add(edgeExpression.getEdgeDescriptor().getVariableExpr());
+                        }
+                    }
+                }
+                if (!fromGraphClause.getCorrelateClauses().isEmpty()) {
+                    List<AbstractBinaryCorrelateClause> correlateClauses = fromGraphClause.getCorrelateClauses();
+                    for (AbstractBinaryCorrelateClause correlateClause : correlateClauses) {
+                        userLiveVariables.add(correlateClause.getRightVariable());
+                    }
+                }
+
+            } else if (selectBlock.hasFromClause()) {
+                FromClause fromClause = selectBlock.getFromClause();
+                for (FromTerm fromTerm : fromClause.getFromTerms()) {
+                    userLiveVariables.add(fromTerm.getLeftVariable());
+                    for (AbstractBinaryCorrelateClause correlateClause : fromTerm.getCorrelateClauses()) {
+                        userLiveVariables.add(correlateClause.getRightVariable());
+                    }
+                }
+            }
+            if (selectBlock.hasLetWhereClauses()) {
+                for (AbstractClause abstractClause : selectBlock.getLetWhereList()) {
+                    if (abstractClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                        LetClause letClause = (LetClause) abstractClause;
+                        userLiveVariables.add(letClause.getVarExpr());
+                    }
+                }
+            }
+
+            // Add the live variables to our GROUP-BY field list.
+            List<Pair<Expression, Identifier>> newGroupFieldList = new ArrayList<>();
+            for (VariableExpr userLiveVariable : userLiveVariables) {
+                String variableName = SqlppVariableUtil.toUserDefinedName(userLiveVariable.getVar().getValue());
+                newGroupFieldList.add(new Pair<>(userLiveVariable, new Identifier(variableName)));
+            }
+            selectBlock.getGroupbyClause().setGroupFieldList(newGroupFieldList);
+        }
+        return null;
+    }
+
+    @Override
+    public Expression visit(VertexPatternExpr vertexExpression, ILangExpression arg) throws CompilationException {
+        if (vertexExpression.getVariableExpr() == null) {
+            vertexExpression.setVariableExpr(newVariableSupplier.get());
+        }
+        return super.visit(vertexExpression, arg);
+    }
+
+    @Override
+    public Expression visit(EdgePatternExpr edgeExpression, ILangExpression arg) throws CompilationException {
+        EdgeDescriptor edgeDescriptor = edgeExpression.getEdgeDescriptor();
+        if (edgeDescriptor.getVariableExpr() == null) {
+            edgeDescriptor.setVariableExpr(newVariableSupplier.get());
+        }
+        return super.visit(edgeExpression, arg);
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostCanonicalizationVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostCanonicalExpansionVisitor.java
similarity index 67%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostCanonicalizationVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostCanonicalExpansionVisitor.java
index bf6cb97..1f0d85b 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostCanonicalizationVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostCanonicalExpansionVisitor.java
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
 import org.apache.asterix.lang.common.base.AbstractClause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
@@ -50,42 +50,48 @@
 
 /**
  * Rewrite a SELECT-EXPR and its SET-OP inputs to perform the following:
- * 1. Expose all user-defined variables from each SET-OP by modifying their SELECT-CLAUSE.
- * 2. Qualify the source SELECT-CLAUSE (before expansion) with the nesting variable.
- * 3. Qualify our output modifiers (ORDER-BY, LIMIT) with the nesting variable.
- * 4. Qualify our GROUP-BY / GROUP-AS (the grouping list) / HAVING / LET (after GROUP-BY) clauses with the nesting
- * variable.
+ * <ol>
+ *  <li>Expose all user-defined variables from each SET-OP by modifying their SELECT-CLAUSE.</li>
+ *  <li>Qualify the source SELECT-CLAUSE (before expansion) with the nesting variable.</li>
+ *  <li>Qualify our output modifiers (ORDER-BY, LIMIT) with the nesting variable.</li>
+ *  <li>Qualify our GROUP-BY / GROUP-AS (the grouping list) / HAVING / LET (after GROUP-BY) clauses with the nesting
+ *  variable.</li>
+ * </ol>
  */
-public class PostCanonicalizationVisitor extends AbstractGraphixQueryVisitor {
+public class PostCanonicalExpansionVisitor extends AbstractGraphixQueryVisitor {
+    private final GraphixDeepCopyVisitor deepCopyVisitor;
     private final GraphixRewritingContext graphixRewritingContext;
     private final QualifyingVisitor qualifyingVisitor;
 
     // We require the following from our canonicalization pass.
-    private final Set<SetOperationInput> generatedSetOpInputs;
-    private final GraphSelectBlock selectBlockExpansionSource;
-    private final List<VarIdentifier> userLiveVariables;
+    private final Collection<SelectBlock> generatedSelectBlocks;
+    private final Collection<VariableExpr> sourceSelectLiveVariables;
+    private final SelectBlock selectBlockExpansionSource;
 
-    public PostCanonicalizationVisitor(GraphixRewritingContext graphixRewritingContext,
-            GraphSelectBlock selectBlockExpansionSource, Set<SetOperationInput> generatedSetOpInputs,
-            List<VarIdentifier> userLiveVariables) {
+    public PostCanonicalExpansionVisitor(GraphixRewritingContext graphixRewritingContext,
+            SelectBlock selectBlockExpansionSource, Collection<SelectBlock> generatedSelectBlocks,
+            Collection<VariableExpr> sourceSelectLiveVariables) {
+        this.deepCopyVisitor = new GraphixDeepCopyVisitor();
         this.graphixRewritingContext = graphixRewritingContext;
         this.selectBlockExpansionSource = selectBlockExpansionSource;
-        this.generatedSetOpInputs = generatedSetOpInputs;
-        this.userLiveVariables = userLiveVariables;
+        this.generatedSelectBlocks = generatedSelectBlocks;
+        this.sourceSelectLiveVariables = sourceSelectLiveVariables;
         this.qualifyingVisitor = new QualifyingVisitor();
     }
 
     @Override
     public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
-        VariableExpr iterationVariableExpr = new VariableExpr(graphixRewritingContext.getNewGraphixVariable());
+        VariableExpr iterationVariable = graphixRewritingContext.getGraphixVariableCopy("_Containing");
 
         // Modify the involved SELECT-CLAUSEs to output our user-live variables and remove any GROUP-BY clauses.
         selectExpression.getSelectSetOperation().accept(this, arg);
-        FromTerm fromTerm = new FromTerm(selectExpression, iterationVariableExpr, null, null);
+        FromTerm fromTerm = new FromTerm(selectExpression, iterationVariable, null, null);
         FromClause fromClause = new FromClause(List.of(fromTerm));
+        fromTerm.setSourceLocation(selectExpression.getSourceLocation());
+        fromClause.setSourceLocation(selectExpression.getSourceLocation());
 
         // Qualify the SELECT-CLAUSE given to us by our caller.
-        qualifyingVisitor.qualifyingVar = iterationVariableExpr.getVar();
+        qualifyingVisitor.qualifyingVar = deepCopyVisitor.visit(iterationVariable, null);
         SelectClause selectClause = selectBlockExpansionSource.getSelectClause();
         selectClause.accept(qualifyingVisitor, null);
 
@@ -117,6 +123,8 @@
                 Expression newExpression = expressionIdentifierPair.first.accept(qualifyingVisitor, null);
                 newGroupFieldList.add(new Pair<>(newExpression, expressionIdentifierPair.second));
             }
+            VariableExpr iterationVariableCopy = deepCopyVisitor.visit(iterationVariable, null);
+            newGroupFieldList.add(new Pair<>(iterationVariableCopy, iterationVariable.getVar()));
             groupbyClause.setGroupFieldList(newGroupFieldList);
         }
         if (selectBlockExpansionSource.hasLetHavingClausesAfterGroupby()) {
@@ -128,21 +136,26 @@
         // Finalize our post-canonicalization: attach our SELECT-CLAUSE, GROUP-BY, output modifiers...
         SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, groupbyClause, null);
         selectBlock.getLetHavingListAfterGroupby().addAll(letHavingClausesAfterGby);
+        selectBlock.setSourceLocation(selectBlockExpansionSource.getSourceLocation());
         SetOperationInput setOperationInput = new SetOperationInput(selectBlock, null);
         SelectSetOperation selectSetOperation = new SelectSetOperation(setOperationInput, null);
-        return new SelectExpression(null, selectSetOperation, orderByClause, limitClause, isSubquery);
+        selectSetOperation.setSourceLocation(selectBlockExpansionSource.getSourceLocation());
+        SelectExpression newSelectExpression =
+                new SelectExpression(null, selectSetOperation, orderByClause, limitClause, isSubquery);
+        newSelectExpression.setSourceLocation(selectExpression.getSourceLocation());
+        return newSelectExpression;
     }
 
     @Override
     public Expression visit(SelectSetOperation selectSetOperation, ILangExpression arg) throws CompilationException {
         // Only visit SET-OP-INPUTs if they were involved in our canonicalization.
         SetOperationInput leftInput = selectSetOperation.getLeftInput();
-        if (generatedSetOpInputs.contains(leftInput)) {
+        if (leftInput.selectBlock() && generatedSelectBlocks.contains(leftInput.getSelectBlock())) {
             leftInput.getSelectBlock().accept(this, arg);
         }
         for (SetOperationRight setOperationRight : selectSetOperation.getRightInputs()) {
             SetOperationInput rightInput = setOperationRight.getSetOperationRightInput();
-            if (generatedSetOpInputs.contains(rightInput)) {
+            if (rightInput.selectBlock() && generatedSelectBlocks.contains(rightInput.getSelectBlock())) {
                 rightInput.getSelectBlock().accept(this, arg);
             }
         }
@@ -150,11 +163,6 @@
     }
 
     @Override
-    public Expression visit(GraphSelectBlock graphSelectBlock, ILangExpression arg) throws CompilationException {
-        return visit((SelectBlock) graphSelectBlock, arg);
-    }
-
-    @Override
     public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
         if (selectBlock.hasGroupbyClause()) {
             selectBlock.setGroupbyClause(null);
@@ -170,10 +178,10 @@
     public Expression visit(SelectClause selectClause, ILangExpression arg) throws CompilationException {
         // We are going to throw away this SELECT-CLAUSE and return all user-live variables instead.
         List<Projection> newProjectionList = new ArrayList<>();
-        for (VarIdentifier userLiveVariable : userLiveVariables) {
-            String name = SqlppVariableUtil.toUserDefinedName(userLiveVariable.getValue());
-            VariableExpr newVariableExpr = new VariableExpr(userLiveVariable);
-            newProjectionList.add(new Projection(Projection.Kind.NAMED_EXPR, newVariableExpr, name));
+        for (VariableExpr userLiveVariable : sourceSelectLiveVariables) {
+            String name = SqlppVariableUtil.toUserDefinedName(userLiveVariable.getVar().getValue());
+            VariableExpr userLiveVariableCopy = deepCopyVisitor.visit(userLiveVariable, null);
+            newProjectionList.add(new Projection(Projection.Kind.NAMED_EXPR, userLiveVariableCopy, name));
         }
         selectClause.setSelectElement(null);
         selectClause.setSelectRegular(new SelectRegular(newProjectionList));
@@ -181,13 +189,16 @@
     }
 
     private class QualifyingVisitor extends AbstractGraphixQueryVisitor {
-        private VarIdentifier qualifyingVar;
+        private VariableExpr qualifyingVar;
 
         @Override
         public Expression visit(VariableExpr variableExpr, ILangExpression arg) throws CompilationException {
-            if (userLiveVariables.contains(variableExpr.getVar())) {
+            if (sourceSelectLiveVariables.contains(variableExpr)) {
                 VarIdentifier fieldAccessVar = SqlppVariableUtil.toUserDefinedVariableName(variableExpr.getVar());
-                return new FieldAccessor(new VariableExpr(qualifyingVar), fieldAccessVar);
+                VariableExpr qualifyingVariableCopy = deepCopyVisitor.visit(qualifyingVar, null);
+                FieldAccessor fieldAccessor = new FieldAccessor(qualifyingVariableCopy, fieldAccessVar);
+                fieldAccessor.setSourceLocation(variableExpr.getSourceLocation());
+                return fieldAccessor;
             }
             return super.visit(variableExpr, arg);
         }
@@ -195,17 +206,22 @@
         @Override
         public Expression visit(FieldAccessor fieldAccessor, ILangExpression arg) throws CompilationException {
             Expression fieldAccessorExpr = fieldAccessor.getExpr();
+            Identifier fieldAccessIdent = fieldAccessor.getIdent();
             if (fieldAccessorExpr.getKind() == Expression.Kind.FIELD_ACCESSOR_EXPRESSION) {
                 FieldAccessor innerFieldAccessExpr = (FieldAccessor) fieldAccessorExpr.accept(this, arg);
-                return new FieldAccessor(innerFieldAccessExpr, fieldAccessor.getIdent());
+                FieldAccessor outerFieldAccessExpr = new FieldAccessor(innerFieldAccessExpr, fieldAccessIdent);
+                outerFieldAccessExpr.setSourceLocation(fieldAccessor.getSourceLocation());
+                return outerFieldAccessExpr;
 
             } else if (fieldAccessorExpr.getKind() == Expression.Kind.VARIABLE_EXPRESSION) {
                 VariableExpr fieldAccessVarExpr = (VariableExpr) fieldAccessorExpr;
                 VarIdentifier fieldAccessVar = SqlppVariableUtil.toUserDefinedVariableName(fieldAccessVarExpr.getVar());
-                if (userLiveVariables.contains(fieldAccessVarExpr.getVar())) {
-                    VariableExpr qualifyingVarExpr = new VariableExpr(qualifyingVar);
-                    FieldAccessor innerFieldAccessExpr = new FieldAccessor(qualifyingVarExpr, fieldAccessVar);
-                    return new FieldAccessor(innerFieldAccessExpr, fieldAccessor.getIdent());
+                if (sourceSelectLiveVariables.contains(fieldAccessVarExpr)) {
+                    VariableExpr qualifyingVariableCopy = deepCopyVisitor.visit(qualifyingVar, null);
+                    FieldAccessor innerFieldAccessExpr = new FieldAccessor(qualifyingVariableCopy, fieldAccessVar);
+                    FieldAccessor outerFieldAccessExpr = new FieldAccessor(innerFieldAccessExpr, fieldAccessIdent);
+                    outerFieldAccessExpr.setSourceLocation(fieldAccessor.getSourceLocation());
+                    return outerFieldAccessExpr;
                 }
             }
             return super.visit(fieldAccessor, arg);
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostRewriteCheckVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostRewriteCheckVisitor.java
similarity index 89%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostRewriteCheckVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostRewriteCheckVisitor.java
index a1ae83d..bc102aa 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostRewriteCheckVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PostRewriteCheckVisitor.java
@@ -16,12 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
@@ -31,9 +30,11 @@
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
 import org.apache.asterix.lang.sqlpp.clause.FromTerm;
 import org.apache.asterix.lang.sqlpp.clause.JoinClause;
 import org.apache.asterix.lang.sqlpp.clause.NestClause;
@@ -42,7 +43,7 @@
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
 
 /**
- * Throw an error if a graph AST node (that isn't a special instance of {@link FromGraphClause}) is ever encountered.
+ * Throw an error if we encounter a Graphix AST node that isn't a {@link FromGraphClause} that has been lowered.
  */
 public class PostRewriteCheckVisitor extends AbstractSqlppSimpleExpressionVisitor
         implements IGraphixLangVisitor<Expression, ILangExpression> {
@@ -82,20 +83,23 @@
     }
 
     @Override
-    public Expression visit(GraphSelectBlock gsb, ILangExpression arg) throws CompilationException {
-        // The only Graph AST node that should survive is the GRAPH-SELECT-BLOCK, which should functionally act the same
-        // as its parent class SELECT-BLOCK.
-        if (!gsb.hasFromClause() || gsb.hasFromGraphClause()) {
-            return throwException(gsb);
+    public Expression visit(FromClause fc, ILangExpression arg) throws CompilationException {
+        if (fc instanceof FromGraphClause) {
+            return visit((FromGraphClause) fc, arg);
 
         } else {
-            return null;
+            return super.visit(fc, arg);
         }
     }
 
     @Override
     public Expression visit(FromGraphClause fgc, ILangExpression arg) throws CompilationException {
-        return throwException(fgc);
+        if (fgc.getLowerClause() == null) {
+            return throwException(fgc);
+
+        } else {
+            return null;
+        }
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PreRewriteCheckVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PreRewriteCheckVisitor.java
similarity index 68%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PreRewriteCheckVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PreRewriteCheckVisitor.java
index be82df7..b58463b 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PreRewriteCheckVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/PreRewriteCheckVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import static org.apache.asterix.graphix.extension.GraphixMetadataExtension.getGraph;
 
@@ -34,29 +34,42 @@
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
 import org.apache.asterix.graphix.metadata.entity.schema.Graph;
 import org.apache.asterix.graphix.metadata.entity.schema.Schema;
 import org.apache.asterix.graphix.metadata.entity.schema.Vertex;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.exceptions.SourceLocation;
 
 /**
- * A pre-rewrite pass to validate our user query. We validate the following:
- * 1. An edge variable is not defined more than once. (e.g. (u)-[e]-(v), (w)-[e]-(y))
- * 2. A vertex variable is not defined more than once with labels. (e.g. (u:User)-[e]-(v), (u:User)-[]-(:Review))
- * 3. An edge label exists in the context of the edge's {@link FromGraphClause}.
- * 4. A vertex label exists in the context of the vertex's {@link FromGraphClause}.
- * 5. The minimum hops and maximum hops of a sub-path is not equal to zero.
- * 6. The maximum hops of a sub-path is greater than or equal to the minimum hops of the same sub-path.
- * 7. An anonymous / declared graph passes the same validation that a named graph does.
+ * A pre-rewrite pass to validate / raise warnings about our user query.
+ * <p>
+ * We validate the following:
+ * <ul>
+ *  <li>An edge variable is not defined more than once. (e.g. (u)-[e]-(v), (w)-[e]-(y))</li>
+ *  <li>A vertex variable is not defined more than once with labels. (e.g. (u:User)-[e]-(v), (u:User)-[]-(:Review))</li>
+ *  <li>An edge label exists in the context of the edge's {@link FromGraphClause}.</li>
+ *  <li>A vertex label exists in the context of the vertex's {@link FromGraphClause}.</li>
+ *  <li>The minimum hops and maximum hops of a sub-path is not equal to zero.</li>
+ *  <li>The maximum hops of a sub-path is greater than or equal to the minimum hops of the same sub-path.</li>
+ *  <li>An anonymous / declared graph passes the same validation that a named graph does.</li>
+ *  <li>That variables in an element filter expression do not reference other previously defined graph-elements.</li>
+ * </ul>
+ * <p>
+ * We raise warnings about the following:
+ * <ul>
+ *  <li>We encounter a disconnected pattern. TODO (GLENN): Implement this.</li>
+ * </ul>
  */
 public class PreRewriteCheckVisitor extends AbstractGraphixQueryVisitor {
     private final Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs;
@@ -64,10 +77,11 @@
 
     // Build new environments on each FROM-GRAPH-CLAUSE visit.
     private static class PreRewriteCheckEnvironment {
-        private final Set<ElementLabel> vertexLabels = new HashSet<>();
+        private final Set<ElementLabel> elementLabels = new HashSet<>();
         private final Set<ElementLabel> edgeLabels = new HashSet<>();
         private final Set<Identifier> vertexVariablesWithLabels = new HashSet<>();
         private final Set<Identifier> edgeVariables = new HashSet<>();
+        private final Set<Identifier> allElementVariables = new HashSet<>();
     }
 
     private final Map<ILangExpression, PreRewriteCheckEnvironment> environmentMap = new HashMap<>();
@@ -79,8 +93,7 @@
 
     @Override
     public Expression visit(GraphConstructor graphConstructor, ILangExpression arg) throws CompilationException {
-        DataverseName dataverseName = metadataProvider.getDefaultDataverseName();
-        GraphIdentifier graphIdentifier = new GraphIdentifier(dataverseName, graphConstructor.getInstanceID());
+        GraphIdentifier graphIdentifier = ((FromGraphClause) arg).getGraphIdentifier(metadataProvider);
         Schema.Builder schemaBuilder = new Schema.Builder(graphIdentifier);
 
         // Perform the same validation we do for named graphs-- but don't build the schema object.
@@ -136,7 +149,7 @@
             Identifier graphName = fromGraphClause.getGraphName();
 
             // First, see if we can fetch the graph constructor from our declared graphs.
-            GraphIdentifier graphIdentifier = new GraphIdentifier(dataverseName, graphName.getValue());
+            GraphIdentifier graphIdentifier = fromGraphClause.getGraphIdentifier(metadataProvider);
             DeclareGraphStatement declaredGraph = declaredGraphs.get(graphIdentifier);
             if (declaredGraph != null) {
                 graphConstructor = declaredGraph.getGraphConstructor();
@@ -152,10 +165,10 @@
 
                     } else {
                         graphFromMetadata.getGraphSchema().getVertices().stream().map(Vertex::getLabel)
-                                .forEach(environmentMap.get(fromGraphClause).vertexLabels::add);
+                                .forEach(environmentMap.get(fromGraphClause).elementLabels::add);
                         graphFromMetadata.getGraphSchema().getEdges().forEach(e -> {
-                            environmentMap.get(fromGraphClause).vertexLabels.add(e.getSourceLabel());
-                            environmentMap.get(fromGraphClause).vertexLabels.add(e.getDestinationLabel());
+                            environmentMap.get(fromGraphClause).elementLabels.add(e.getSourceLabel());
+                            environmentMap.get(fromGraphClause).elementLabels.add(e.getDestinationLabel());
                             environmentMap.get(fromGraphClause).edgeLabels.add(e.getLabel());
                         });
                     }
@@ -168,13 +181,13 @@
         }
         if (graphConstructor != null) {
             graphConstructor.getVertexElements().stream().map(GraphConstructor.VertexConstructor::getLabel)
-                    .forEach(environmentMap.get(fromGraphClause).vertexLabels::add);
+                    .forEach(environmentMap.get(fromGraphClause).elementLabels::add);
             graphConstructor.getEdgeElements().forEach(e -> {
-                environmentMap.get(fromGraphClause).vertexLabels.add(e.getSourceLabel());
-                environmentMap.get(fromGraphClause).vertexLabels.add(e.getDestinationLabel());
+                environmentMap.get(fromGraphClause).elementLabels.add(e.getSourceLabel());
+                environmentMap.get(fromGraphClause).elementLabels.add(e.getDestinationLabel());
                 environmentMap.get(fromGraphClause).edgeLabels.add(e.getEdgeLabel());
             });
-            graphConstructor.accept(this, arg);
+            graphConstructor.accept(this, fromGraphClause);
         }
 
         // We need to pass our FROM-GRAPH-CLAUSE to our MATCH-CLAUSE.
@@ -189,54 +202,88 @@
 
     @Override
     public Expression visit(VertexPatternExpr vertexExpression, ILangExpression arg) throws CompilationException {
-        for (ElementLabel vertexLabel : vertexExpression.getLabels()) {
-            if (!environmentMap.get(arg).vertexLabels.contains(vertexLabel)) {
+        PreRewriteCheckEnvironment workingEnvironment = environmentMap.get(arg);
+        Set<ElementLabel> environmentLabels = workingEnvironment.elementLabels;
+        for (ElementLabel elementLabel : vertexExpression.getLabels()) {
+            if (environmentLabels.stream().noneMatch(e -> e.getLabelName().equals(elementLabel.getLabelName()))) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, vertexExpression.getSourceLocation(),
-                        "Vertex label " + vertexLabel + " does not exist in the given graph schema.");
+                        "Vertex label " + elementLabel + " does not exist in the given graph schema.");
             }
         }
+        if (vertexExpression.getFilterExpr() != null) {
+            vertexExpression.getFilterExpr().accept(new AbstractGraphixQueryVisitor() {
+                @Override
+                public Expression visit(VariableExpr varExpr, ILangExpression arg) throws CompilationException {
+                    if (workingEnvironment.allElementVariables.contains(varExpr.getVar())) {
+                        SourceLocation sourceLocation = vertexExpression.getFilterExpr().getSourceLocation();
+                        throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLocation,
+                                "Cannot reference other graph elements in a filter expression! Consider putting your "
+                                        + "condition in a WHERE clause.");
+                    }
+                    return super.visit(varExpr, arg);
+                }
+            }, null);
+        }
         if (vertexExpression.getVariableExpr() != null && !vertexExpression.getLabels().isEmpty()) {
             Identifier vertexIdentifier = vertexExpression.getVariableExpr().getVar();
-            if (environmentMap.get(arg).vertexVariablesWithLabels.contains(vertexIdentifier)) {
+            if (workingEnvironment.vertexVariablesWithLabels.contains(vertexIdentifier)) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, vertexExpression.getSourceLocation(),
                         "Vertex " + vertexIdentifier + " defined with a label more than once. Labels can only be "
                                 + "bound to vertices once.");
             }
-            environmentMap.get(arg).vertexVariablesWithLabels.add(vertexIdentifier);
+            workingEnvironment.vertexVariablesWithLabels.add(vertexIdentifier);
+            workingEnvironment.allElementVariables.add(vertexIdentifier);
         }
         return vertexExpression;
     }
 
     @Override
     public Expression visit(EdgePatternExpr edgeExpression, ILangExpression arg) throws CompilationException {
+        PreRewriteCheckEnvironment workingEnvironment = environmentMap.get(arg);
         EdgeDescriptor edgeDescriptor = edgeExpression.getEdgeDescriptor();
-        if (environmentMap.get(arg).edgeLabels.isEmpty()) {
+        Set<ElementLabel> environmentLabels = workingEnvironment.edgeLabels;
+        if (environmentLabels.isEmpty()) {
             throw new CompilationException(ErrorCode.COMPILATION_ERROR, edgeExpression.getSourceLocation(),
                     "Query edge given, but no edge is defined in the schema.");
         }
 
         for (ElementLabel edgeLabel : edgeDescriptor.getEdgeLabels()) {
-            if (!environmentMap.get(arg).edgeLabels.contains(edgeLabel)) {
+            if (environmentLabels.stream().noneMatch(e -> e.getLabelName().equals(edgeLabel.getLabelName()))) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, edgeExpression.getSourceLocation(),
                         "Edge label " + edgeLabel + " does not exist in the given graph schema.");
             }
         }
+        if (edgeDescriptor.getFilterExpr() != null) {
+            edgeDescriptor.getFilterExpr().accept(new AbstractGraphixQueryVisitor() {
+                @Override
+                public Expression visit(VariableExpr varExpr, ILangExpression arg) throws CompilationException {
+                    if (workingEnvironment.allElementVariables.contains(varExpr.getVar())) {
+                        SourceLocation sourceLocation = edgeDescriptor.getFilterExpr().getSourceLocation();
+                        throw new CompilationException(ErrorCode.COMPILATION_ERROR, sourceLocation,
+                                "Cannot reference other graph elements in a filter expression! Consider putting your "
+                                        + "condition in a WHERE clause.");
+                    }
+                    return super.visit(varExpr, arg);
+                }
+            }, null);
+        }
         if (edgeDescriptor.getVariableExpr() != null) {
             Identifier edgeIdentifier = edgeDescriptor.getVariableExpr().getVar();
-            if (environmentMap.get(arg).edgeVariables.contains(edgeIdentifier)) {
+            if (workingEnvironment.edgeVariables.contains(edgeIdentifier)) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, edgeExpression.getSourceLocation(),
                         "Edge " + edgeIdentifier + " defined more than once. Edges can only connect two vertices.");
             }
-            environmentMap.get(arg).edgeVariables.add(edgeIdentifier);
+            workingEnvironment.edgeVariables.add(edgeIdentifier);
+            workingEnvironment.allElementVariables.add(edgeIdentifier);
         }
         if (edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH) {
             Integer minimumHops = edgeDescriptor.getMinimumHops();
             Integer maximumHops = edgeDescriptor.getMaximumHops();
-            if (maximumHops == 0 || (minimumHops != null && minimumHops == 0)) {
+            if ((maximumHops != null && maximumHops == 0) || (minimumHops != null && minimumHops == 0)) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, edgeExpression.getSourceLocation(),
                         "Sub-path edges cannot have a hop length less than 1.");
 
-            } else if (minimumHops != null && (maximumHops < minimumHops)) {
+            } else if (minimumHops != null && maximumHops != null && maximumHops < minimumHops) {
                 throw new CompilationException(ErrorCode.COMPILATION_ERROR, edgeExpression.getSourceLocation(),
                         "Sub-path edges cannot have a maximum hop length (" + maximumHops
                                 + ") less than the minimum hop length (" + minimumHops + ").");
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/QueryCanonicalizationVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/QueryCanonicalizationVisitor.java
new file mode 100644
index 0000000..caad9ef
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/QueryCanonicalizationVisitor.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.algebra.compiler.option.ElementEvaluationOption;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.canonical.CanonicalElementBranchConsumer;
+import org.apache.asterix.graphix.lang.rewrite.canonical.CanonicalElementExpansionConsumer;
+import org.apache.asterix.graphix.lang.rewrite.canonical.CanonicalElementGeneratorFactory;
+import org.apache.asterix.graphix.lang.rewrite.common.BranchLookupTable;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.visitor.CheckSql92AggregateVisitor;
+
+/**
+ * Perform a canonicalization pass, which aims to list out unambiguous <i>navigational complex graph patterns</i>.
+ * <p>
+ * For each SELECT-EXPR, we perform the following:
+ * <ol>
+ *  <li>Collect all ambiguous graph elements in each SELECT-SET-OP.</li>
+ *  <li>Enumerate each canonical form of each ambiguous graph element.</li>
+ *  <li>Invoke one of two canonical element consumers for all ambiguous elements:
+ *   <ol>
+ *    <li>An expansion consumer, which will generate N UNION-ALL branches for N canonical forms of some element.</li>
+ *    <li>A branch consumer, which will populate a separate {@link BranchLookupTable} that holds all canonical forms of
+ *    some element.</li>
+ *   </ol></li>
+ *  <li>If our expansion consumer has fired, then we must ensure that the generated UNION-ALL does not affect any
+ *  grouping or sorts. Call {@link PostCanonicalExpansionVisitor}.</li>
+ * </ol>
+ */
+public class QueryCanonicalizationVisitor extends AbstractGraphixQueryVisitor {
+    private final CheckSql92AggregateVisitor checkSql92AggregateVisitor;
+    private final GraphixDeepCopyVisitor graphixDeepCopyVisitor;
+    private final GraphixRewritingContext graphixRewritingContext;
+    private final BranchLookupTable branchLookupTable;
+
+    public QueryCanonicalizationVisitor(BranchLookupTable branchLookupTable,
+            GraphixRewritingContext graphixRewritingContext) {
+        this.checkSql92AggregateVisitor = new CheckSql92AggregateVisitor();
+        this.graphixDeepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.branchLookupTable = branchLookupTable;
+    }
+
+    @Override
+    public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
+        // Visit our SELECT-EXPR-level LET-CLAUSEs.
+        for (LetClause letClause : selectExpression.getLetList()) {
+            letClause.accept(this, selectExpression);
+        }
+
+        // First pass: collect all ambiguous graph elements.
+        AmbiguousElementVisitor ambiguousElementVisitor = new AmbiguousElementVisitor(graphixRewritingContext);
+        SelectSetOperation selectSetOperation = selectExpression.getSelectSetOperation();
+        selectSetOperation.accept(ambiguousElementVisitor, selectExpression);
+        if (ambiguousElementVisitor.getAmbiguousElements().isEmpty()) {
+            // We have no ambiguous elements. Our [sub]query is in canonical form, and we can exit here.
+            return selectExpression;
+        }
+
+        // Second pass: enumerate all canonical forms of each ambiguous element.
+        Map<AbstractExpression, List<? extends AbstractExpression>> canonicalElementMap = new HashMap<>();
+        for (AbstractExpression element : ambiguousElementVisitor.getAmbiguousElements()) {
+            CanonicalElementGeneratorFactory factory = ambiguousElementVisitor.getGeneratorFactory(element);
+            if (element instanceof VertexPatternExpr) {
+                VertexPatternExpr vertexPatternExpr = (VertexPatternExpr) element;
+                List<VertexPatternExpr> canonicalVertices = factory.generateCanonicalVertices(vertexPatternExpr);
+                canonicalElementMap.put(element, canonicalVertices);
+
+            } else { // ambiguousElement instanceof EdgePatternExpr
+                EdgePatternExpr edgePatternExpr = (EdgePatternExpr) element;
+                EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+                if (edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.EDGE) {
+                    List<EdgePatternExpr> canonicalEdges = factory.generateCanonicalEdges(edgePatternExpr);
+                    canonicalElementMap.put(element, canonicalEdges);
+
+                } else { // edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH
+                    ElementEvaluationOption option = ambiguousElementVisitor.getElementEvaluationOption(element);
+                    List<PathPatternExpr> canonicalPaths = factory.generateCanonicalPaths(edgePatternExpr,
+                            option == ElementEvaluationOption.SWITCH_AND_CYCLE);
+                    canonicalElementMap.put(element, canonicalPaths);
+                }
+            }
+        }
+
+        // Third pass: invoke the appropriate consumer for each canonical element.
+        SelectExpression selectExpressionCopy = graphixDeepCopyVisitor.visit(selectExpression, null);
+        CanonicalElementExpansionConsumer expansionConsumer =
+                new CanonicalElementExpansionConsumer(selectExpressionCopy, graphixRewritingContext);
+        CanonicalElementBranchConsumer branchConsumer = new CanonicalElementBranchConsumer(branchLookupTable);
+        Map<SelectBlock, List<AbstractExpression>> groupedElements = new HashMap<>();
+        ambiguousElementVisitor.getAmbiguousElements().forEach(e -> {
+            SelectBlock sourceSelectBlock = ambiguousElementVisitor.getSourceSelectBlock(e);
+            groupedElements.putIfAbsent(sourceSelectBlock, new ArrayList<>());
+            groupedElements.get(sourceSelectBlock).add(e);
+        });
+        for (Map.Entry<SelectBlock, List<AbstractExpression>> entry : groupedElements.entrySet()) {
+            expansionConsumer.resetSelectBlock(entry.getKey());
+            for (AbstractExpression ambiguousElement : entry.getValue()) {
+                ElementEvaluationOption option = ambiguousElementVisitor.getElementEvaluationOption(ambiguousElement);
+                if (option == ElementEvaluationOption.EXPAND_AND_UNION) {
+                    expansionConsumer.accept(ambiguousElement, canonicalElementMap.get(ambiguousElement));
+
+                } else { // option == ElementEvaluationOption.SWITCH_AND_CYCLE
+                    branchConsumer.accept(ambiguousElement, canonicalElementMap.get(ambiguousElement));
+                }
+            }
+        }
+
+        // Check if we have any output-modifiers / grouping, that we have no SET-OPs, and if expansion has occurred.
+        boolean hasRightInputs = selectSetOperation.hasRightInputs();
+        boolean hasOutputModifiers = selectExpression.hasLimit() || selectExpression.hasOrderby();
+        boolean hasGroupBy = false, hasAggregation = false;
+        SelectBlock originalLeftSelectBlock = selectSetOperation.getLeftInput().getSelectBlock();
+        if (selectSetOperation.getLeftInput().selectBlock()) {
+            hasGroupBy = originalLeftSelectBlock.hasGroupbyClause();
+            hasAggregation = checkSql92AggregateVisitor.visit(originalLeftSelectBlock, null);
+            hasAggregation |= originalLeftSelectBlock.getSelectClause().distinct();
+        }
+
+        // Finalize our expansion consumer.
+        Set<SelectBlock> generatedSelectBlocks = new HashSet<>();
+        expansionConsumer.finalize(selectExpression, generatedSelectBlocks::add);
+
+        // Perform a post-canonical expansion pass if necessary.
+        boolean hasExpansionOccurred = !generatedSelectBlocks.isEmpty();
+        if (hasExpansionOccurred && !hasRightInputs && (hasOutputModifiers | hasGroupBy | hasAggregation)) {
+            Set<VariableExpr> liveVariables = new HashSet<>();
+            FromGraphClause fromGraphClause = (FromGraphClause) originalLeftSelectBlock.getFromClause();
+            for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
+                for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
+                    if (pathExpression.getVariableExpr() != null) {
+                        liveVariables.add(pathExpression.getVariableExpr());
+                    }
+                    for (VertexPatternExpr vertexExpression : pathExpression.getVertexExpressions()) {
+                        VariableExpr vertexVariable = vertexExpression.getVariableExpr();
+                        liveVariables.add(vertexVariable);
+                    }
+                    for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
+                        VariableExpr edgeVariable = edgeExpression.getEdgeDescriptor().getVariableExpr();
+                        liveVariables.add(edgeVariable);
+                    }
+                }
+            }
+            if (!fromGraphClause.getCorrelateClauses().isEmpty()) {
+                List<AbstractBinaryCorrelateClause> correlateClauses = fromGraphClause.getCorrelateClauses();
+                for (AbstractBinaryCorrelateClause correlateClause : correlateClauses) {
+                    VariableExpr bindingVariable = correlateClause.getRightVariable();
+                    liveVariables.add(bindingVariable);
+                }
+            }
+            if (originalLeftSelectBlock.hasLetWhereClauses()) {
+                for (AbstractClause abstractClause : originalLeftSelectBlock.getLetWhereList()) {
+                    if (abstractClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
+                        LetClause letClause = (LetClause) abstractClause;
+                        VariableExpr bindingVariable = letClause.getVarExpr();
+                        liveVariables.add(bindingVariable);
+                    }
+                }
+            }
+            return new PostCanonicalExpansionVisitor(graphixRewritingContext, originalLeftSelectBlock,
+                    generatedSelectBlocks, liveVariables).visit(selectExpression, arg);
+        }
+
+        // Return our current SELECT-EXPR.
+        return selectExpression;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/SchemaEnrichmentVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/SchemaEnrichmentVisitor.java
new file mode 100644
index 0000000..ca64259
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/SchemaEnrichmentVisitor.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.isEdgeFunction;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.isVertexFunction;
+import static org.apache.asterix.graphix.function.GraphixFunctionMap.getFunctionPrepare;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateEdgeOption;
+import org.apache.asterix.graphix.algebra.compiler.option.SchemaDecorateVertexOption;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.graphix.function.prepare.IFunctionPrepare;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.LowerListClause;
+import org.apache.asterix.graphix.lang.clause.LowerSwitchClause;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.common.BranchLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.common.ElementLookupTable;
+import org.apache.asterix.graphix.lang.rewrite.lower.struct.ClauseCollection;
+import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.lang.common.base.Clause;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+
+/**
+ * Perform a pass to enrich any {@link LetClause} and {@link LowerSwitchClause} nodes with necessary schema
+ * information. Note that this process may overestimate the amount of enrichment actually required (to minimize this
+ * difference requires some form of equivalence classes @ the rewriter level).
+ */
+public class SchemaEnrichmentVisitor extends AbstractGraphixQueryVisitor {
+    private final ElementLookupTable elementLookupTable;
+    private final Set<FunctionIdentifier> functionIdentifiers;
+    private final Map<VariableExpr, Expression> expressionMap;
+    private final SelectBlock workingSelectBlock;
+    private final GraphIdentifier graphIdentifier;
+    private final BranchLookupTable branchLookupTable;
+
+    public SchemaEnrichmentVisitor(SchemaDecorateVertexOption vertexMode, SchemaDecorateEdgeOption edgeMode,
+            ElementLookupTable elementLookupTable, BranchLookupTable branchLookupTable, GraphIdentifier graphIdentifier,
+            SelectBlock workingSelectBlock, Set<FunctionIdentifier> functionIDs) {
+        this.graphIdentifier = graphIdentifier;
+        this.elementLookupTable = elementLookupTable;
+        this.workingSelectBlock = workingSelectBlock;
+        this.branchLookupTable = branchLookupTable;
+        this.expressionMap = new HashMap<>();
+
+        // If we always need to perform schema-enrichment, then we add all of our schema functions to this set.
+        this.functionIdentifiers = functionIDs;
+        if (vertexMode == SchemaDecorateVertexOption.ALWAYS) {
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.ELEMENT_LABEL);
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.VERTEX_DETAIL);
+        }
+        if (edgeMode == SchemaDecorateEdgeOption.ALWAYS) {
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.ELEMENT_LABEL);
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.EDGE_DETAIL);
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.EDGE_DIRECTION);
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.EDGE_SOURCE_VERTEX);
+            this.functionIdentifiers.add(GraphixFunctionIdentifiers.EDGE_DEST_VERTEX);
+        }
+    }
+
+    private void visitClauseCollection(ClauseCollection clauseCollection) throws CompilationException {
+        for (FunctionIdentifier functionIdentifier : functionIdentifiers) {
+            IFunctionPrepare functionPrepare = getFunctionPrepare(functionIdentifier);
+            for (LetClause representativeEdgeBinding : clauseCollection.getRepresentativeEdgeBindings()) {
+                VariableExpr rightVar = representativeEdgeBinding.getVarExpr();
+                Expression graphExpr = expressionMap.get(rightVar);
+                if (isEdgeFunction(functionIdentifier)) {
+                    Expression outputExpr = functionPrepare.prepare(representativeEdgeBinding.getBindingExpr(),
+                            graphExpr, graphIdentifier, elementLookupTable);
+                    representativeEdgeBinding.setBindingExpr(outputExpr);
+                }
+            }
+            for (LetClause representativeVertexBinding : clauseCollection.getRepresentativeVertexBindings()) {
+                VariableExpr rightVar = representativeVertexBinding.getVarExpr();
+                Expression graphExpr = expressionMap.get(rightVar);
+                if (isVertexFunction(functionIdentifier)) {
+                    Expression outputExpr = functionPrepare.prepare(representativeVertexBinding.getBindingExpr(),
+                            graphExpr, graphIdentifier, elementLookupTable);
+                    representativeVertexBinding.setBindingExpr(outputExpr);
+                }
+            }
+            for (Pair<VariableExpr, LetClause> eagerVertexBinding : clauseCollection.getEagerVertexBindings()) {
+                Expression graphExpr = expressionMap.get(eagerVertexBinding.first);
+                if (isVertexFunction(functionIdentifier)) {
+                    Expression outputExpr = functionPrepare.prepare(eagerVertexBinding.second.getBindingExpr(),
+                            graphExpr, graphIdentifier, elementLookupTable);
+                    eagerVertexBinding.second.setBindingExpr(outputExpr);
+                }
+            }
+            for (AbstractClause nonRepresentativeClause : clauseCollection.getNonRepresentativeClauses()) {
+                if (nonRepresentativeClause.getClauseType() == Clause.ClauseType.EXTENSION) {
+                    LowerSwitchClause lowerSwitchClause = (LowerSwitchClause) nonRepresentativeClause;
+                    for (ClauseCollection innerClauseCollection : lowerSwitchClause.getCollectionLookupTable()) {
+                        visitClauseCollection(innerClauseCollection);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        // Visit our immediate MATCH AST nodes (do not visit lower levels).
+        FromGraphClause fromGraphClause = (FromGraphClause) selectBlock.getFromClause();
+        for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
+            matchClause.accept(this, arg);
+        }
+
+        // We are going to enrich these LET-CLAUSEs & FIXED-POINT-CLAUSEs w/ the necessary schema.
+        if (workingSelectBlock.equals(selectBlock)) {
+            LowerListClause lowerClause = (LowerListClause) fromGraphClause.getLowerClause();
+            ClauseCollection clauseCollection = lowerClause.getClauseCollection();
+            visitClauseCollection(clauseCollection);
+        }
+        return null;
+    }
+
+    @Override
+    public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) throws CompilationException {
+        VariableExpr variableExpr = vertexPatternExpr.getVariableExpr();
+        if (variableExpr != null) {
+            expressionMap.put(variableExpr, vertexPatternExpr);
+        }
+        return super.visit(vertexPatternExpr, arg);
+    }
+
+    @Override
+    public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
+        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
+        VariableExpr variableExpr = edgeDescriptor.getVariableExpr();
+        if (variableExpr != null) {
+            expressionMap.put(variableExpr, edgePatternExpr);
+        }
+        if (branchLookupTable.getBranches(edgePatternExpr) != null) {
+            for (EdgePatternExpr branch : branchLookupTable.getBranches(edgePatternExpr)) {
+                branch.getLeftVertex().accept(this, arg);
+                branch.getRightVertex().accept(this, arg);
+                branch.accept(this, arg);
+            }
+        }
+        edgePatternExpr.getLeftVertex().accept(this, arg);
+        edgePatternExpr.getRightVertex().accept(this, arg);
+        return edgePatternExpr;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/SubqueryVertexJoinVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/SubqueryVertexJoinVisitor.java
new file mode 100644
index 0000000..95993d5
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/SubqueryVertexJoinVisitor.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.lang.annotation.SubqueryVertexJoinAnnotation;
+import org.apache.asterix.graphix.lang.clause.FromGraphClause;
+import org.apache.asterix.graphix.lang.clause.MatchClause;
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.WhereClause;
+import org.apache.asterix.lang.common.context.Scope;
+import org.apache.asterix.lang.common.expression.OperatorExpr;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.parser.ScopeChecker;
+import org.apache.asterix.lang.common.struct.OperatorType;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+
+/**
+ * Search for Graphix sub-queries that have 'free' vertices, and see if we can explicitly JOIN them with a vertex in
+ * a parent query that refers to the same graph.
+ */
+public class SubqueryVertexJoinVisitor extends AbstractGraphixQueryVisitor {
+    private final GraphixDeepCopyVisitor graphixDeepCopyVisitor;
+    private final GraphixRewritingContext graphixRewritingContext;
+    private final Map<GraphIdentifier, ScopeChecker> vertexScopeMap;
+    private final Deque<GraphIdentifier> graphIdentifierStack;
+
+    public SubqueryVertexJoinVisitor(GraphixRewritingContext graphixRewritingContext) {
+        this.graphixDeepCopyVisitor = new GraphixDeepCopyVisitor();
+        this.graphixRewritingContext = graphixRewritingContext;
+        this.graphIdentifierStack = new ArrayDeque<>();
+        this.vertexScopeMap = new HashMap<>();
+    }
+
+    @Override
+    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        if (selectBlock.hasFromClause() && selectBlock.getFromClause() instanceof FromGraphClause) {
+            FromGraphClause fromGraphClause = (FromGraphClause) selectBlock.getFromClause();
+            MetadataProvider metadataProvider = graphixRewritingContext.getMetadataProvider();
+            GraphIdentifier graphIdentifier = fromGraphClause.getGraphIdentifier(metadataProvider);
+            vertexScopeMap.putIfAbsent(graphIdentifier, new ScopeChecker());
+            graphIdentifierStack.push(graphIdentifier);
+            vertexScopeMap.get(graphIdentifier).createNewScope();
+
+            // We want to provide our SELECT-BLOCK to our MATCH-CLAUSE.
+            super.visit(selectBlock, selectBlock);
+            graphIdentifierStack.pop();
+            vertexScopeMap.get(graphIdentifier).removeCurrentScope();
+
+        } else {
+            super.visit(selectBlock, arg);
+        }
+        return null;
+    }
+
+    @Override
+    public Expression visit(MatchClause matchClause, ILangExpression arg) throws CompilationException {
+        GraphIdentifier workingGraphIdentifier = graphIdentifierStack.peek();
+        ScopeChecker workingScopeChecker = vertexScopeMap.get(workingGraphIdentifier);
+        Scope precedingScope = workingScopeChecker.getPrecedingScope();
+        Scope currentScope = workingScopeChecker.getCurrentScope();
+
+        Map<VariableExpr, VariableExpr> remappedVariables = new HashMap<>();
+        for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
+            for (VertexPatternExpr vertexExpression : pathExpression.getVertexExpressions()) {
+                VariableExpr vertexVariable = vertexExpression.getVariableExpr();
+                VarIdentifier vertexName = vertexVariable.getVar();
+                if (precedingScope == null || precedingScope.getParentScope() == null) {
+                    // We are in a top-level FROM-GRAPH-CLAUSE. Add this variable to our current scope.
+                    currentScope.addSymbolToScope(vertexName);
+
+                } else if (currentScope.findLocalSymbol(vertexName.getValue()) == null
+                        && currentScope.findSymbol(vertexName.getValue()) != null) {
+                    // We have a nested Graphix query, and we have found a vertex that references an outer vertex.
+                    SelectBlock parentSelectBlock = (SelectBlock) arg;
+
+                    // Replace the current vertex variable with a copy.
+                    VariableExpr newVariable = graphixRewritingContext.getGraphixVariableCopy(vertexVariable);
+                    vertexExpression.setVariableExpr(newVariable);
+                    vertexExpression.getVariableExpr().setSourceLocation(vertexVariable.getSourceLocation());
+                    vertexExpression.addHint(new SubqueryVertexJoinAnnotation(vertexVariable));
+                    remappedVariables.put(vertexVariable, newVariable);
+
+                    // JOIN our copy with the parent vertex variable.
+                    List<Expression> joinArgs = List.of(vertexVariable, newVariable);
+                    OperatorExpr joinExpr = new OperatorExpr(joinArgs, List.of(OperatorType.EQ), false);
+                    parentSelectBlock.getLetWhereList().add(new WhereClause(joinExpr));
+
+                } else if (currentScope.findLocalSymbol(vertexName.getValue()) == null) {
+                    // We have a nested Graphix query that does not correlate with an outer query.
+                    currentScope.addSymbolToScope(vertexName);
+
+                } else if (remappedVariables.containsKey(vertexVariable)) {
+                    // We have replaced this variable already. Update the reference.
+                    VariableExpr remappedVertexVariable = remappedVariables.get(vertexVariable);
+                    vertexExpression.setVariableExpr(graphixDeepCopyVisitor.visit(remappedVertexVariable, null));
+                    vertexExpression.getVariableExpr().setSourceLocation(vertexVariable.getSourceLocation());
+                    vertexExpression.addHint(new SubqueryVertexJoinAnnotation(vertexVariable));
+                }
+            }
+            for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
+                VertexPatternExpr leftVertex = edgeExpression.getLeftVertex();
+                VertexPatternExpr rightVertex = edgeExpression.getRightVertex();
+                if (remappedVariables.containsKey(leftVertex.getVariableExpr())) {
+                    VariableExpr leftVariableRemap = remappedVariables.get(leftVertex.getVariableExpr());
+                    leftVertex.setVariableExpr(graphixDeepCopyVisitor.visit(leftVariableRemap, null));
+                    leftVertex.addHint(new SubqueryVertexJoinAnnotation(leftVariableRemap));
+                }
+                if (remappedVariables.containsKey(rightVertex.getVariableExpr())) {
+                    VariableExpr rightVariableRemap = remappedVariables.get(rightVertex.getVariableExpr());
+                    rightVertex.setVariableExpr(graphixDeepCopyVisitor.visit(rightVariableRemap, null));
+                    rightVertex.addHint(new SubqueryVertexJoinAnnotation(rightVariableRemap));
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/VariableRemapCloneVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/VariableRemapCloneVisitor.java
new file mode 100644
index 0000000..4b9ba96
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/VariableRemapCloneVisitor.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.rewrite.visitor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.rewrites.VariableSubstitutionEnvironment;
+import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+import org.apache.asterix.lang.sqlpp.clause.JoinClause;
+import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
+import org.apache.asterix.lang.sqlpp.visitor.SqlppCloneAndSubstituteVariablesVisitor;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+/**
+ * An extension of {@link SqlppCloneAndSubstituteVariablesVisitor} that also remaps binding variables.
+ */
+public class VariableRemapCloneVisitor extends SqlppCloneAndSubstituteVariablesVisitor {
+    private final Map<VariableExpr, Expression> variableToExpressionMap = new HashMap<>();
+
+    public VariableRemapCloneVisitor(GraphixRewritingContext graphixRewritingContext) {
+        super(graphixRewritingContext);
+    }
+
+    public void addSubstitution(VariableExpr variable, Expression newExpr) {
+        variableToExpressionMap.put(variable, newExpr);
+    }
+
+    public void resetSubstitutions() {
+        variableToExpressionMap.clear();
+    }
+
+    public ILangExpression substitute(ILangExpression langExpression) throws CompilationException {
+        return langExpression.accept(this, createKeepSubstitutionEnvironment()).first;
+    }
+
+    @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(FromTerm fromTerm,
+            VariableSubstitutionEnvironment env) throws CompilationException {
+        Pair<ILangExpression, VariableSubstitutionEnvironment> pair = super.visit(fromTerm, env);
+        if (env.constainsOldVar(fromTerm.getLeftVariable())
+                || (fromTerm.hasPositionalVariable() && env.constainsOldVar(fromTerm.getPositionalVariable()))) {
+            FromTerm fromTermAfterVisit = (FromTerm) pair.first;
+            VariableExpr remapLeftVariable = (VariableExpr) rewriteVariableExpr(fromTerm.getLeftVariable(), env);
+            VariableExpr remapPositionalVariable = fromTerm.hasPositionalVariable()
+                    ? (VariableExpr) rewriteVariableExpr(fromTerm.getPositionalVariable(), env) : null;
+            FromTerm fromTermWithRemapVariable = new FromTerm(fromTermAfterVisit.getLeftExpression(), remapLeftVariable,
+                    remapPositionalVariable, fromTermAfterVisit.getCorrelateClauses());
+            fromTermWithRemapVariable.setSourceLocation(fromTermAfterVisit.getSourceLocation());
+            return new Pair<>(fromTermWithRemapVariable, pair.second);
+
+        } else {
+            return pair;
+        }
+    }
+
+    @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(JoinClause joinClause,
+            VariableSubstitutionEnvironment env) throws CompilationException {
+        Pair<ILangExpression, VariableSubstitutionEnvironment> pair = super.visit(joinClause, env);
+        if (env.constainsOldVar(joinClause.getRightVariable())
+                || (joinClause.hasPositionalVariable() && env.constainsOldVar(joinClause.getPositionalVariable()))) {
+            JoinClause joinClauseAfterVisit = (JoinClause) pair.first;
+            VariableExpr remapRightVariable = (VariableExpr) rewriteVariableExpr(joinClause.getRightVariable(), env);
+            VariableExpr remapPositionalVariable = joinClause.hasPositionalVariable()
+                    ? (VariableExpr) rewriteVariableExpr(joinClause.getPositionalVariable(), env) : null;
+
+            // A new environment gets created for our condition expression in our parent, so we need to revisit here.
+            ILangExpression remapConditionExpression = joinClause.getConditionExpression().accept(this, env).first;
+            JoinClause joinClauseWithRemapVariable = new JoinClause(joinClauseAfterVisit.getJoinType(),
+                    joinClauseAfterVisit.getRightExpression(), remapRightVariable, remapPositionalVariable,
+                    (Expression) remapConditionExpression, joinClauseAfterVisit.getOuterJoinMissingValueType());
+            joinClauseWithRemapVariable.setSourceLocation(joinClauseAfterVisit.getSourceLocation());
+            return new Pair<>(joinClauseWithRemapVariable, pair.second);
+
+        } else {
+            return pair;
+        }
+    }
+
+    @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(UnnestClause unnestClause,
+            VariableSubstitutionEnvironment env) throws CompilationException {
+        Pair<ILangExpression, VariableSubstitutionEnvironment> pair = super.visit(unnestClause, env);
+        if (env.constainsOldVar(unnestClause.getRightVariable()) || (unnestClause.hasPositionalVariable()
+                && env.constainsOldVar(unnestClause.getPositionalVariable()))) {
+            UnnestClause unnestClauseAfterVisit = (UnnestClause) pair.first;
+            VariableExpr remapRightVariable = (VariableExpr) rewriteVariableExpr(unnestClause.getRightVariable(), env);
+            VariableExpr remapPositionalVariable = unnestClause.hasPositionalVariable()
+                    ? (VariableExpr) rewriteVariableExpr(unnestClause.getPositionalVariable(), env) : null;
+            UnnestClause unnestClauseWithRemapVariable = new UnnestClause(unnestClauseAfterVisit.getUnnestType(),
+                    unnestClauseAfterVisit.getRightExpression(), remapRightVariable, remapPositionalVariable,
+                    unnestClauseAfterVisit.getOuterUnnestMissingValueType());
+            unnestClauseWithRemapVariable.setSourceLocation(unnestClauseAfterVisit.getSourceLocation());
+            return new Pair<>(unnestClauseWithRemapVariable, pair.second);
+
+        } else {
+            return pair;
+        }
+    }
+
+    @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(LetClause letClause,
+            VariableSubstitutionEnvironment env) throws CompilationException {
+        Pair<ILangExpression, VariableSubstitutionEnvironment> pair = super.visit(letClause, env);
+        if (env.constainsOldVar(letClause.getVarExpr())) {
+            LetClause letClauseAfterVisit = (LetClause) pair.first;
+            VariableExpr remapVariable = (VariableExpr) rewriteVariableExpr(letClause.getVarExpr(), env);
+            LetClause letClauseWithRemapVariable = new LetClause(remapVariable, letClauseAfterVisit.getBindingExpr());
+            letClauseWithRemapVariable.setSourceLocation(letClauseAfterVisit.getSourceLocation());
+            return new Pair<>(letClauseWithRemapVariable, pair.second);
+
+        } else {
+            return pair;
+        }
+    }
+
+    private VariableSubstitutionEnvironment createKeepSubstitutionEnvironment() {
+        return new VariableSubstitutionEnvironment(variableToExpressionMap) {
+            @Override
+            public void removeSubstitution(VariableExpr oldVar) {
+                // We don't want to remove our substitution here.
+            }
+        };
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ScopingCheckVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/VariableScopingCheckVisitor.java
similarity index 74%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ScopingCheckVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/VariableScopingCheckVisitor.java
index 2b01f9c..6d28200 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ScopingCheckVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrite/visitor/VariableScopingCheckVisitor.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.rewrite.visitor;
 
 import java.util.ArrayDeque;
 import java.util.Deque;
@@ -25,30 +25,31 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
 import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
+import org.apache.asterix.graphix.lang.rewrite.GraphixRewritingContext;
 import org.apache.asterix.graphix.lang.statement.CreateGraphStatement;
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
 import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.lang.common.base.AbstractClause;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
 import org.apache.asterix.lang.sqlpp.clause.Projection;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
 import org.apache.asterix.lang.sqlpp.clause.SelectClause;
 import org.apache.asterix.lang.sqlpp.clause.SelectRegular;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.lang.sqlpp.visitor.CheckSql92AggregateVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.commons.lang3.mutable.MutableObject;
@@ -56,70 +57,52 @@
 /**
  * Ensure that any subtree whose immediate parent node includes a {@link FromGraphClause} follow Graphix-specific
  * variable resolution rules (i.e. do not rely on context variables).
- * - {@link PathPatternExpr} may introduce a variable. Uniqueness is enforced here.
- * - {@link EdgePatternExpr} may introduce a variable. Uniqueness is enforced w/ {@link PreRewriteCheckVisitor}.
- * - {@link VertexPatternExpr} may introduce a variable. Uniqueness is not required.
- * - {@link org.apache.asterix.lang.sqlpp.clause.JoinClause} may introduce a variable (handled in parent).
- * - {@link org.apache.asterix.lang.sqlpp.clause.NestClause} may introduce a variable (handled in parent).
- * - {@link org.apache.asterix.lang.sqlpp.clause.UnnestClause} may introduce a variable (handled in parent).
- * - {@link org.apache.asterix.lang.common.clause.GroupbyClause} may introduce a variable (handled in parent).
- * - {@link org.apache.asterix.lang.common.clause.LetClause} may introduce a variable (handled in parent).
+ * <ul>
+ *  <li>{@link PathPatternExpr} may introduce a variable. Uniqueness is enforced here.</li>
+ *  <li>{@link EdgePatternExpr} may introduce a variable. Uniqueness is enforced w/ {@link PreRewriteCheckVisitor}.</li>
+ *  <li>{@link VertexPatternExpr} may introduce a variable. Uniqueness is not required.</li>
+ *  <li>{@link org.apache.asterix.lang.sqlpp.clause.JoinClause} may introduce a variable (handled in parent).</li>
+ *  <li>{@link org.apache.asterix.lang.sqlpp.clause.NestClause} may introduce a variable (handled in parent).</li>
+ *  <li>{@link org.apache.asterix.lang.sqlpp.clause.UnnestClause} may introduce a variable (handled in parent).</li>
+ *  <li>{@link org.apache.asterix.lang.common.clause.GroupbyClause} may introduce a variable (handled in parent).</li>
+ *  <li>{@link org.apache.asterix.lang.common.clause.LetClause} may introduce a variable (handled in parent).</li>
+ * </ul>
  */
-public class ScopingCheckVisitor extends AbstractSqlppExpressionScopingVisitor
+public class VariableScopingCheckVisitor extends AbstractSqlppExpressionScopingVisitor
         implements IGraphixLangVisitor<Expression, ILangExpression> {
-    private final Deque<Mutable<Boolean>> graphixVisitStack = new ArrayDeque<>();
+    private final CheckSql92AggregateVisitor checkSql92AggregateVisitor = new CheckSql92AggregateVisitor();
+    private final Deque<Mutable<Boolean>> fromGraphClauseVisitStack = new ArrayDeque<>();
 
-    public ScopingCheckVisitor(GraphixRewritingContext graphixRewritingContext) {
+    public VariableScopingCheckVisitor(GraphixRewritingContext graphixRewritingContext) {
         super(graphixRewritingContext);
 
         // We start with an element of false in our stack.
-        graphixVisitStack.addLast(new MutableObject<>(false));
+        fromGraphClauseVisitStack.addLast(new MutableObject<>(false));
     }
 
     @Override
     public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
-        graphixVisitStack.addLast(new MutableObject<>(false));
+        fromGraphClauseVisitStack.addLast(new MutableObject<>(false));
         super.visit(selectExpression, arg);
-        graphixVisitStack.removeLast();
+        fromGraphClauseVisitStack.removeLast();
         return selectExpression;
     }
 
     @Override
-    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
-        return (selectBlock instanceof GraphSelectBlock) ? this.visit((GraphSelectBlock) selectBlock, arg)
-                : super.visit(selectBlock, arg);
-    }
+    public Expression visit(FromClause fromClause, ILangExpression arg) throws CompilationException {
+        if (fromClause instanceof FromGraphClause) {
+            return visit((FromGraphClause) fromClause, arg);
 
-    @Override
-    public Expression visit(GraphSelectBlock graphSelectBlock, ILangExpression arg) throws CompilationException {
-        graphixVisitStack.getLast().setValue(true);
-        if (graphSelectBlock.hasFromGraphClause()) {
-            graphSelectBlock.getFromGraphClause().accept(this, arg);
-
-        } else if (graphSelectBlock.hasFromClause()) {
-            graphSelectBlock.getFromClause().accept(this, arg);
+        } else {
+            return super.visit(fromClause, arg);
         }
-        if (graphSelectBlock.hasLetWhereClauses()) {
-            for (AbstractClause clause : graphSelectBlock.getLetWhereList()) {
-                clause.accept(this, arg);
-            }
-        }
-        if (graphSelectBlock.hasGroupbyClause()) {
-            graphSelectBlock.getGroupbyClause().accept(this, arg);
-        }
-        if (graphSelectBlock.hasLetHavingClausesAfterGroupby()) {
-            for (AbstractClause clause : graphSelectBlock.getLetHavingListAfterGroupby()) {
-                clause.accept(this, arg);
-            }
-        }
-        graphSelectBlock.getSelectClause().accept(this, arg);
-        return null;
     }
 
     @Override
     public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
         // We are now working with a new scope.
         scopeChecker.createNewScope();
+        fromGraphClauseVisitStack.getLast().setValue(true);
         for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
             matchClause.accept(this, arg);
         }
@@ -167,6 +150,9 @@
         if (edgeDescriptor.getVariableExpr() != null) {
             scopeChecker.getCurrentScope().addNewVarSymbolToScope(edgeDescriptor.getVariableExpr().getVar());
         }
+        if (edgeDescriptor.getFilterExpr() != null) {
+            edgeDescriptor.getFilterExpr().accept(this, arg);
+        }
         return edgePatternExpr;
     }
 
@@ -175,9 +161,18 @@
         if (vertexPatternExpr.getVariableExpr() != null) {
             scopeChecker.getCurrentScope().addNewVarSymbolToScope(vertexPatternExpr.getVariableExpr().getVar());
         }
+        if (vertexPatternExpr.getFilterExpr() != null) {
+            vertexPatternExpr.getFilterExpr().accept(this, arg);
+        }
         return vertexPatternExpr;
     }
 
+    // We will defer the scope of SQL-92 aggregates to our AggregationSugarVisitor.
+    @Override
+    public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
+        return (checkSql92AggregateVisitor.visit(callExpr, arg)) ? callExpr : super.visit(callExpr, arg);
+    }
+
     // We aren't going to inline our column aliases (yet), so add our select variables to our scope.
     @Override
     public Expression visit(SelectClause selectClause, ILangExpression arg) throws CompilationException {
@@ -194,7 +189,8 @@
 
     @Override
     public Expression visit(VariableExpr varExpr, ILangExpression arg) throws CompilationException {
-        boolean hasVisitedGraphixNode = !graphixVisitStack.isEmpty() && graphixVisitStack.getLast().getValue();
+        boolean hasVisitedGraphixNode =
+                !fromGraphClauseVisitStack.isEmpty() && fromGraphClauseVisitStack.getLast().getValue();
         String varSymbol = varExpr.getVar().getValue();
 
         // We will only throw an unresolved error if we first encounter a Graphix AST node.
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixQueryRewriter.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixQueryRewriter.java
deleted file mode 100644
index 86fc0ce..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixQueryRewriter.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.algebra.compiler.provider.GraphixCompilationProvider;
-import org.apache.asterix.graphix.lang.parser.GraphixParserFactory;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
-import org.apache.asterix.graphix.lang.rewrites.print.SqlppASTPrintQueryVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.CanonicalExpansionVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.ElementLookupTableVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.FunctionResolutionVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.GraphixFunctionCallVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.GraphixLoweringVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.GroupByAggSugarVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.PopulateUnknownsVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.PostRewriteCheckVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.PostRewriteVariableVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.PreRewriteCheckVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.ScopingCheckVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.StructureAnalysisVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.StructureResolutionVisitor;
-import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.IParserFactory;
-import org.apache.asterix.lang.common.base.IReturningStatement;
-import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
-import org.apache.asterix.lang.common.statement.Query;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.common.util.ExpressionUtils;
-import org.apache.asterix.lang.sqlpp.rewrites.SqlppFunctionBodyRewriter;
-import org.apache.asterix.lang.sqlpp.rewrites.SqlppQueryRewriter;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.metadata.entities.Dataverse;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-/**
- * Rewriter for Graphix queries, which will lower all graph AST nodes into SQL++ AST nodes. We perform the following:
- * 1. Perform an error-checking on the fresh AST (immediately after parsing).
- * 2. Populate the unknowns in our AST (e.g. vertex / edge variables, projections, GROUP-BY keys).
- * 3. Perform a variable-scoping pass to identify illegal variables (either duplicate or out-of-scope).
- * 4. Resolve all of our function calls (Graphix, SQL++, and user-defined).
- * 5. Perform resolution of unlabeled vertices / edges, as well as edge directions.
- * 6. Using the labels of the vertices / edges in our AST, fetch the relevant graph elements from our metadata.
- * 7. Perform a canonical Graphix lowering pass to remove ambiguities (e.g. undirected edges).
- * 8. Perform a lowering pass to transform Graphix AST nodes to SQL++ AST nodes.
- * 9. Perform another lowering pass to transform Graphix CALL-EXPR nodes to SQL++ AST nodes.
- * 10. Perform all SQL++ rewrites on our newly lowered AST.
- */
-public class GraphixQueryRewriter extends SqlppQueryRewriter {
-    private static final Logger LOGGER = LogManager.getLogger(GraphixQueryRewriter.class);
-
-    private final GraphixParserFactory parserFactory;
-    private final SqlppQueryRewriter bodyRewriter;
-
-    public GraphixQueryRewriter(IParserFactory parserFactory) {
-        super(parserFactory);
-        this.parserFactory = (GraphixParserFactory) parserFactory;
-        this.bodyRewriter = getFunctionAndViewBodyRewriter();
-    }
-
-    @Override
-    public void rewrite(LangRewritingContext langRewritingContext, IReturningStatement topStatement,
-            boolean allowNonStoredUDFCalls, boolean inlineUdfsAndViews, Collection<VarIdentifier> externalVars)
-            throws CompilationException {
-        LOGGER.debug("Starting Graphix AST rewrites.");
-
-        // Perform an initial error-checking pass to validate our user query.
-        LOGGER.trace("Performing pre-Graphix-rewrite check (user query validation).");
-        GraphixRewritingContext graphixRewritingContext = (GraphixRewritingContext) langRewritingContext;
-        PreRewriteCheckVisitor preRewriteCheckVisitor = new PreRewriteCheckVisitor(graphixRewritingContext);
-        topStatement.getBody().accept(preRewriteCheckVisitor, null);
-
-        // Perform the Graphix rewrites.
-        rewriteGraphixASTNodes(graphixRewritingContext, topStatement, allowNonStoredUDFCalls);
-
-        // Sanity check: ensure that no graph AST nodes exist after this point.
-        LOGGER.trace("Performing post-Graphix-rewrite check (making sure no graph AST nodes exist).");
-        PostRewriteCheckVisitor postRewriteCheckVisitor = new PostRewriteCheckVisitor();
-        topStatement.getBody().accept(postRewriteCheckVisitor, null);
-
-        // Perform the remainder of the SQL++ rewrites.
-        LOGGER.debug("Ending Graphix AST rewrites. Now starting SQL++ AST rewrites.");
-        rewriteSQLPPASTNodes(langRewritingContext, topStatement, allowNonStoredUDFCalls, inlineUdfsAndViews,
-                externalVars);
-
-        // If desired, log the SQL++ query equivalent (i.e. turn the AST back into a query and log this).
-        MetadataProvider metadataProvider = graphixRewritingContext.getMetadataProvider();
-        String printRewriteMetadataKeyName = GraphixCompilationProvider.PRINT_REWRITE_METADATA_CONFIG;
-        String printRewriteOption = (String) metadataProvider.getConfig().get(printRewriteMetadataKeyName);
-        if ((printRewriteOption != null && printRewriteOption.equalsIgnoreCase("true")) || LOGGER.isTraceEnabled()) {
-            StringWriter stringWriter = new StringWriter();
-            PrintWriter printWriter = new PrintWriter(stringWriter);
-            new SqlppASTPrintQueryVisitor(printWriter).visit((Query) topStatement, null);
-            LOGGER.log(LOGGER.getLevel(), "Rewritten Graphix query: " + stringWriter);
-        }
-
-        // Update the variable counter on our context.
-        topStatement.setVarCounter(graphixRewritingContext.getVarCounter().get());
-        LOGGER.debug("Ending SQL++ AST rewrites.");
-    }
-
-    public void loadNormalizedGraphElement(GraphixRewritingContext graphixRewritingContext,
-            GraphElementDeclaration graphElementDeclaration) throws CompilationException {
-        if (graphElementDeclaration.getNormalizedBody() == null) {
-            Dataverse defaultDataverse = graphixRewritingContext.getMetadataProvider().getDefaultDataverse();
-            Dataverse targetDataverse;
-
-            // We might need to change our dataverse, if the element definition requires a different one.
-            DataverseName elementName = graphElementDeclaration.getIdentifier().getGraphIdentifier().getDataverseName();
-            if (elementName.equals(defaultDataverse.getDataverseName())) {
-                targetDataverse = defaultDataverse;
-
-            } else {
-                try {
-                    targetDataverse = graphixRewritingContext.getMetadataProvider().findDataverse(elementName);
-
-                } catch (AlgebricksException e) {
-                    throw new CompilationException(ErrorCode.UNKNOWN_DATAVERSE, e,
-                            graphElementDeclaration.getSourceLocation(), elementName);
-                }
-            }
-            graphixRewritingContext.getMetadataProvider().setDefaultDataverse(targetDataverse);
-
-            // Get the body of the rewritten query.
-            Expression rawBody = graphElementDeclaration.getRawBody();
-            try {
-                Query wrappedQuery =
-                        ExpressionUtils.createWrappedQuery(rawBody, graphElementDeclaration.getSourceLocation());
-                bodyRewriter.rewrite(graphixRewritingContext, wrappedQuery, false, false, List.of());
-                graphElementDeclaration.setNormalizedBody(wrappedQuery.getBody());
-
-            } catch (CompilationException e) {
-                throw new CompilationException(ErrorCode.COMPILATION_ERROR, rawBody.getSourceLocation(),
-                        "Bad definition for a graph element: " + e.getMessage());
-
-            } finally {
-                // Switch back to the working dataverse.
-                graphixRewritingContext.getMetadataProvider().setDefaultDataverse(defaultDataverse);
-            }
-        }
-    }
-
-    public void rewriteGraphixASTNodes(GraphixRewritingContext graphixRewritingContext,
-            IReturningStatement topStatement, boolean allowNonStoredUDFCalls) throws CompilationException {
-        // Generate names for unnamed graph elements, projections in our SELECT CLAUSE, and keys in our GROUP BY.
-        LOGGER.trace("Populating unknowns (both graph and non-graph) in our AST.");
-        PopulateUnknownsVisitor populateUnknownsVisitor = new PopulateUnknownsVisitor(graphixRewritingContext);
-        topStatement.getBody().accept(populateUnknownsVisitor, null);
-
-        // Verify that variables are properly within scope.
-        LOGGER.trace("Verifying that variables are unique and are properly scoped.");
-        ScopingCheckVisitor scopingCheckVisitor = new ScopingCheckVisitor(graphixRewritingContext);
-        topStatement.getBody().accept(scopingCheckVisitor, null);
-
-        // Resolve all of our (Graphix, SQL++, and user-defined) function calls.
-        LOGGER.trace("Resolving Graphix, SQL++, and user-defined function calls.");
-        FunctionResolutionVisitor functionResolutionVisitor =
-                new FunctionResolutionVisitor(graphixRewritingContext, allowNonStoredUDFCalls);
-        topStatement.getBody().accept(functionResolutionVisitor, null);
-
-        // Attempt to resolve our vertex labels, edge labels, and edge directions.
-        LOGGER.trace("Performing label and edge direction resolution.");
-        StructureResolutionVisitor structureResolutionVisitor = new StructureResolutionVisitor(graphixRewritingContext);
-        topStatement.getBody().accept(structureResolutionVisitor, null);
-
-        // Fetch all relevant graph element declarations, using the element labels.
-        LOGGER.trace("Fetching relevant edge and vertex bodies from our graph schema.");
-        ElementLookupTable elementLookupTable = new ElementLookupTable();
-        ElementLookupTableVisitor elementLookupTableVisitor =
-                new ElementLookupTableVisitor(graphixRewritingContext, elementLookupTable, parserFactory);
-        topStatement.getBody().accept(elementLookupTableVisitor, null);
-        for (GraphElementDeclaration graphElementDeclaration : elementLookupTable) {
-            loadNormalizedGraphElement(graphixRewritingContext, graphElementDeclaration);
-        }
-
-        // Expand vertex and edge patterns to remove all ambiguities (into a canonical form).
-        LOGGER.trace("Expanding vertex and edge patterns to a canonical form.");
-        CanonicalExpansionVisitor canonicalExpansionVisitor = new CanonicalExpansionVisitor(graphixRewritingContext);
-        topStatement.setBody(topStatement.getBody().accept(canonicalExpansionVisitor, null));
-
-        // Perform an analysis pass to get our edge dependencies, dangling vertices, and FROM-GRAPH-CLAUSE variables.
-        LOGGER.trace("Collecting edge dependencies, dangling vertices, and FROM-GRAPH-CLAUSE specific variables.");
-        StructureAnalysisVisitor structureAnalysisVisitor = new StructureAnalysisVisitor(graphixRewritingContext);
-        topStatement.getBody().accept(structureAnalysisVisitor, null);
-
-        // Transform all graph AST nodes (i.e. perform the representation lowering).
-        LOGGER.trace("Lowering the Graphix AST-specific nodes representation to a pure SQL++ representation.");
-        GraphixLoweringVisitor graphixLoweringVisitor = new GraphixLoweringVisitor(graphixRewritingContext,
-                elementLookupTable, structureAnalysisVisitor.getFromGraphClauseContextMap());
-        topStatement.setBody(topStatement.getBody().accept(graphixLoweringVisitor, null));
-
-        // Lower all of our Graphix function calls (and perform schema-enrichment).
-        LOGGER.trace("Lowering the Graphix CALL-EXPR nodes to a pure SQL++ representation.");
-        GraphixFunctionCallVisitor graphixFunctionCallVisitor = new GraphixFunctionCallVisitor(graphixRewritingContext);
-        topStatement.getBody().accept(graphixFunctionCallVisitor, null);
-    }
-
-    public void rewriteSQLPPASTNodes(LangRewritingContext langRewritingContext, IReturningStatement topStatement,
-            boolean allowNonStoredUDFCalls, boolean inlineUdfsAndViews, Collection<VarIdentifier> externalVars)
-            throws CompilationException {
-        super.setup(langRewritingContext, topStatement, externalVars, allowNonStoredUDFCalls, inlineUdfsAndViews);
-        super.substituteGroupbyKeyExpression();
-        super.rewriteGroupBys();
-        super.inlineColumnAlias();
-        super.rewriteWindowExpressions();
-        super.rewriteGroupingSets();
-
-        // We need to override the default behavior of our variable check + rewrite visitor...
-        PostRewriteVariableVisitor postRewriteVariableVisitor = new PostRewriteVariableVisitor(langRewritingContext,
-                langRewritingContext.getMetadataProvider(), externalVars);
-        topStatement.accept(postRewriteVariableVisitor, null);
-        super.extractAggregatesFromCaseExpressions();
-
-        // ...and our GROUP-BY rewrite visitor.
-        GroupByAggSugarVisitor groupByAggSugarVisitor = new GroupByAggSugarVisitor(langRewritingContext, externalVars);
-        topStatement.accept(groupByAggSugarVisitor, null);
-
-        // The remainder of our rewrites are the same.
-        super.rewriteWindowAggregationSugar();
-        super.rewriteOperatorExpression();
-        super.rewriteCaseExpressions();
-        super.rewriteListInputFunctions();
-        super.rewriteRightJoins();
-        super.loadAndInlineUdfsAndViews();
-        super.rewriteSpecialFunctionNames();
-        super.inlineWithExpressions();
-    }
-
-    @Override
-    protected SqlppFunctionBodyRewriter getFunctionAndViewBodyRewriter() {
-        return new SqlppFunctionBodyRewriter(parserFactory) {
-            @Override
-            public void rewrite(LangRewritingContext langRewritingContext, IReturningStatement topStatement,
-                    boolean allowNonStoredUDFCalls, boolean inlineUdfsAndViews, Collection<VarIdentifier> externalVars)
-                    throws CompilationException {
-                // Perform an initial error-checking pass to validate our body.
-                LOGGER.trace("Performing pre-Graphix-rewrite check (user query validation).");
-                GraphixRewritingContext graphixRewritingContext = (GraphixRewritingContext) langRewritingContext;
-                PreRewriteCheckVisitor preRewriteCheckVisitor = new PreRewriteCheckVisitor(graphixRewritingContext);
-                topStatement.getBody().accept(preRewriteCheckVisitor, null);
-
-                // Perform the Graphix rewrites.
-                rewriteGraphixASTNodes(graphixRewritingContext, topStatement, allowNonStoredUDFCalls);
-
-                // Sanity check: ensure that no graph AST nodes exist after this point.
-                LOGGER.trace("Performing post-Graphix-rewrite check (making sure no graph AST nodes exist).");
-                PostRewriteCheckVisitor postRewriteCheckVisitor = new PostRewriteCheckVisitor();
-                topStatement.getBody().accept(postRewriteCheckVisitor, null);
-
-                // Perform the remainder of the SQL++ rewrites.
-                LOGGER.debug("Ending Graphix AST rewrites. Now starting SQL++ AST rewrites.");
-                rewriteSQLPPASTNodes(langRewritingContext, topStatement, allowNonStoredUDFCalls, inlineUdfsAndViews,
-                        externalVars);
-                LOGGER.debug("Ending SQL++ AST rewrites.");
-
-                // Update the variable counter in our context.
-                topStatement.setVarCounter(langRewritingContext.getVarCounter().get());
-            }
-        };
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixRewritingContext.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixRewritingContext.java
deleted file mode 100644
index 7e8bda5..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/GraphixRewritingContext.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
-import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
-import org.apache.asterix.lang.common.statement.FunctionDecl;
-import org.apache.asterix.lang.common.statement.ViewDecl;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.hyracks.api.exceptions.IWarningCollector;
-
-/**
- * Wrapper class for {@link LangRewritingContext} and for Graphix specific rewriting.
- */
-public class GraphixRewritingContext extends LangRewritingContext {
-    private final Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs = new HashMap<>();
-
-    public GraphixRewritingContext(MetadataProvider metadataProvider, List<FunctionDecl> declaredFunctions,
-            List<ViewDecl> declaredViews, Set<DeclareGraphStatement> declareGraphStatements,
-            IWarningCollector warningCollector, int varCounter) {
-        super(metadataProvider, declaredFunctions, declaredViews, warningCollector, varCounter);
-        declareGraphStatements.forEach(d -> {
-            GraphIdentifier graphIdentifier = new GraphIdentifier(d.getDataverseName(), d.getGraphName());
-            this.declaredGraphs.put(graphIdentifier, d);
-        });
-    }
-
-    public Map<GraphIdentifier, DeclareGraphStatement> getDeclaredGraphs() {
-        return declaredGraphs;
-    }
-
-    public VarIdentifier getNewGraphixVariable() {
-        VarIdentifier langRewriteGeneratedVar = newVariable();
-        String graphixGeneratedName = "#GG_" + langRewriteGeneratedVar.getValue().substring(1);
-        return new VarIdentifier(graphixGeneratedName, langRewriteGeneratedVar.getId());
-    }
-
-    public static boolean isGraphixVariable(VarIdentifier varIdentifier) {
-        return varIdentifier.getValue().startsWith("#GG_");
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/DanglingVertexExpander.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/DanglingVertexExpander.java
deleted file mode 100644
index 89a1d98..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/DanglingVertexExpander.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.canonical;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.visitor.GraphixDeepCopyVisitor;
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-
-/**
- * Expand a disconnected vertex into a set of canonical disconnected vertices. For dangling vertices, this just
- * includes ensuring that each vertex has only one label.
- */
-public class DanglingVertexExpander implements ICanonicalExpander<VertexPatternExpr> {
-    private final GraphixDeepCopyVisitor deepCopyVisitor = new GraphixDeepCopyVisitor();
-
-    @Override
-    public void apply(VertexPatternExpr vertexPatternExpr, List<GraphSelectBlock> inputSelectBlocks)
-            throws CompilationException {
-        if (vertexPatternExpr.getLabels().size() == 1) {
-            // No expansion is necessary. Our vertex is in canonical form.
-            return;
-        }
-        VariableExpr originalVariableExpr = vertexPatternExpr.getVariableExpr();
-
-        // We want to end up with |GSBs| * |labels| number of generated GSBs.
-        List<GraphSelectBlock> generatedGraphSelectBlocks = new ArrayList<>();
-        for (GraphSelectBlock oldGraphSelectBlock : inputSelectBlocks) {
-            for (ElementLabel vertexLabel : vertexPatternExpr.getLabels()) {
-                GraphSelectBlock clonedSelectBlock = deepCopyVisitor.visit(oldGraphSelectBlock, null);
-                for (MatchClause matchClause : clonedSelectBlock.getFromGraphClause().getMatchClauses()) {
-                    for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
-                        VariableExpr newVertexVariableExpr = deepCopyVisitor.visit(originalVariableExpr, null);
-                        VertexPatternExpr newVertexPatternExpr =
-                                new VertexPatternExpr(newVertexVariableExpr, Set.of(vertexLabel));
-                        replaceVertexExpression(pathExpression.getVertexExpressions(),
-                                pathExpression.getEdgeExpressions(), vertexPatternExpr, newVertexPatternExpr);
-                    }
-                }
-                generatedGraphSelectBlocks.add(clonedSelectBlock);
-            }
-        }
-        inputSelectBlocks.clear();
-        inputSelectBlocks.addAll(generatedGraphSelectBlocks);
-    }
-
-    private static void replaceVertexExpression(List<VertexPatternExpr> vertexExpressions,
-            List<EdgePatternExpr> edgeExpressions, VertexPatternExpr oldVertexExpression,
-            VertexPatternExpr newVertexExpression) {
-        ListIterator<VertexPatternExpr> vertexExpressionIterator = vertexExpressions.listIterator();
-        while (vertexExpressionIterator.hasNext()) {
-            VertexPatternExpr workingVertexExpression = vertexExpressionIterator.next();
-            if (workingVertexExpression.equals(oldVertexExpression)) {
-                vertexExpressionIterator.set(newVertexExpression);
-                break;
-            }
-        }
-        for (EdgePatternExpr workingEdgeExpression : edgeExpressions) {
-            if (workingEdgeExpression.getLeftVertex().equals(oldVertexExpression)) {
-                workingEdgeExpression.setLeftVertex(newVertexExpression);
-
-            } else if (workingEdgeExpression.getRightVertex().equals(oldVertexExpression)) {
-                workingEdgeExpression.setRightVertex(newVertexExpression);
-            }
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/EdgeSubPathExpander.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/EdgeSubPathExpander.java
deleted file mode 100644
index 3210919..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/canonical/EdgeSubPathExpander.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.canonical;
-
-import static org.apache.asterix.graphix.lang.struct.EdgeDescriptor.EdgeDirection;
-import static org.apache.asterix.graphix.lang.struct.EdgeDescriptor.PatternType;
-
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.PathPatternAction;
-import org.apache.asterix.graphix.lang.rewrites.resolve.SchemaKnowledgeTable;
-import org.apache.asterix.graphix.lang.rewrites.visitor.GraphixDeepCopyVisitor;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.expression.RecordConstructor;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-
-/**
- * Expand an edge and its connected vertices into an edge in canonical form.
- * 1. An edge's left vertex must only have one label.
- * 2. An edge's right vertex must only have one label.
- * 3. An edge must only have one label.
- * 4. An edge must be directed.
- * 5. An edge must not be a sub-path.
- */
-public class EdgeSubPathExpander implements ICanonicalExpander<EdgePatternExpr> {
-    private final Supplier<VariableExpr> newVariableSupplier;
-    private final GraphixDeepCopyVisitor deepCopyVisitor;
-
-    // To avoid "over-expanding", we need to keep knowledge about our FROM-GRAPH-CLAUSE.
-    private SchemaKnowledgeTable schemaKnowledgeTable;
-
-    public EdgeSubPathExpander(Supplier<VarIdentifier> getNewVariable) {
-        this.deepCopyVisitor = new GraphixDeepCopyVisitor();
-        this.newVariableSupplier = () -> new VariableExpr(getNewVariable.get());
-    }
-
-    public void resetSchema(SchemaKnowledgeTable schemaKnowledgeTable) {
-        this.schemaKnowledgeTable = schemaKnowledgeTable;
-    }
-
-    private static class CanonicalEdgeContext {
-        private final VariableExpr leftVertexVar;
-        private final VariableExpr rightVertexVar;
-        private final VariableExpr edgeVar;
-
-        private final ElementLabel leftVertexLabel;
-        private final ElementLabel rightVertexLabel;
-        private final ElementLabel edgeLabel;
-
-        private final EdgeDirection edgeDirection;
-
-        private CanonicalEdgeContext(VariableExpr leftVertexVar, VariableExpr rightVertexVar, VariableExpr edgeVar,
-                ElementLabel leftVertexLabel, ElementLabel rightVertexLabel, ElementLabel edgeLabel,
-                EdgeDirection edgeDirection) {
-            this.leftVertexVar = leftVertexVar;
-            this.rightVertexVar = rightVertexVar;
-            this.leftVertexLabel = leftVertexLabel;
-            this.rightVertexLabel = rightVertexLabel;
-            this.edgeDirection = edgeDirection;
-            this.edgeVar = edgeVar;
-            this.edgeLabel = edgeLabel;
-        }
-    }
-
-    @Override
-    public void apply(EdgePatternExpr edgePatternExpr, List<GraphSelectBlock> inputSelectBlocks)
-            throws CompilationException {
-        boolean doesLeftVertexRequireExpansion = edgePatternExpr.getLeftVertex().getLabels().size() > 1;
-        boolean doesRightVertexRequireExpansion = edgePatternExpr.getRightVertex().getLabels().size() > 1;
-        boolean doesEdgeRequireExpansion = edgePatternExpr.getEdgeDescriptor().getEdgeLabels().size() > 1
-                || edgePatternExpr.getEdgeDescriptor().getPatternType() != PatternType.EDGE
-                || edgePatternExpr.getEdgeDescriptor().getEdgeDirection() == EdgeDirection.UNDIRECTED;
-        if (!doesLeftVertexRequireExpansion && !doesRightVertexRequireExpansion && !doesEdgeRequireExpansion) {
-            // Our edge and both of our vertices are in canonical form.
-            return;
-        }
-
-        // Expand all possibilities that our edge pattern could represent.
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        VertexPatternExpr workingLeftVertex = edgePatternExpr.getLeftVertex();
-        VertexPatternExpr workingRightVertex = edgePatternExpr.getRightVertex();
-        List<List<CanonicalEdgeContext>> pathCandidates = new ArrayList<>();
-        if (edgeDescriptor.getPatternType() == PatternType.EDGE) {
-            expandEdgePattern(workingLeftVertex, workingRightVertex, edgeDescriptor, edgeDescriptor::getVariableExpr)
-                    .forEach(e -> pathCandidates.add(List.of(e)));
-
-        } else { // edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH
-            Deque<List<CanonicalEdgeContext>> pathCandidateStack = new ArrayDeque<>(List.of(List.of()));
-            for (int i = 0; i < edgeDescriptor.getMaximumHops(); i++) {
-                VertexPatternExpr nextInternalVertex = (i != edgeDescriptor.getMaximumHops() - 1)
-                        ? edgePatternExpr.getInternalVertices().get(i) : edgePatternExpr.getRightVertex();
-
-                // We will only yield a path if we have generated the minimum number of hops.
-                Deque<List<CanonicalEdgeContext>> generatedCandidateStack = new ArrayDeque<>();
-                boolean isYieldPath = i >= edgeDescriptor.getMinimumHops() - 1;
-                while (!pathCandidateStack.isEmpty()) {
-                    List<CanonicalEdgeContext> pathCandidate = pathCandidateStack.removeLast();
-                    if (isYieldPath) {
-                        VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
-                        expandEdgePattern(workingLeftVertex, rightVertex, edgeDescriptor, newVariableSupplier)
-                                .forEach(e -> {
-                                    List<CanonicalEdgeContext> pathCopy = new ArrayList<>(pathCandidate);
-                                    pathCopy.add(e);
-                                    pathCandidates.add(pathCopy);
-                                });
-                    }
-                    expandEdgePattern(workingLeftVertex, nextInternalVertex, edgeDescriptor, newVariableSupplier)
-                            .forEach(e -> {
-                                List<CanonicalEdgeContext> pathCopy = new ArrayList<>(pathCandidate);
-                                pathCopy.add(e);
-                                generatedCandidateStack.addLast(pathCopy);
-                            });
-                }
-                pathCandidateStack.addAll(generatedCandidateStack);
-
-                // Move our vertex cursor.
-                workingLeftVertex = nextInternalVertex;
-            }
-        }
-
-        // We must now prune all paths that contain an edge that does not adhere to our schema.
-        pathCandidates.removeIf(this::isPathCandidateInvalid);
-
-        // Perform the expansion into GRAPH-SELECT-BLOCKs.
-        List<GraphSelectBlock> selectBlockList = expandSelectBlocks(edgePatternExpr, inputSelectBlocks, pathCandidates);
-        inputSelectBlocks.clear();
-        inputSelectBlocks.addAll(selectBlockList);
-    }
-
-    private List<GraphSelectBlock> expandSelectBlocks(EdgePatternExpr edgePatternExpr,
-            List<GraphSelectBlock> inputSelectBlocks, List<List<CanonicalEdgeContext>> pathCandidates)
-            throws CompilationException {
-        List<GraphSelectBlock> generatedGraphSelectBlocks = new ArrayList<>();
-        for (GraphSelectBlock oldGraphSelectBlock : inputSelectBlocks) {
-            for (List<CanonicalEdgeContext> pathCandidate : pathCandidates) {
-                GraphSelectBlock clonedSelectBlock = deepCopyVisitor.visit(oldGraphSelectBlock, null);
-                for (MatchClause matchClause : clonedSelectBlock.getFromGraphClause().getMatchClauses()) {
-                    Pair<PathPatternExpr, PathPatternExpr> pathPatternReplacePair = null;
-
-                    // We are only interested in the path that contains our already expanded edge.
-                    for (PathPatternExpr pathPatternExpr : matchClause.getPathExpressions()) {
-                        List<EdgePatternExpr> edgeExpressions = pathPatternExpr.getEdgeExpressions();
-                        int edgeExprIndex = edgeExpressions.indexOf(edgePatternExpr);
-                        if (edgeExprIndex < 0) {
-                            continue;
-                        }
-
-                        // Note: in this case, we do not need to worry about dangling vertices.
-                        List<LetClause> reboundSubPathList = new ArrayList<>(pathPatternExpr.getReboundSubPathList());
-                        List<EdgePatternExpr> newEdgePatternExprList = new ArrayList<>();
-                        List<VertexPatternExpr> newVertexPatternExprList = new ArrayList<>();
-                        for (int i = 0; i < edgeExpressions.size(); i++) {
-                            EdgePatternExpr existingEdgeExpression = edgeExpressions.get(i);
-                            if (i != edgeExprIndex) {
-                                newEdgePatternExprList.add(existingEdgeExpression);
-                                newVertexPatternExprList.add(existingEdgeExpression.getLeftVertex());
-                                newVertexPatternExprList.add(existingEdgeExpression.getRightVertex());
-                                continue;
-                            }
-
-                            // Note: this will produce duplicate vertex expressions.
-                            List<VertexPatternExpr> subPathVertexList = new ArrayList<>();
-                            List<EdgePatternExpr> subPathEdgeList = new ArrayList<>();
-                            for (CanonicalEdgeContext edgeContext : pathCandidate) {
-                                VariableExpr newEdgeVar = deepCopyVisitor.visit(edgeContext.edgeVar, null);
-                                VariableExpr newLeftVar = deepCopyVisitor.visit(edgeContext.leftVertexVar, null);
-                                VariableExpr newRightVar = deepCopyVisitor.visit(edgeContext.rightVertexVar, null);
-                                EdgeDescriptor newDescriptor = new EdgeDescriptor(edgeContext.edgeDirection,
-                                        PatternType.EDGE, Set.of(edgeContext.edgeLabel), newEdgeVar, 1, 1);
-                                Set<ElementLabel> leftLabelSingleton = Set.of(edgeContext.leftVertexLabel);
-                                Set<ElementLabel> rightLabelSingleton = Set.of(edgeContext.rightVertexLabel);
-                                VertexPatternExpr leftVertex = new VertexPatternExpr(newLeftVar, leftLabelSingleton);
-                                VertexPatternExpr rightVertex = new VertexPatternExpr(newRightVar, rightLabelSingleton);
-                                EdgePatternExpr newEdge = new EdgePatternExpr(leftVertex, rightVertex, newDescriptor);
-
-                                // Update our path and our sub-path.
-                                newEdgePatternExprList.add(newEdge);
-                                newVertexPatternExprList.add(leftVertex);
-                                newVertexPatternExprList.add(rightVertex);
-                                subPathEdgeList.add(newEdge);
-                                subPathVertexList.add(leftVertex);
-                                subPathVertexList.add(rightVertex);
-                            }
-
-                            // Bind our sub-path to a path record.
-                            if (existingEdgeExpression.getEdgeDescriptor().getPatternType() == PatternType.PATH) {
-                                RecordConstructor pathRecord = new RecordConstructor();
-                                EdgeDescriptor edgeDescriptor = existingEdgeExpression.getEdgeDescriptor();
-                                PathPatternAction.buildPathRecord(subPathVertexList, subPathEdgeList, pathRecord);
-                                reboundSubPathList.add(new LetClause(edgeDescriptor.getVariableExpr(), pathRecord));
-                            }
-                        }
-
-                        // Build a new path pattern to replace our old path pattern.
-                        VariableExpr newPathVariable = null;
-                        if (pathPatternExpr.getVariableExpr() != null) {
-                            newPathVariable = deepCopyVisitor.visit(pathPatternExpr.getVariableExpr(), null);
-                        }
-                        PathPatternExpr newPathPatternExpr =
-                                new PathPatternExpr(newVertexPatternExprList, newEdgePatternExprList, newPathVariable);
-                        newPathPatternExpr.getReboundSubPathList().addAll(reboundSubPathList);
-                        pathPatternReplacePair = new Pair<>(pathPatternExpr, newPathPatternExpr);
-                    }
-
-                    // Finalize our expansion by replacing our path in our MATCH-CLAUSE.
-                    if (pathPatternReplacePair == null) {
-                        throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
-                                "Edge was expanded, but edge was not found in given SELECT-BLOCK!");
-                    }
-                    PathPatternExpr oldPathPattern = pathPatternReplacePair.first;
-                    PathPatternExpr newPathPattern = pathPatternReplacePair.second;
-                    matchClause.getPathExpressions().replaceAll(p -> (p == oldPathPattern) ? newPathPattern : p);
-                }
-                generatedGraphSelectBlocks.add(clonedSelectBlock);
-            }
-        }
-        return generatedGraphSelectBlocks;
-    }
-
-    private List<CanonicalEdgeContext> expandEdgePattern(VertexPatternExpr leftVertex, VertexPatternExpr rightVertex,
-            EdgeDescriptor edgeDescriptor, Supplier<VariableExpr> edgeVarSupplier) throws CompilationException {
-        List<CanonicalEdgeContext> edgeCandidates = new ArrayList<>();
-        for (ElementLabel leftVertexLabel : leftVertex.getLabels()) {
-            for (ElementLabel rightVertexLabel : rightVertex.getLabels()) {
-                for (ElementLabel edgeLabel : edgeDescriptor.getEdgeLabels()) {
-                    if (edgeDescriptor.getEdgeDirection() != EdgeDirection.LEFT_TO_RIGHT) {
-                        VariableExpr edgeVar = deepCopyVisitor.visit(edgeVarSupplier.get(), null);
-                        VariableExpr leftVertexVar = deepCopyVisitor.visit(leftVertex.getVariableExpr(), null);
-                        VariableExpr rightVertexVar = deepCopyVisitor.visit(rightVertex.getVariableExpr(), null);
-                        CanonicalEdgeContext rightToLeftContext =
-                                new CanonicalEdgeContext(leftVertexVar, rightVertexVar, edgeVar, leftVertexLabel,
-                                        rightVertexLabel, edgeLabel, EdgeDirection.RIGHT_TO_LEFT);
-                        edgeCandidates.add(rightToLeftContext);
-                    }
-                    if (edgeDescriptor.getEdgeDirection() != EdgeDirection.RIGHT_TO_LEFT) {
-                        VariableExpr edgeVar = deepCopyVisitor.visit(edgeVarSupplier.get(), null);
-                        VariableExpr leftVertexVar = deepCopyVisitor.visit(leftVertex.getVariableExpr(), null);
-                        VariableExpr rightVertexVar = deepCopyVisitor.visit(rightVertex.getVariableExpr(), null);
-                        CanonicalEdgeContext leftToRightContext =
-                                new CanonicalEdgeContext(leftVertexVar, rightVertexVar, edgeVar, leftVertexLabel,
-                                        rightVertexLabel, edgeLabel, EdgeDirection.LEFT_TO_RIGHT);
-                        edgeCandidates.add(leftToRightContext);
-                    }
-                }
-            }
-        }
-        return edgeCandidates;
-    }
-
-    private boolean isPathCandidateInvalid(List<CanonicalEdgeContext> pathCandidate) {
-        for (CanonicalEdgeContext edgeCandidate : pathCandidate) {
-            for (SchemaKnowledgeTable.KnowledgeRecord knowledgeRecord : schemaKnowledgeTable) {
-                if (edgeCandidate.edgeDirection == EdgeDirection.LEFT_TO_RIGHT) {
-                    if (edgeCandidate.leftVertexLabel.equals(knowledgeRecord.getSourceVertexLabel())
-                            && edgeCandidate.edgeLabel.equals(knowledgeRecord.getEdgeLabel())
-                            && edgeCandidate.rightVertexLabel.equals(knowledgeRecord.getDestVertexLabel())) {
-                        return false;
-                    }
-
-                } else { // edgeCandidate.edgeDirection == EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT
-                    if (edgeCandidate.leftVertexLabel.equals(knowledgeRecord.getDestVertexLabel())
-                            && edgeCandidate.edgeLabel.equals(knowledgeRecord.getEdgeLabel())
-                            && edgeCandidate.rightVertexLabel.equals(knowledgeRecord.getSourceVertexLabel())) {
-                        return false;
-                    }
-                }
-            }
-            return true;
-        }
-        return true;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/common/EdgeDependencyGraph.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/common/EdgeDependencyGraph.java
deleted file mode 100644
index 25ec13b..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/common/EdgeDependencyGraph.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.common;
-
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.lang.common.struct.Identifier;
-
-/**
- * A two-level ordered list of {@link EdgePatternExpr} instances, whose order depends on the input edge-dependency
- * graphs (represented as an adjacency list). Ideally, we want to return the smallest set of Hamilton
- * {@link EdgePatternExpr} paths, but this is an NP-hard problem. Instead, we find the **first** set of paths that
- * visit each {@link EdgePatternExpr} once. This inner-order is dependent on the order of the adjacency map iterators.
- */
-public class EdgeDependencyGraph implements Iterable<Iterable<EdgePatternExpr>> {
-    private final List<Map<Identifier, List<Identifier>>> adjacencyMaps;
-    private final Map<Identifier, EdgePatternExpr> edgePatternMap;
-
-    public EdgeDependencyGraph(List<Map<Identifier, List<Identifier>>> adjacencyMaps,
-            Map<Identifier, EdgePatternExpr> edgePatternMap) {
-        this.adjacencyMaps = adjacencyMaps;
-        this.edgePatternMap = edgePatternMap;
-    }
-
-    @Override
-    public Iterator<Iterable<EdgePatternExpr>> iterator() {
-        List<Iterable<EdgePatternExpr>> edgePatternIterables = new ArrayList<>();
-        Set<Identifier> globalVisitedSet = new HashSet<>();
-
-        for (Map<Identifier, List<Identifier>> adjacencyMap : adjacencyMaps) {
-            Deque<Identifier> edgeStack = new ArrayDeque<>();
-            Set<Identifier> localVisitedSet = new HashSet<>();
-
-            if (!adjacencyMap.entrySet().isEmpty()) {
-                if (globalVisitedSet.isEmpty()) {
-                    // We start with the first inserted edge inserted into our graph, and continue from there.
-                    Iterator<Map.Entry<Identifier, List<Identifier>>> mapIterator = adjacencyMap.entrySet().iterator();
-                    Map.Entry<Identifier, List<Identifier>> seedEdge = mapIterator.next();
-                    edgeStack.addFirst(seedEdge.getKey());
-                    edgeStack.addAll(seedEdge.getValue());
-                    while (mapIterator.hasNext()) {
-                        Map.Entry<Identifier, List<Identifier>> followingEdge = mapIterator.next();
-                        for (Identifier followingEdgeDependent : followingEdge.getValue()) {
-                            if (!edgeStack.contains(followingEdgeDependent)) {
-                                edgeStack.addLast(followingEdgeDependent);
-                            }
-                        }
-                    }
-
-                } else {
-                    // This is not our first pass. Find a connecting edge to seed our stack.
-                    Set<Identifier> disconnectedExploredEdgeSet = new LinkedHashSet<>();
-                    for (Map.Entry<Identifier, List<Identifier>> workingEdge : adjacencyMap.entrySet()) {
-                        for (Identifier workingEdgeDependent : workingEdge.getValue()) {
-                            if (globalVisitedSet.contains(workingEdgeDependent) && edgeStack.isEmpty()) {
-                                edgeStack.addFirst(workingEdgeDependent);
-                                localVisitedSet.add(workingEdgeDependent);
-
-                            } else if (!globalVisitedSet.contains(workingEdgeDependent)) {
-                                disconnectedExploredEdgeSet.add(workingEdgeDependent);
-
-                            } else {
-                                localVisitedSet.add(workingEdgeDependent);
-                            }
-                        }
-                        if (workingEdge.getValue().isEmpty() && globalVisitedSet.contains(workingEdge.getKey())) {
-                            localVisitedSet.add(workingEdge.getKey());
-
-                        } else if (workingEdge.getValue().isEmpty()) {
-                            disconnectedExploredEdgeSet.add(workingEdge.getKey());
-                        }
-                    }
-                    disconnectedExploredEdgeSet.forEach(edgeStack::addLast);
-                }
-
-                // Build our iterable.
-                globalVisitedSet.addAll(edgeStack);
-                edgePatternIterables.add(() -> new Iterator<>() {
-                    @Override
-                    public boolean hasNext() {
-                        // We are done once we have visited every node.
-                        return localVisitedSet.size() != adjacencyMap.size();
-                    }
-
-                    @Override
-                    public EdgePatternExpr next() {
-                        Identifier edgeIdentifier = edgeStack.removeFirst();
-                        for (Identifier dependency : adjacencyMap.get(edgeIdentifier)) {
-                            if (!localVisitedSet.contains(dependency)) {
-                                edgeStack.addFirst(dependency);
-                            }
-                        }
-                        localVisitedSet.add(edgeIdentifier);
-                        return edgePatternMap.get(edgeIdentifier);
-                    }
-                });
-
-            } else {
-                edgePatternIterables.add(Collections.emptyList());
-            }
-        }
-
-        return edgePatternIterables.iterator();
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/common/ElementLookupTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/common/ElementLookupTable.java
deleted file mode 100644
index cfa4aae..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/common/ElementLookupTable.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.common;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
-import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
-
-/**
- * Lookup table for {@link GraphElementDeclaration} instances, vertex keys, edge destination keys, and edge source
- * keys-- indexed by {@link GraphElementIdentifier} instances.
- */
-public class ElementLookupTable implements Iterable<GraphElementDeclaration> {
-    private final Map<GraphElementIdentifier, GraphElementDeclaration> graphElementDeclMap = new HashMap<>();
-    private final Map<GraphElementIdentifier, List<List<String>>> vertexKeyMap = new HashMap<>();
-    private final Map<GraphElementIdentifier, List<List<String>>> edgeDestKeysMap = new HashMap<>();
-    private final Map<GraphElementIdentifier, List<List<String>>> edgeSourceKeysMap = new HashMap<>();
-
-    public void put(GraphElementIdentifier identifier, GraphElementDeclaration graphElementDeclaration) {
-        graphElementDeclMap.put(identifier, graphElementDeclaration);
-    }
-
-    public void putVertexKey(GraphElementIdentifier identifier, List<List<String>> primaryKey) {
-        vertexKeyMap.put(identifier, primaryKey);
-    }
-
-    public void putEdgeKeys(GraphElementIdentifier identifier, List<List<String>> sourceKey,
-            List<List<String>> destinationKey) {
-        edgeSourceKeysMap.put(identifier, sourceKey);
-        edgeDestKeysMap.put(identifier, destinationKey);
-    }
-
-    public GraphElementDeclaration getElementDecl(GraphElementIdentifier identifier) {
-        return graphElementDeclMap.get(identifier);
-    }
-
-    public List<List<String>> getVertexKey(GraphElementIdentifier identifier) {
-        return vertexKeyMap.get(identifier);
-    }
-
-    public List<List<String>> getEdgeDestKey(GraphElementIdentifier identifier) {
-        return edgeDestKeysMap.get(identifier);
-    }
-
-    public List<List<String>> getEdgeSourceKey(GraphElementIdentifier identifier) {
-        return edgeSourceKeysMap.get(identifier);
-    }
-
-    @Override
-    public Iterator<GraphElementDeclaration> iterator() {
-        return graphElementDeclMap.values().iterator();
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/EnvironmentActionFactory.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/EnvironmentActionFactory.java
deleted file mode 100644
index ebb1406..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/EnvironmentActionFactory.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.lower;
-
-import static org.apache.asterix.graphix.lang.rewrites.util.LowerRewritingUtil.buildAccessorList;
-import static org.apache.asterix.graphix.lang.rewrites.util.LowerRewritingUtil.buildVertexEdgeJoin;
-
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.graphix.lang.clause.CorrWhereClause;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.AbstractInlineAction;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.IEnvironmentAction;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.IsomorphismAction;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.PathPatternAction;
-import org.apache.asterix.graphix.lang.rewrites.visitor.ElementBodyAnalysisVisitor.ElementBodyAnalysisContext;
-import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.expression.CallExpr;
-import org.apache.asterix.lang.common.expression.LiteralExpr;
-import org.apache.asterix.lang.common.expression.RecordConstructor;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.literal.TrueLiteral;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.JoinClause;
-import org.apache.asterix.lang.sqlpp.optype.JoinType;
-
-/**
- * Build {@link IEnvironmentAction} instances to manipulate a {@link LoweringEnvironment}.
- */
-public class EnvironmentActionFactory {
-    private final Map<GraphElementIdentifier, ElementBodyAnalysisContext> analysisContextMap;
-    private final ElementLookupTable elementLookupTable;
-    private final LoweringAliasLookupTable aliasLookupTable;
-    private final GraphixRewritingContext graphixRewritingContext;
-
-    // The following must be provided before any creation methods are used.
-    private GraphIdentifier graphIdentifier;
-
-    public EnvironmentActionFactory(Map<GraphElementIdentifier, ElementBodyAnalysisContext> analysisContextMap,
-            ElementLookupTable elementLookupTable, LoweringAliasLookupTable aliasLookupTable,
-            GraphixRewritingContext graphixRewritingContext) {
-        this.analysisContextMap = analysisContextMap;
-        this.elementLookupTable = elementLookupTable;
-        this.aliasLookupTable = aliasLookupTable;
-        this.graphixRewritingContext = graphixRewritingContext;
-    }
-
-    public void reset(GraphIdentifier graphIdentifier) {
-        this.graphIdentifier = graphIdentifier;
-        this.aliasLookupTable.reset();
-    }
-
-    /**
-     * @see PathPatternAction
-     */
-    public IEnvironmentAction buildPathPatternAction(PathPatternExpr pathPatternExpr) {
-        return new PathPatternAction(pathPatternExpr);
-    }
-
-    /**
-     * @see IsomorphismAction
-     */
-    public IEnvironmentAction buildIsomorphismAction(FromGraphClause fromGraphClause) throws CompilationException {
-        return new IsomorphismAction(graphixRewritingContext, fromGraphClause, aliasLookupTable);
-    }
-
-    /**
-     * Build an {@link IEnvironmentAction} to handle a dangling vertex / vertex that is (currently) disconnected.
-     * Even though we introduce CROSS-JOINs here, we will not actually perform this CROSS-JOIN if this is the first
-     * vertex we are lowering. There are three possible {@link IEnvironmentAction}s generated here:
-     * 1. An action for inlined vertices that have no projections.
-     * 2. An action for inlined vertices with projections.
-     * 3. An action for non-inlined vertices.
-     */
-    public IEnvironmentAction buildDanglingVertexAction(VertexPatternExpr vertexPatternExpr)
-            throws CompilationException {
-        VarIdentifier vertexVar = vertexPatternExpr.getVariableExpr().getVar();
-        VarIdentifier iterationVar = graphixRewritingContext.getNewGraphixVariable();
-        VarIdentifier intermediateVar = graphixRewritingContext.getNewGraphixVariable();
-
-        // We should only be working with one identifier (given that we only have one label).
-        List<GraphElementIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
-        if (vertexElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
-        }
-        GraphElementIdentifier vertexIdentifier = vertexElementIDs.get(0);
-        ElementBodyAnalysisContext vertexAnalysisContext = analysisContextMap.get(vertexIdentifier);
-        if (vertexAnalysisContext.isExpressionInline() && vertexAnalysisContext.isSelectClauseInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // Introduce our iteration expression.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        CallExpr datasetCallExpression = vertexAnalysisContext.getDatasetCallExpression();
-                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression,
-                                new VariableExpr(iterationVar), null, new LiteralExpr(TrueLiteral.INSTANCE), null);
-                        clauseSequence.addMainClause(joinClause);
-                    });
-
-                    // Inline our vertex body.
-                    super.apply(loweringEnvironment);
-
-                    // Bind our intermediate (join) variable and vertex variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr iterationVarExpr = new VariableExpr(iterationVar);
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        clauseSequence.addMainClause(new CorrLetClause(iterationVarExpr, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeVertexBinding(vertexVar, new VariableExpr(iterationVar));
-                    });
-                    aliasLookupTable.putIterationAlias(vertexVar, iterationVar);
-                    aliasLookupTable.putJoinAlias(vertexVar, intermediateVar);
-                }
-            };
-
-        } else if (vertexAnalysisContext.isExpressionInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // Introduce our iteration expression.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        CallExpr datasetCallExpression = vertexAnalysisContext.getDatasetCallExpression();
-                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression,
-                                new VariableExpr(iterationVar), null, new LiteralExpr(TrueLiteral.INSTANCE), null);
-                        clauseSequence.addMainClause(joinClause);
-                    });
-
-                    // Inline our vertex body.
-                    super.apply(loweringEnvironment);
-
-                    // Build a record constructor from our context to bind to our vertex variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        RecordConstructor recordConstructor1 = buildRecordConstructor();
-                        RecordConstructor recordConstructor2 = buildRecordConstructor();
-                        clauseSequence.addMainClause(new CorrLetClause(recordConstructor1, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeVertexBinding(vertexVar, recordConstructor2);
-                    });
-                    aliasLookupTable.putIterationAlias(vertexVar, iterationVar);
-                    aliasLookupTable.putJoinAlias(vertexVar, intermediateVar);
-                }
-            };
-
-        } else {
-            GraphElementDeclaration elementDeclaration = elementLookupTable.getElementDecl(vertexIdentifier);
-            return loweringEnvironment -> {
-                // Introduce our iteration expression.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    JoinClause joinClause = new JoinClause(JoinType.INNER, elementDeclaration.getNormalizedBody(),
-                            new VariableExpr(iterationVar), null, new LiteralExpr(TrueLiteral.INSTANCE), null);
-                    clauseSequence.addMainClause(joinClause);
-                });
-
-                // Bind our intermediate (join) variable and vertex variable.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    VariableExpr iterationVarExpr = new VariableExpr(iterationVar);
-                    VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                    clauseSequence.addMainClause(new CorrLetClause(iterationVarExpr, intermediateVarExpr, null));
-                    clauseSequence.addRepresentativeVertexBinding(vertexVar, new VariableExpr(iterationVar));
-                });
-            };
-        }
-    }
-
-    /**
-     * Build an {@link IEnvironmentAction} to handle an edge that we can fold into (attach from) an already introduced
-     * vertex. A folded edge is implicitly inlined. There are two possible {@link IEnvironmentAction}s generated here:
-     * 1. An action for inlined, folded edges that have no projections.
-     * 2. An action for inlined, folded edges that have projections.
-     */
-    public IEnvironmentAction buildFoldedEdgeAction(VertexPatternExpr vertexPatternExpr,
-            EdgePatternExpr edgePatternExpr) throws CompilationException {
-        VarIdentifier vertexVar = vertexPatternExpr.getVariableExpr().getVar();
-        VarIdentifier edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr().getVar();
-        VarIdentifier intermediateVar = graphixRewritingContext.getNewGraphixVariable();
-
-        // We should only be working with one identifier (given that we only have one label).
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        List<GraphElementIdentifier> edgeElementIDs = edgeDescriptor.generateIdentifiers(graphIdentifier);
-        if (edgeElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
-        }
-        GraphElementIdentifier edgeIdentifier = edgeElementIDs.get(0);
-        ElementBodyAnalysisContext edgeAnalysisContext = analysisContextMap.get(edgeIdentifier);
-        if (edgeAnalysisContext.isSelectClauseInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, null) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // We want to bind directly to the iteration variable of our vertex, not the join variable.
-                    elementVariable = aliasLookupTable.getIterationAlias(vertexVar);
-
-                    // Inline our edge body.
-                    super.apply(loweringEnvironment);
-
-                    // Build a binding for our edge variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr elementVarExpr = new VariableExpr(elementVariable);
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        clauseSequence.addMainClause(new CorrLetClause(elementVarExpr, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeEdgeBinding(edgeVar, new VariableExpr(elementVariable));
-                    });
-                    aliasLookupTable.putIterationAlias(edgeVar, elementVariable);
-                    aliasLookupTable.putJoinAlias(edgeVar, intermediateVar);
-                }
-            };
-
-        } else {
-            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, null) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // We want to bind directly to the iteration variable of our vertex, not the join variable.
-                    elementVariable = aliasLookupTable.getIterationAlias(vertexVar);
-
-                    // Inline our edge body.
-                    super.apply(loweringEnvironment);
-
-                    // Build a record constructor from our context to bind to our edge and intermediate (join) var.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        RecordConstructor recordConstructor1 = buildRecordConstructor();
-                        RecordConstructor recordConstructor2 = buildRecordConstructor();
-                        clauseSequence.addMainClause(new CorrLetClause(recordConstructor1, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeEdgeBinding(edgeVar, recordConstructor2);
-                    });
-                    aliasLookupTable.putIterationAlias(edgeVar, elementVariable);
-                    aliasLookupTable.putJoinAlias(edgeVar, intermediateVar);
-                }
-            };
-        }
-    }
-
-    /**
-     * Build an {@link IEnvironmentAction} to handle an edge that we cannot fold into an already introduced vertex.
-     * There are three possible {@link IEnvironmentAction}s generated here:
-     * 1. An action for inlined edges that have no projections.
-     * 2. An action for inlined edges that have projections.
-     * 3. An action for non-inlined edges.
-     */
-    public IEnvironmentAction buildNonFoldedEdgeAction(VertexPatternExpr vertexPatternExpr,
-            EdgePatternExpr edgePatternExpr, Function<GraphElementIdentifier, List<List<String>>> edgeKeyAccess)
-            throws CompilationException {
-        VarIdentifier edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr().getVar();
-        VarIdentifier vertexVar = vertexPatternExpr.getVariableExpr().getVar();
-        VarIdentifier iterationVar = graphixRewritingContext.getNewGraphixVariable();
-        VarIdentifier intermediateVar = graphixRewritingContext.getNewGraphixVariable();
-
-        // We should only be working with one edge identifier...
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        List<GraphElementIdentifier> edgeElementIDs = edgeDescriptor.generateIdentifiers(graphIdentifier);
-        if (edgeElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
-        }
-        GraphElementIdentifier edgeIdentifier = edgeElementIDs.get(0);
-        ElementBodyAnalysisContext edgeAnalysisContext = analysisContextMap.get(edgeIdentifier);
-        Expression datasetCallExpression = edgeAnalysisContext.getDatasetCallExpression();
-
-        // ...and only one vertex identifier (given that we only have one label).
-        List<GraphElementIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
-        if (vertexElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
-        }
-        GraphElementIdentifier vertexIdentifier = vertexElementIDs.get(0);
-        if (edgeAnalysisContext.isExpressionInline() && edgeAnalysisContext.isSelectClauseInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, iterationVar) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // Join our edge iteration variable to our vertex variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr vertexJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(vertexVar));
-                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                                buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                                buildAccessorList(new VariableExpr(iterationVar), edgeKeyAccess.apply(edgeIdentifier)));
-                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression,
-                                new VariableExpr(iterationVar), null, vertexEdgeJoin, null);
-                        clauseSequence.addMainClause(joinClause);
-                    });
-
-                    // Inline our edge body.
-                    super.apply(loweringEnvironment);
-
-                    // Bind our intermediate (join) variable and edge variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr iterationVarExpr = new VariableExpr(iterationVar);
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        clauseSequence.addMainClause(new CorrLetClause(iterationVarExpr, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeEdgeBinding(edgeVar, new VariableExpr(iterationVar));
-                    });
-                    aliasLookupTable.putIterationAlias(edgeVar, iterationVar);
-                    aliasLookupTable.putJoinAlias(edgeVar, intermediateVar);
-                }
-            };
-
-        } else if (edgeAnalysisContext.isExpressionInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, edgeAnalysisContext, iterationVar) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // Join our edge iteration variable to our vertex variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr vertexJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(vertexVar));
-                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                                buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                                buildAccessorList(new VariableExpr(iterationVar), edgeKeyAccess.apply(edgeIdentifier)));
-                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression,
-                                new VariableExpr(iterationVar), null, vertexEdgeJoin, null);
-                        clauseSequence.addMainClause(joinClause);
-                    });
-
-                    // Inline our edge body.
-                    super.apply(loweringEnvironment);
-
-                    // Build a record constructor from our context to bind to our edge variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        RecordConstructor recordConstructor1 = buildRecordConstructor();
-                        RecordConstructor recordConstructor2 = buildRecordConstructor();
-                        clauseSequence.addMainClause(new CorrLetClause(recordConstructor1, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeEdgeBinding(edgeVar, recordConstructor2);
-                    });
-                    aliasLookupTable.putIterationAlias(edgeVar, iterationVar);
-                    aliasLookupTable.putJoinAlias(edgeVar, intermediateVar);
-                }
-            };
-
-        } else {
-            GraphElementDeclaration elementDeclaration = elementLookupTable.getElementDecl(edgeIdentifier);
-            return loweringEnvironment -> {
-                // Join our edge body to our vertex variable.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    VariableExpr vertexJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(vertexVar));
-                    Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                            buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                            buildAccessorList(new VariableExpr(iterationVar), edgeKeyAccess.apply(edgeIdentifier)));
-                    JoinClause joinClause = new JoinClause(JoinType.INNER, elementDeclaration.getNormalizedBody(),
-                            new VariableExpr(iterationVar), null, vertexEdgeJoin, null);
-                    clauseSequence.addMainClause(joinClause);
-                });
-
-                // Bind our intermediate (join) variable and edge variable.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    VariableExpr iterationVarExpr = new VariableExpr(iterationVar);
-                    VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                    clauseSequence.addMainClause(new CorrLetClause(iterationVarExpr, intermediateVarExpr, null));
-                    clauseSequence.addRepresentativeEdgeBinding(edgeVar, new VariableExpr(iterationVar));
-                });
-                aliasLookupTable.putIterationAlias(edgeVar, iterationVar);
-                aliasLookupTable.putJoinAlias(edgeVar, intermediateVar);
-            };
-        }
-    }
-
-    /**
-     * Build an {@link IEnvironmentAction} to introduce a WHERE-CLAUSE that will correlate a vertex and edge.
-     */
-    public IEnvironmentAction buildRawJoinVertexAction(VertexPatternExpr vertexPatternExpr,
-            EdgePatternExpr edgePatternExpr, Function<GraphElementIdentifier, List<List<String>>> edgeKeyAccess)
-            throws CompilationException {
-        VarIdentifier edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr().getVar();
-        VarIdentifier vertexVar = vertexPatternExpr.getVariableExpr().getVar();
-
-        // We should only be working with one edge identifier...
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        List<GraphElementIdentifier> edgeElementIDs = edgeDescriptor.generateIdentifiers(graphIdentifier);
-        if (edgeElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
-        }
-        GraphElementIdentifier edgeIdentifier = edgeElementIDs.get(0);
-
-        // ...and only one vertex identifier (given that we only have one label).
-        List<GraphElementIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
-        if (vertexElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
-        }
-        GraphElementIdentifier vertexIdentifier = vertexElementIDs.get(0);
-        return loweringEnvironment -> {
-            // No aliases need to be introduced, we just need to add a WHERE-CONJUNCT.
-            VariableExpr edgeJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(edgeVar));
-            VariableExpr vertexJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(vertexVar));
-            loweringEnvironment.acceptTransformer(clauseSequence -> {
-                Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                        buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                        buildAccessorList(edgeJoinExpr, edgeKeyAccess.apply(edgeIdentifier)));
-                clauseSequence.addMainClause(new CorrWhereClause(vertexEdgeJoin));
-            });
-        };
-    }
-
-    /**
-     * Build an {@link IEnvironmentAction} to handle a vertex that is bound to an existing (already introduced) edge.
-     * There are three possible {@link IEnvironmentAction}s generated here:
-     * 1. An action for inlined vertices that have no projections.
-     * 2. An action for inlined vertices that have projections.
-     * 3. An action for non-inlined vertices.
-     */
-    public IEnvironmentAction buildBoundVertexAction(VertexPatternExpr vertexPatternExpr,
-            EdgePatternExpr edgePatternExpr, Function<GraphElementIdentifier, List<List<String>>> edgeKeyAccess)
-            throws CompilationException {
-        VarIdentifier edgeVar = edgePatternExpr.getEdgeDescriptor().getVariableExpr().getVar();
-        VarIdentifier vertexVar = vertexPatternExpr.getVariableExpr().getVar();
-        VarIdentifier iterationVar = graphixRewritingContext.getNewGraphixVariable();
-        VarIdentifier intermediateVar = graphixRewritingContext.getNewGraphixVariable();
-
-        // We should only be working with one edge identifier...
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        List<GraphElementIdentifier> edgeElementIDs = edgeDescriptor.generateIdentifiers(graphIdentifier);
-        if (edgeElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
-        }
-        GraphElementIdentifier edgeIdentifier = edgeElementIDs.get(0);
-
-        // ...and only one vertex identifier (given that we only have one label).
-        List<GraphElementIdentifier> vertexElementIDs = vertexPatternExpr.generateIdentifiers(graphIdentifier);
-        if (vertexElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical vertex pattern!");
-        }
-        GraphElementIdentifier vertexIdentifier = vertexElementIDs.get(0);
-        ElementBodyAnalysisContext vertexAnalysisContext = analysisContextMap.get(vertexIdentifier);
-        Expression datasetCallExpression = vertexAnalysisContext.getDatasetCallExpression();
-        if (vertexAnalysisContext.isExpressionInline() && vertexAnalysisContext.isSelectClauseInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // Join our vertex iteration variable to our edge variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr edgeJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(edgeVar));
-                        VariableExpr vertexJoinExpr = new VariableExpr(iterationVar);
-                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                                buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                                buildAccessorList(edgeJoinExpr, edgeKeyAccess.apply(edgeIdentifier)));
-                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression,
-                                new VariableExpr(iterationVar), null, vertexEdgeJoin, null);
-                        clauseSequence.addMainClause(joinClause);
-                    });
-
-                    // Inline our vertex body.
-                    super.apply(loweringEnvironment);
-
-                    // Bind our intermediate (join) variable and vertex variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr iterationVarExpr = new VariableExpr(iterationVar);
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        clauseSequence.addMainClause(new CorrLetClause(iterationVarExpr, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeVertexBinding(vertexVar, new VariableExpr(iterationVar));
-                    });
-                    aliasLookupTable.putIterationAlias(vertexVar, iterationVar);
-                    aliasLookupTable.putJoinAlias(vertexVar, intermediateVar);
-                }
-            };
-
-        } else if (vertexAnalysisContext.isExpressionInline()) {
-            return new AbstractInlineAction(graphixRewritingContext, vertexAnalysisContext, iterationVar) {
-                @Override
-                public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-                    // Join our vertex iteration variable to our edge variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr edgeJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(edgeVar));
-                        VariableExpr vertexJoinExpr = new VariableExpr(iterationVar);
-                        Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                                buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                                buildAccessorList(edgeJoinExpr, edgeKeyAccess.apply(edgeIdentifier)));
-                        JoinClause joinClause = new JoinClause(JoinType.INNER, datasetCallExpression,
-                                new VariableExpr(iterationVar), null, vertexEdgeJoin, null);
-                        clauseSequence.addMainClause(joinClause);
-                    });
-
-                    // Inline our vertex body.
-                    super.apply(loweringEnvironment);
-
-                    // Build a record constructor from our context to bind to our vertex variable.
-                    loweringEnvironment.acceptTransformer(clauseSequence -> {
-                        VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                        RecordConstructor recordConstructor1 = buildRecordConstructor();
-                        RecordConstructor recordConstructor2 = buildRecordConstructor();
-                        clauseSequence.addMainClause(new CorrLetClause(recordConstructor1, intermediateVarExpr, null));
-                        clauseSequence.addRepresentativeVertexBinding(vertexVar, recordConstructor2);
-                    });
-                    aliasLookupTable.putIterationAlias(vertexVar, iterationVar);
-                    aliasLookupTable.putJoinAlias(vertexVar, intermediateVar);
-                }
-            };
-
-        } else {
-            GraphElementDeclaration elementDeclaration = elementLookupTable.getElementDecl(vertexIdentifier);
-            return loweringEnvironment -> {
-                // Join our vertex body to our edge variable.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    VariableExpr edgeJoinExpr = new VariableExpr(aliasLookupTable.getJoinAlias(edgeVar));
-                    VariableExpr vertexJoinExpr = new VariableExpr(iterationVar);
-                    Expression vertexEdgeJoin = buildVertexEdgeJoin(
-                            buildAccessorList(vertexJoinExpr, elementLookupTable.getVertexKey(vertexIdentifier)),
-                            buildAccessorList(edgeJoinExpr, edgeKeyAccess.apply(edgeIdentifier)));
-                    JoinClause joinClause = new JoinClause(JoinType.INNER, elementDeclaration.getNormalizedBody(),
-                            new VariableExpr(iterationVar), null, vertexEdgeJoin, null);
-                    clauseSequence.addMainClause(joinClause);
-                });
-
-                // Bind our intermediate (join) variable and vertex variable.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    VariableExpr iterationVarExpr = new VariableExpr(iterationVar);
-                    VariableExpr intermediateVarExpr = new VariableExpr(intermediateVar);
-                    clauseSequence.addMainClause(new CorrLetClause(iterationVarExpr, intermediateVarExpr, null));
-                    clauseSequence.addRepresentativeVertexBinding(vertexVar, new VariableExpr(iterationVar));
-                });
-                aliasLookupTable.putIterationAlias(vertexVar, iterationVar);
-                aliasLookupTable.putJoinAlias(vertexVar, intermediateVar);
-            };
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/LoweringAliasLookupTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/LoweringAliasLookupTable.java
deleted file mode 100644
index 0642c20..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/LoweringAliasLookupTable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.lower;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-
-/**
- * Lookup table for JOIN and ITERATION aliases, indexed by their representative (i.e. element) variable identifiers.
- */
-public class LoweringAliasLookupTable {
-    private final Map<VarIdentifier, VarIdentifier> joinAliasMap = new HashMap<>();
-    private final Map<VarIdentifier, VarIdentifier> iterationAliasMap = new HashMap<>();
-
-    public void putJoinAlias(VarIdentifier elementVariable, VarIdentifier aliasVariable) {
-        joinAliasMap.put(elementVariable, aliasVariable);
-    }
-
-    public void putIterationAlias(VarIdentifier elementVariable, VarIdentifier aliasVariable) {
-        iterationAliasMap.put(elementVariable, aliasVariable);
-    }
-
-    public VarIdentifier getJoinAlias(VarIdentifier elementVariable) {
-        return joinAliasMap.get(elementVariable);
-    }
-
-    public VarIdentifier getIterationAlias(VarIdentifier elementVariable) {
-        return iterationAliasMap.get(elementVariable);
-    }
-
-    public void reset() {
-        joinAliasMap.clear();
-        iterationAliasMap.clear();
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/LoweringEnvironment.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/LoweringEnvironment.java
deleted file mode 100644
index dc9f594..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/LoweringEnvironment.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.lower;
-
-import static org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil.toUserDefinedVariableName;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.function.Consumer;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.lower.action.IEnvironmentAction;
-import org.apache.asterix.graphix.lang.rewrites.lower.transform.CorrelatedClauseSequence;
-import org.apache.asterix.graphix.lang.rewrites.lower.transform.ISequenceTransformer;
-import org.apache.asterix.graphix.lang.rewrites.visitor.VariableSubstitutionVisitor;
-import org.apache.asterix.lang.common.base.Clause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.Literal;
-import org.apache.asterix.lang.common.expression.FieldAccessor;
-import org.apache.asterix.lang.common.expression.LiteralExpr;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.literal.TrueLiteral;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.FromClause;
-import org.apache.asterix.lang.sqlpp.clause.FromTerm;
-import org.apache.asterix.lang.sqlpp.clause.JoinClause;
-import org.apache.asterix.lang.sqlpp.clause.Projection;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
-import org.apache.asterix.lang.sqlpp.clause.SelectClause;
-import org.apache.asterix.lang.sqlpp.clause.SelectRegular;
-import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.asterix.lang.sqlpp.optype.JoinType;
-import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.IteratorUtils;
-import org.apache.hyracks.api.exceptions.IWarningCollector;
-import org.apache.hyracks.api.exceptions.SourceLocation;
-import org.apache.hyracks.api.exceptions.Warning;
-
-/**
- * @see org.apache.asterix.graphix.lang.rewrites.visitor.GraphixLoweringVisitor
- */
-public class LoweringEnvironment {
-    private final GraphSelectBlock graphSelectBlock;
-    private final CorrelatedClauseSequence mainClauseSequence;
-    private final GraphixRewritingContext graphixRewritingContext;
-    private CorrelatedClauseSequence leftMatchClauseSequence;
-
-    public LoweringEnvironment(GraphSelectBlock graphSelectBlock, GraphixRewritingContext graphixRewritingContext) {
-        this.graphixRewritingContext = graphixRewritingContext;
-        this.mainClauseSequence = new CorrelatedClauseSequence();
-        this.graphSelectBlock = graphSelectBlock;
-        this.leftMatchClauseSequence = null;
-    }
-
-    public void acceptAction(IEnvironmentAction environmentAction) throws CompilationException {
-        environmentAction.apply(this);
-    }
-
-    public void acceptTransformer(ISequenceTransformer sequenceTransformer) throws CompilationException {
-        boolean isLeftMatch = leftMatchClauseSequence == null;
-        sequenceTransformer.accept(isLeftMatch ? mainClauseSequence : leftMatchClauseSequence);
-    }
-
-    public void beginLeftMatch() throws CompilationException {
-        if (leftMatchClauseSequence != null) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
-                    "LEFT-MATCH lowering is currently in progress!");
-        }
-        leftMatchClauseSequence = new CorrelatedClauseSequence();
-    }
-
-    public void endLeftMatch(IWarningCollector warningCollector) throws CompilationException {
-        VariableSubstitutionVisitor substitutionVisitor = new VariableSubstitutionVisitor(graphixRewritingContext);
-        VariableExpr nestingVariableExpr = new VariableExpr(graphixRewritingContext.getNewGraphixVariable());
-        final Consumer<VarIdentifier> substitutionAdder = v -> {
-            VariableExpr sourceNestingVariableExpr = new VariableExpr(nestingVariableExpr.getVar());
-            FieldAccessor fieldAccessor = new FieldAccessor(sourceNestingVariableExpr, v);
-            substitutionVisitor.addSubstitution(v, fieldAccessor);
-        };
-
-        // Build up our projection list.
-        List<Projection> projectionList = new ArrayList<>();
-        ListIterator<AbstractBinaryCorrelateClause> forProjectIterator = leftMatchClauseSequence.getMainIterator();
-        while (forProjectIterator.hasNext()) {
-            AbstractBinaryCorrelateClause workingClause = forProjectIterator.next();
-            if (workingClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
-                continue;
-            }
-            VarIdentifier rightVariable = workingClause.getRightVariable().getVar();
-            projectionList.add(new Projection(Projection.Kind.NAMED_EXPR, new VariableExpr(rightVariable),
-                    toUserDefinedVariableName(rightVariable).getValue()));
-            substitutionAdder.accept(rightVariable);
-        }
-
-        // Assemble a FROM-TERM from our LEFT-MATCH sequence (do not add our representatives).
-        JoinClause headCorrelateClause = (JoinClause) leftMatchClauseSequence.popMainClauseSequence();
-        ListIterator<AbstractBinaryCorrelateClause> mainIterator = leftMatchClauseSequence.getMainIterator();
-        List<AbstractBinaryCorrelateClause> correlateClauses = IteratorUtils.toList(mainIterator);
-        raiseCrossJoinWarning(correlateClauses, warningCollector, null);
-        FromTerm fromTerm = new FromTerm(headCorrelateClause.getRightExpression(),
-                headCorrelateClause.getRightVariable(), headCorrelateClause.getPositionalVariable(), correlateClauses);
-
-        // Nest our FROM-TERM.
-        SelectClause selectClause = new SelectClause(null, new SelectRegular(projectionList), false);
-        SelectBlock selectBlock = new SelectBlock(selectClause, new FromClause(List.of(fromTerm)), null, null, null);
-        SetOperationInput setOperationInput = new SetOperationInput(selectBlock, null);
-        SelectSetOperation selectSetOperation = new SelectSetOperation(setOperationInput, null);
-        SelectExpression selectExpression = new SelectExpression(null, selectSetOperation, null, null, true);
-
-        // Attach our assembled sequence back to the main sequence.
-        Expression conditionExpression = headCorrelateClause.getConditionExpression();
-        Expression newConditionExpression = conditionExpression.accept(substitutionVisitor, null);
-        JoinClause leftJoinClause = new JoinClause(JoinType.LEFTOUTER, selectExpression, nestingVariableExpr, null,
-                newConditionExpression, Literal.Type.MISSING);
-        mainClauseSequence.addMainClause(leftJoinClause);
-
-        // Introduce our representative variables back into  our main sequence.
-        for (CorrLetClause representativeVertexBinding : leftMatchClauseSequence.getRepresentativeVertexBindings()) {
-            VarIdentifier representativeVariable = representativeVertexBinding.getRightVariable().getVar();
-            Expression rightExpression = representativeVertexBinding.getRightExpression();
-            Expression reboundExpression = rightExpression.accept(substitutionVisitor, null);
-            mainClauseSequence.addRepresentativeVertexBinding(representativeVariable, reboundExpression);
-        }
-        for (CorrLetClause representativeEdgeBinding : leftMatchClauseSequence.getRepresentativeEdgeBindings()) {
-            VarIdentifier representativeVariable = representativeEdgeBinding.getRightVariable().getVar();
-            Expression rightExpression = representativeEdgeBinding.getRightExpression();
-            Expression reboundExpression = rightExpression.accept(substitutionVisitor, null);
-            mainClauseSequence.addRepresentativeEdgeBinding(representativeVariable, reboundExpression);
-        }
-        leftMatchClauseSequence = null;
-    }
-
-    public void finalizeLowering(FromGraphClause fromGraphClause, IWarningCollector warningCollector) {
-        AbstractBinaryCorrelateClause headCorrelateClause = mainClauseSequence.popMainClauseSequence();
-        List<AbstractBinaryCorrelateClause> correlateClauses = IterableUtils.toList(mainClauseSequence);
-        raiseCrossJoinWarning(correlateClauses, warningCollector, fromGraphClause.getSourceLocation());
-        FromTerm outputFromTerm = new FromTerm(headCorrelateClause.getRightExpression(),
-                headCorrelateClause.getRightVariable(), headCorrelateClause.getPositionalVariable(), correlateClauses);
-        graphSelectBlock.setFromClause(new FromClause(List.of(outputFromTerm)));
-        graphSelectBlock.getFromClause().setSourceLocation(fromGraphClause.getSourceLocation());
-    }
-
-    private static void raiseCrossJoinWarning(List<AbstractBinaryCorrelateClause> correlateClauses,
-            IWarningCollector warningCollector, SourceLocation sourceLocation) {
-        for (AbstractBinaryCorrelateClause correlateClause : correlateClauses) {
-            if (correlateClause.getClauseType() == Clause.ClauseType.JOIN_CLAUSE) {
-                JoinClause joinClause = (JoinClause) correlateClause;
-                if (joinClause.getConditionExpression().getKind() == Expression.Kind.LITERAL_EXPRESSION) {
-                    LiteralExpr literalExpr = (LiteralExpr) joinClause.getConditionExpression();
-                    if (literalExpr.getValue().equals(TrueLiteral.INSTANCE) && warningCollector.shouldWarn()) {
-                        warningCollector.warn(Warning.of(sourceLocation, ErrorCode.COMPILATION_ERROR,
-                                "Potential disconnected pattern encountered! A CROSS-JOIN has been introduced."));
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/AbstractInlineAction.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/AbstractInlineAction.java
deleted file mode 100644
index b82801b..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/AbstractInlineAction.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.lower.action;
-
-import static org.apache.asterix.graphix.lang.rewrites.visitor.ElementBodyAnalysisVisitor.ElementBodyAnalysisContext;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.graphix.lang.clause.CorrWhereClause;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringEnvironment;
-import org.apache.asterix.graphix.lang.rewrites.visitor.VariableSubstitutionVisitor;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.clause.WhereClause;
-import org.apache.asterix.lang.common.expression.FieldBinding;
-import org.apache.asterix.lang.common.expression.LiteralExpr;
-import org.apache.asterix.lang.common.expression.RecordConstructor;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.literal.StringLiteral;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.Projection;
-import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
-import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
-
-/**
- * Inline an element body into a {@link LoweringEnvironment}. This includes a) copying {@link UnnestClause},
- * {@link LetClause}, and {@link WhereClause} AST nodes from our body analysis, and b) creating
- * {@link RecordConstructor} AST nodes to inline {@link org.apache.asterix.lang.sqlpp.clause.SelectRegular} nodes.
- */
-public abstract class AbstractInlineAction implements IEnvironmentAction {
-    protected final GraphixRewritingContext graphixRewritingContext;
-    protected final ElementBodyAnalysisContext bodyAnalysisContext;
-
-    // This may be mutated by our child.
-    protected VarIdentifier elementVariable;
-
-    // The following is reset on each application.
-    private VariableSubstitutionVisitor substitutionVisitor;
-
-    protected AbstractInlineAction(GraphixRewritingContext graphixRewritingContext,
-            ElementBodyAnalysisContext bodyAnalysisContext, VarIdentifier elementVariable) {
-        this.graphixRewritingContext = graphixRewritingContext;
-        this.bodyAnalysisContext = bodyAnalysisContext;
-        this.elementVariable = elementVariable;
-    }
-
-    @Override
-    public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-        // To inline, we need to ensure that we substitute variables accordingly.
-        substitutionVisitor = new VariableSubstitutionVisitor(graphixRewritingContext);
-        if (bodyAnalysisContext.getFromTermVariable() != null) {
-            VariableExpr fromTermVariableExpr = bodyAnalysisContext.getFromTermVariable();
-            VariableExpr elementVariableExpr = new VariableExpr(elementVariable);
-            substitutionVisitor.addSubstitution(fromTermVariableExpr.getVar(), elementVariableExpr);
-        }
-
-        // If we have any UNNEST clauses, we need to add these.
-        if (bodyAnalysisContext.getUnnestClauses() != null) {
-            for (AbstractBinaryCorrelateClause unnestClause : bodyAnalysisContext.getUnnestClauses()) {
-                VarIdentifier reboundUnnestVariableID = graphixRewritingContext.getNewGraphixVariable();
-                VariableExpr reboundVariableExpr = new VariableExpr(reboundUnnestVariableID);
-
-                // Remap this UNNEST-CLAUSE to include our new variables.
-                loweringEnvironment.acceptTransformer(clauseSequence -> {
-                    UnnestClause copiedClause = (UnnestClause) SqlppRewriteUtil.deepCopy(unnestClause);
-                    copiedClause.accept(substitutionVisitor, null);
-                    VariableExpr substitutionVariableExpr = (copiedClause.hasPositionalVariable())
-                            ? copiedClause.getPositionalVariable() : copiedClause.getRightVariable();
-                    substitutionVisitor.addSubstitution(substitutionVariableExpr.getVar(), reboundVariableExpr);
-                    UnnestClause newUnnestClause = new UnnestClause(copiedClause.getUnnestType(),
-                            copiedClause.getRightExpression(), new VariableExpr(reboundUnnestVariableID), null,
-                            copiedClause.getOuterUnnestMissingValueType());
-                    clauseSequence.addMainClause(newUnnestClause);
-                });
-            }
-        }
-
-        // If we have any LET clauses, we need to substitute them in our WHERE and SELECT clauses.
-        if (bodyAnalysisContext.getLetClauses() != null) {
-            for (LetClause letClause : bodyAnalysisContext.getLetClauses()) {
-                VarIdentifier reboundLetVariableID = graphixRewritingContext.getNewGraphixVariable();
-                VariableExpr reboundVariableExpr = new VariableExpr(reboundLetVariableID);
-
-                // Remap this LET-CLAUSE to include our new variables. Move this to our correlated clauses.
-                LetClause copiedClause = (LetClause) SqlppRewriteUtil.deepCopy(letClause);
-                copiedClause.accept(substitutionVisitor, null);
-                Expression copiedBindingExpr = copiedClause.getBindingExpr();
-                substitutionVisitor.addSubstitution(copiedClause.getVarExpr().getVar(), reboundVariableExpr);
-                loweringEnvironment.acceptTransformer(corrSequence -> {
-                    VariableExpr reboundLetVariableExpr = new VariableExpr(reboundLetVariableID);
-                    corrSequence.addMainClause(new CorrLetClause(copiedBindingExpr, reboundLetVariableExpr, null));
-                });
-            }
-        }
-
-        // If we have any WHERE clauses, we need to add these.
-        if (bodyAnalysisContext.getWhereClauses() != null) {
-            for (WhereClause whereClause : bodyAnalysisContext.getWhereClauses()) {
-                WhereClause copiedClause = (WhereClause) SqlppRewriteUtil.deepCopy(whereClause);
-                copiedClause.accept(substitutionVisitor, null);
-                loweringEnvironment.acceptTransformer(corrSequence -> {
-                    CorrWhereClause corrWhereClause = new CorrWhereClause(copiedClause.getWhereExpr());
-                    corrSequence.addMainClause(corrWhereClause);
-                });
-            }
-        }
-    }
-
-    protected RecordConstructor buildRecordConstructor() throws CompilationException {
-        if (bodyAnalysisContext.getSelectClauseProjections() != null) {
-            // Map our original variable to our element variable.
-            List<FieldBinding> fieldBindings = new ArrayList<>();
-            for (Projection projection : bodyAnalysisContext.getSelectClauseProjections()) {
-                LiteralExpr fieldNameExpr = new LiteralExpr(new StringLiteral(projection.getName()));
-                ILangExpression copiedExpr = SqlppRewriteUtil.deepCopy(projection.getExpression());
-                Expression fieldValueExpr = copiedExpr.accept(substitutionVisitor, null);
-                fieldBindings.add(new FieldBinding(fieldNameExpr, fieldValueExpr));
-            }
-            return new RecordConstructor(fieldBindings);
-
-        } else {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE,
-                    "Non-inlineable SELECT clause encountered, but was body was marked as inline!");
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/IsomorphismAction.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/IsomorphismAction.java
deleted file mode 100644
index e54cc74..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/action/IsomorphismAction.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.lower.action;
-
-import static org.apache.asterix.graphix.lang.rewrites.lower.action.IsomorphismAction.MatchEvaluationKind.COMPLETE_ISOMORPHISM;
-import static org.apache.asterix.graphix.lang.rewrites.lower.action.IsomorphismAction.MatchEvaluationKind.EDGE_ISOMORPHISM;
-import static org.apache.asterix.graphix.lang.rewrites.lower.action.IsomorphismAction.MatchEvaluationKind.HOMOMORPHISM;
-import static org.apache.asterix.graphix.lang.rewrites.lower.action.IsomorphismAction.MatchEvaluationKind.VERTEX_ISOMORPHISM;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.graphix.algebra.compiler.provider.GraphixCompilationProvider;
-import org.apache.asterix.graphix.lang.clause.CorrWhereClause;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringAliasLookupTable;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringEnvironment;
-import org.apache.asterix.graphix.lang.rewrites.lower.transform.CorrelatedClauseSequence;
-import org.apache.asterix.graphix.lang.rewrites.lower.transform.ISequenceTransformer;
-import org.apache.asterix.graphix.lang.rewrites.visitor.AbstractGraphixQueryVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.VariableSubstitutionVisitor;
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-import org.apache.asterix.lang.common.base.Clause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.expression.CallExpr;
-import org.apache.asterix.lang.common.expression.FieldAccessor;
-import org.apache.asterix.lang.common.expression.OperatorExpr;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.struct.OperatorType;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.FromTerm;
-import org.apache.asterix.lang.sqlpp.clause.JoinClause;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
-import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.asterix.lang.sqlpp.optype.JoinType;
-import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.om.functions.BuiltinFunctions;
-
-/**
- * Define which graph elements are *not* equal to each other. We assume that all elements are named at this point and
- * that our {@link FromGraphClause} is in canonical form. We enforce the following (by default, we enforce total
- * isomorphism):
- * 1. No vertex and no edge can appear more than once across all patterns of all {@link MatchClause} nodes.
- * 2. For vertex-isomorphism, we enforce that no vertex can appear more than once across all {@link MatchClause} nodes.
- * 3. For edge-isomorphism, we enforce that no edge can appear more than once across all {@link MatchClause} nodes.
- * 4. For homomorphism, we enforce nothing. Edge adjacency is already implicitly preserved.
- */
-public class IsomorphismAction implements IEnvironmentAction {
-    public enum MatchEvaluationKind {
-        COMPLETE_ISOMORPHISM("isomorphism"),
-        VERTEX_ISOMORPHISM("vertex-isomorphism"),
-        EDGE_ISOMORPHISM("edge-isomorphism"),
-        HOMOMORPHISM("homomorphism");
-
-        // The user specifies the options above through "SET `graphix.match-evaluation` '...';"
-        private final String metadataConfigOptionName;
-
-        MatchEvaluationKind(String metadataConfigOptionName) {
-            this.metadataConfigOptionName = metadataConfigOptionName;
-        }
-
-        @Override
-        public String toString() {
-            return metadataConfigOptionName;
-        }
-    }
-
-    // We will walk through our FROM-GRAPH-CLAUSE and determine our isomorphism conjuncts.
-    private final MatchEvaluationKind matchEvaluationKind;
-    private final FromGraphClause fromGraphClause;
-    private final LoweringAliasLookupTable aliasLookupTable;
-    private final GraphixRewritingContext graphixRewritingContext;
-
-    public IsomorphismAction(GraphixRewritingContext graphixRewritingContext, FromGraphClause fromGraphClause,
-            LoweringAliasLookupTable aliasLookupTable) throws CompilationException {
-        final String metadataConfigKeyName = GraphixCompilationProvider.MATCH_EVALUATION_METADATA_CONFIG;
-        this.graphixRewritingContext = graphixRewritingContext;
-        this.fromGraphClause = fromGraphClause;
-        this.aliasLookupTable = aliasLookupTable;
-
-        MetadataProvider metadataProvider = graphixRewritingContext.getMetadataProvider();
-        if (metadataProvider.getConfig().containsKey(metadataConfigKeyName)) {
-            String metadataConfigKeyValue = (String) metadataProvider.getConfig().get(metadataConfigKeyName);
-            if (metadataConfigKeyValue.equalsIgnoreCase(COMPLETE_ISOMORPHISM.toString())) {
-                this.matchEvaluationKind = COMPLETE_ISOMORPHISM;
-
-            } else if (metadataConfigKeyValue.equalsIgnoreCase(VERTEX_ISOMORPHISM.toString())) {
-                this.matchEvaluationKind = VERTEX_ISOMORPHISM;
-
-            } else if (metadataConfigKeyValue.equalsIgnoreCase(EDGE_ISOMORPHISM.toString())) {
-                this.matchEvaluationKind = EDGE_ISOMORPHISM;
-
-            } else if (metadataConfigKeyValue.equalsIgnoreCase(HOMOMORPHISM.toString())) {
-                this.matchEvaluationKind = HOMOMORPHISM;
-
-            } else {
-                throw new CompilationException(ErrorCode.ILLEGAL_SET_PARAMETER, metadataConfigKeyValue);
-            }
-
-        } else {
-            this.matchEvaluationKind = COMPLETE_ISOMORPHISM;
-        }
-    }
-
-    private static List<OperatorExpr> generateIsomorphismConjuncts(List<VariableExpr> variableList) {
-        List<OperatorExpr> isomorphismConjuncts = new ArrayList<>();
-
-        // Find all unique pairs from our list of variables.
-        for (int i = 0; i < variableList.size(); i++) {
-            for (int j = i + 1; j < variableList.size(); j++) {
-                OperatorExpr inequalityConjunct = new OperatorExpr();
-                inequalityConjunct.addOperator(OperatorType.NEQ);
-                inequalityConjunct.addOperand(variableList.get(i));
-                inequalityConjunct.addOperand(variableList.get(j));
-                isomorphismConjuncts.add(inequalityConjunct);
-            }
-        }
-
-        return isomorphismConjuncts;
-    }
-
-    @Override
-    public void apply(LoweringEnvironment loweringEnvironment) throws CompilationException {
-        Map<ElementLabel, List<VariableExpr>> vertexVariableMap = new HashMap<>();
-        Map<ElementLabel, List<VariableExpr>> edgeVariableMap = new HashMap<>();
-
-        // Populate the collections above.
-        fromGraphClause.accept(new AbstractGraphixQueryVisitor() {
-            private void populateVariableMap(ElementLabel label, VariableExpr variableExpr,
-                    Map<ElementLabel, List<VariableExpr>> labelVariableMap) {
-                Function<VariableExpr, Boolean> mapMatchFinder = v -> {
-                    final String variableName = SqlppVariableUtil.toUserDefinedName(variableExpr.getVar().getValue());
-                    String inputVariableName = SqlppVariableUtil.toUserDefinedName(v.getVar().getValue());
-                    return variableName.equals(inputVariableName);
-                };
-                if (labelVariableMap.containsKey(label)) {
-                    if (labelVariableMap.get(label).stream().noneMatch(mapMatchFinder::apply)) {
-                        labelVariableMap.get(label).add(variableExpr);
-                    }
-
-                } else {
-                    List<VariableExpr> variableList = new ArrayList<>();
-                    variableList.add(variableExpr);
-                    labelVariableMap.put(label, variableList);
-                }
-            }
-
-            @Override
-            public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
-                // We only want to explore the top level of our FROM-GRAPH-CLAUSEs.
-                for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
-                    matchClause.accept(this, arg);
-                }
-                return null;
-            }
-
-            @Override
-            public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) {
-                VarIdentifier vertexVariableID = vertexPatternExpr.getVariableExpr().getVar();
-                VarIdentifier iterationVariableID = aliasLookupTable.getIterationAlias(vertexVariableID);
-                ElementLabel elementLabel = vertexPatternExpr.getLabels().iterator().next();
-                populateVariableMap(elementLabel, new VariableExpr(iterationVariableID), vertexVariableMap);
-                return null;
-            }
-
-            @Override
-            public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) {
-                VarIdentifier edgeVariableID = edgePatternExpr.getEdgeDescriptor().getVariableExpr().getVar();
-                VarIdentifier iterationVariableID = aliasLookupTable.getIterationAlias(edgeVariableID);
-                ElementLabel elementLabel = edgePatternExpr.getEdgeDescriptor().getEdgeLabels().iterator().next();
-                populateVariableMap(elementLabel, new VariableExpr(iterationVariableID), edgeVariableMap);
-                return null;
-            }
-        }, null);
-
-        // Construct our isomorphism conjuncts.
-        List<OperatorExpr> isomorphismConjuncts = new ArrayList<>();
-        if (matchEvaluationKind == COMPLETE_ISOMORPHISM || matchEvaluationKind == VERTEX_ISOMORPHISM) {
-            vertexVariableMap.values().stream().map(IsomorphismAction::generateIsomorphismConjuncts)
-                    .forEach(isomorphismConjuncts::addAll);
-        }
-        if (matchEvaluationKind == COMPLETE_ISOMORPHISM || matchEvaluationKind == EDGE_ISOMORPHISM) {
-            edgeVariableMap.values().stream().map(IsomorphismAction::generateIsomorphismConjuncts)
-                    .forEach(isomorphismConjuncts::addAll);
-        }
-
-        // Iterate through our clause sequence, and introduce our isomorphism conjuncts eagerly.
-        VariableSubstitutionVisitor substitutionVisitor = new VariableSubstitutionVisitor(graphixRewritingContext);
-        loweringEnvironment.acceptTransformer(new ISequenceTransformer() {
-            private final Set<VarIdentifier> visitedVariables = new HashSet<>();
-
-            private void acceptLeftMatchJoin(ListIterator<AbstractBinaryCorrelateClause> clauseIterator,
-                    JoinClause joinClause) throws CompilationException {
-                // We can make the following assumptions about our JOIN here (i.e. the casts here are valid).
-                Expression rightExpression = joinClause.getRightExpression();
-                SelectExpression selectExpression = (SelectExpression) rightExpression;
-                SelectSetOperation selectSetOperation = selectExpression.getSelectSetOperation();
-                SelectBlock selectBlock = selectSetOperation.getLeftInput().getSelectBlock();
-                FromTerm fromTerm = selectBlock.getFromClause().getFromTerms().get(0);
-                for (AbstractBinaryCorrelateClause workingClause : fromTerm.getCorrelateClauses()) {
-                    if (workingClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
-                        continue;
-                    }
-                    VarIdentifier rightVariable = workingClause.getRightVariable().getVar();
-
-                    // Add our isomorphism conjunct to our main iterator.
-                    Set<OperatorExpr> appliedIsomorphismConjuncts = new HashSet<>();
-                    for (OperatorExpr isomorphismConjunct : isomorphismConjuncts) {
-                        List<Expression> operandList = isomorphismConjunct.getExprList();
-                        VarIdentifier termVariable1 = ((VariableExpr) operandList.get(0)).getVar();
-                        VarIdentifier termVariable2 = ((VariableExpr) operandList.get(1)).getVar();
-                        if (!termVariable1.equals(rightVariable) && !termVariable2.equals(rightVariable)) {
-                            continue;
-                        }
-
-                        // Add a substitution for our right variable.
-                        VariableExpr nestingVariableExpr1 = new VariableExpr(joinClause.getRightVariable().getVar());
-                        VariableExpr nestingVariableExpr2 = new VariableExpr(joinClause.getRightVariable().getVar());
-                        FieldAccessor fieldAccessor1 = new FieldAccessor(nestingVariableExpr1, rightVariable);
-                        FieldAccessor fieldAccessor2 = new FieldAccessor(nestingVariableExpr2, rightVariable);
-                        substitutionVisitor.addSubstitution(rightVariable, fieldAccessor1);
-                        Expression qualifiedConjunct = substitutionVisitor.visit(isomorphismConjunct, null);
-
-                        // Our right variable can also be optional.
-                        FunctionSignature functionSignature = new FunctionSignature(BuiltinFunctions.IS_MISSING);
-                        CallExpr isMissingCallExpr = new CallExpr(functionSignature, List.of(fieldAccessor2));
-                        OperatorExpr disjunctionExpr = new OperatorExpr();
-                        disjunctionExpr.addOperator(OperatorType.OR);
-                        disjunctionExpr.addOperand(isMissingCallExpr);
-                        disjunctionExpr.addOperand(qualifiedConjunct);
-                        clauseIterator.add(new CorrWhereClause(disjunctionExpr));
-                        appliedIsomorphismConjuncts.add(isomorphismConjunct);
-                        visitedVariables.add(rightVariable);
-                    }
-                    isomorphismConjuncts.removeAll(appliedIsomorphismConjuncts);
-                }
-            }
-
-            @Override
-            public void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException {
-                ListIterator<AbstractBinaryCorrelateClause> clauseIterator = clauseSequence.getMainIterator();
-                while (clauseIterator.hasNext()) {
-                    AbstractBinaryCorrelateClause workingClause = clauseIterator.next();
-                    if (workingClause.getClauseType() == Clause.ClauseType.WHERE_CLAUSE) {
-                        continue;
-                    }
-                    visitedVariables.add(workingClause.getRightVariable().getVar());
-
-                    // If we encounter a LEFT-JOIN, then we have created a LEFT-MATCH branch.
-                    if (workingClause.getClauseType() == Clause.ClauseType.JOIN_CLAUSE) {
-                        JoinClause joinClause = (JoinClause) workingClause;
-                        if (joinClause.getJoinType() == JoinType.LEFTOUTER) {
-                            acceptLeftMatchJoin(clauseIterator, joinClause);
-                        }
-                    }
-
-                    // Only introduce our conjunct if we have visited both variables.
-                    Set<OperatorExpr> appliedIsomorphismConjuncts = new HashSet<>();
-                    for (OperatorExpr isomorphismConjunct : isomorphismConjuncts) {
-                        List<Expression> operandList = isomorphismConjunct.getExprList();
-                        VarIdentifier termVariable1 = ((VariableExpr) operandList.get(0)).getVar();
-                        VarIdentifier termVariable2 = ((VariableExpr) operandList.get(1)).getVar();
-                        if (visitedVariables.contains(termVariable1) && visitedVariables.contains(termVariable2)) {
-                            clauseIterator.add(new CorrWhereClause(isomorphismConjunct));
-                            appliedIsomorphismConjuncts.add(isomorphismConjunct);
-                        }
-                    }
-                    isomorphismConjuncts.removeAll(appliedIsomorphismConjuncts);
-                }
-            }
-        });
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/CorrelatedClauseSequence.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/CorrelatedClauseSequence.java
deleted file mode 100644
index 3ea61d1..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/CorrelatedClauseSequence.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-
-/**
- * A "general" list for maintaining a sequence of {@link AbstractBinaryCorrelateClause} AST nodes. We have:
- * 1. A list of main clauses, which our callers have free rein to manipulate.
- * 2. A list of deferred clauses, which will be inserted at the tail end of the final list.
- * 3. A list of vertex bindings, which will be inserted immediately after the main clause list.
- * 4. A list of edge bindings, which will be inserted immediately after the vertex binding list.
- */
-public class CorrelatedClauseSequence implements Iterable<AbstractBinaryCorrelateClause> {
-    private final LinkedList<AbstractBinaryCorrelateClause> deferredCorrelatedClauseSequence = new LinkedList<>();
-    private final LinkedList<AbstractBinaryCorrelateClause> mainCorrelatedClauseSequence = new LinkedList<>();
-    private final List<CorrLetClause> representativeVertexBindings = new ArrayList<>();
-    private final List<CorrLetClause> representativeEdgeBindings = new ArrayList<>();
-
-    public void addMainClause(AbstractBinaryCorrelateClause correlateClause) {
-        mainCorrelatedClauseSequence.addLast(correlateClause);
-    }
-
-    public void addDeferredClause(AbstractBinaryCorrelateClause correlateClause) {
-        deferredCorrelatedClauseSequence.add(correlateClause);
-    }
-
-    public void addRepresentativeVertexBinding(VarIdentifier representativeVariable, Expression bindingExpression) {
-        VariableExpr representativeVariableExpr = new VariableExpr(representativeVariable);
-        representativeVertexBindings.add(new CorrLetClause(bindingExpression, representativeVariableExpr, null));
-    }
-
-    public void addRepresentativeEdgeBinding(VarIdentifier representativeVariable, Expression bindingExpression) {
-        VariableExpr representativeVariableExpr = new VariableExpr(representativeVariable);
-        representativeEdgeBindings.add(new CorrLetClause(bindingExpression, representativeVariableExpr, null));
-    }
-
-    public AbstractBinaryCorrelateClause popMainClauseSequence() {
-        return mainCorrelatedClauseSequence.removeFirst();
-    }
-
-    public ListIterator<AbstractBinaryCorrelateClause> getMainIterator() {
-        return mainCorrelatedClauseSequence.listIterator();
-    }
-
-    public List<CorrLetClause> getRepresentativeVertexBindings() {
-        return representativeVertexBindings;
-    }
-
-    public List<CorrLetClause> getRepresentativeEdgeBindings() {
-        return representativeEdgeBindings;
-    }
-
-    @Override
-    public Iterator<AbstractBinaryCorrelateClause> iterator() {
-        List<AbstractBinaryCorrelateClause> correlateClauses = new ArrayList<>();
-        correlateClauses.addAll(mainCorrelatedClauseSequence);
-        correlateClauses.addAll(representativeVertexBindings);
-        correlateClauses.addAll(representativeEdgeBindings);
-        correlateClauses.addAll(deferredCorrelatedClauseSequence);
-        return correlateClauses.listIterator();
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/IGraphElementResolver.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/IGraphElementResolver.java
deleted file mode 100644
index aa939fb..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/IGraphElementResolver.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.resolve;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.rewrites.visitor.StructureResolutionVisitor;
-
-/**
- * @see StructureResolutionVisitor
- */
-public interface IGraphElementResolver {
-    /**
-     * @param fromGraphClause FROM-GRAPH-CLAUSE to resolve edge & vertex labels, and edge directions for.
-     */
-    void resolve(FromGraphClause fromGraphClause) throws CompilationException;
-
-    /**
-     * @return True if we cannot resolve any more elements. False otherwise.
-     */
-    boolean isAtFixedPoint();
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/InferenceBasedResolver.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/InferenceBasedResolver.java
deleted file mode 100644
index 1d558fb..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/InferenceBasedResolver.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.resolve;
-
-import java.util.Set;
-import java.util.function.BiFunction;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.visitor.GraphixDeepCopyVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.LabelConsistencyVisitor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.QueryKnowledgeVisitor;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-
-/**
- * Recursively attempt to resolve any element labels / edge directions in a FROM-GRAPH-CLAUSE.
- */
-public class InferenceBasedResolver implements IGraphElementResolver {
-    public static final String METADATA_CONFIG_NAME = "inference-based";
-
-    private final QueryKnowledgeVisitor queryKnowledgeVisitor;
-    private final GraphixDeepCopyVisitor graphixDeepCopyVisitor;
-    private final SchemaKnowledgeTable schemaKnowledgeTable;
-    private boolean isAtFixedPoint = false;
-
-    public InferenceBasedResolver(SchemaKnowledgeTable schemaKnowledgeTable) {
-        this.queryKnowledgeVisitor = new QueryKnowledgeVisitor();
-        this.graphixDeepCopyVisitor = new GraphixDeepCopyVisitor();
-        this.schemaKnowledgeTable = schemaKnowledgeTable;
-    }
-
-    @Override
-    public void resolve(FromGraphClause fromGraphClause) throws CompilationException {
-        isAtFixedPoint = true;
-
-        // Update our query knowledge, then unify vertices across our FROM-GRAPH-CLAUSE.
-        queryKnowledgeVisitor.visit(fromGraphClause, null);
-        new LabelConsistencyVisitor(queryKnowledgeVisitor.getQueryKnowledgeTable()).visit(fromGraphClause, null);
-
-        // Perform our resolution.
-        for (MatchClause matchClause : fromGraphClause.getMatchClauses()) {
-            for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
-                // We can only infer labels on edges. We ignore dangling vertices.
-                for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
-                    isAtFixedPoint &= resolveEdge(edgeExpression);
-                }
-            }
-        }
-    }
-
-    /**
-     * Attempt to resolve the unknowns in an {@link EdgePatternExpr}. This includes the labels of the contained
-     * vertices and edges, as well as the edge direction.
-     * @return True if no new information was added. False otherwise.
-     */
-    private boolean resolveEdge(EdgePatternExpr edgePatternExpr) throws CompilationException {
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        if (edgeDescriptor.getPatternType() == EdgeDescriptor.PatternType.PATH) {
-            VertexPatternExpr workingLeftVertex = edgePatternExpr.getLeftVertex();
-
-            // We have a sub-path. Recurse with the edges of this sub-path.
-            boolean intermediateResult = true;
-            for (int i = 0; i < edgeDescriptor.getMaximumHops(); i++) {
-                VertexPatternExpr rightVertex;
-                if (i == edgeDescriptor.getMaximumHops() - 1) {
-                    // This is the final vertex in our path.
-                    rightVertex = edgePatternExpr.getRightVertex();
-
-                } else {
-                    // We need to get an intermediate vertex.
-                    rightVertex = edgePatternExpr.getInternalVertices().get(i);
-                }
-
-                // Build our EDGE-PATTERN-EXPR and recurse.
-                EdgeDescriptor newDescriptor = new EdgeDescriptor(edgeDescriptor.getEdgeDirection(),
-                        EdgeDescriptor.PatternType.EDGE, edgeDescriptor.getEdgeLabels(), null, null, null);
-                intermediateResult &= resolveEdge(new EdgePatternExpr(workingLeftVertex, rightVertex, newDescriptor));
-
-                // Update the labels of our edge and our internal vertex.
-                edgeDescriptor.getEdgeLabels().addAll(newDescriptor.getEdgeLabels());
-                if (i != edgeDescriptor.getMaximumHops() - 1) {
-                    for (ElementLabel label : rightVertex.getLabels()) {
-                        // Mark our labels as not inferred to prevent invalidation of what we just found.
-                        label.markInferred(false);
-                    }
-                }
-                workingLeftVertex = rightVertex;
-            }
-
-            return intermediateResult;
-        }
-
-        if (edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.UNDIRECTED) {
-            // We have an undirected edge. Recurse with a LEFT_TO_RIGHT edge...
-            EdgePatternExpr leftToRightEdgePatternExpr = graphixDeepCopyVisitor.visit(edgePatternExpr, null);
-            leftToRightEdgePatternExpr.getEdgeDescriptor().setEdgeDirection(EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT);
-            boolean isLeftToRightModified = !resolveEdge(leftToRightEdgePatternExpr);
-
-            // ...and a RIGHT_TO_LEFT edge.
-            EdgePatternExpr rightToLeftEdgePatternExpr = graphixDeepCopyVisitor.visit(edgePatternExpr, null);
-            rightToLeftEdgePatternExpr.getEdgeDescriptor().setEdgeDirection(EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT);
-            boolean isRightToLeftModified = !resolveEdge(rightToLeftEdgePatternExpr);
-
-            // Determine the direction of our edge, if possible.
-            if (isLeftToRightModified && !isRightToLeftModified) {
-                edgeDescriptor.setEdgeDirection(EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT);
-
-            } else if (!isLeftToRightModified && isRightToLeftModified) {
-                edgeDescriptor.setEdgeDirection(EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT);
-
-            } else {
-                edgeDescriptor.setEdgeDirection(EdgeDescriptor.EdgeDirection.UNDIRECTED);
-            }
-
-            // Propagate our label sets.
-            VertexPatternExpr leftVertexExpr = edgePatternExpr.getLeftVertex();
-            VertexPatternExpr rightVertexExpr = edgePatternExpr.getRightVertex();
-            if (isLeftToRightModified) {
-                edgeDescriptor.getEdgeLabels().addAll(leftToRightEdgePatternExpr.getEdgeDescriptor().getEdgeLabels());
-                leftVertexExpr.getLabels().addAll(leftToRightEdgePatternExpr.getLeftVertex().getLabels());
-                rightVertexExpr.getLabels().addAll(leftToRightEdgePatternExpr.getRightVertex().getLabels());
-            }
-            if (isRightToLeftModified) {
-                edgeDescriptor.getEdgeLabels().addAll(rightToLeftEdgePatternExpr.getEdgeDescriptor().getEdgeLabels());
-                leftVertexExpr.getLabels().addAll(rightToLeftEdgePatternExpr.getLeftVertex().getLabels());
-                rightVertexExpr.getLabels().addAll(rightToLeftEdgePatternExpr.getRightVertex().getLabels());
-            }
-            return !(isLeftToRightModified || isRightToLeftModified);
-        }
-
-        // We have a _directed_ *edge*. Determine our source and destination vertex.
-        VertexPatternExpr sourceVertexPattern, destinationVertexPattern;
-        if (edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
-            sourceVertexPattern = edgePatternExpr.getLeftVertex();
-            destinationVertexPattern = edgePatternExpr.getRightVertex();
-
-        } else { // edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT
-            sourceVertexPattern = edgePatternExpr.getRightVertex();
-            destinationVertexPattern = edgePatternExpr.getLeftVertex();
-        }
-
-        // An unknown is valid iff the element is not contained within the label set and **every** label is inferred.
-        final BiFunction<Set<ElementLabel>, ElementLabel, Boolean> validUnknownPredicate =
-                (s, e) -> !s.contains(e) && s.stream().allMatch(ElementLabel::isInferred);
-        Set<ElementLabel> sourceLabels = sourceVertexPattern.getLabels();
-        Set<ElementLabel> destLabels = destinationVertexPattern.getLabels();
-        Set<ElementLabel> edgeLabels = edgeDescriptor.getEdgeLabels();
-
-        // Iterate through our knowledge table. Attempt to fill in unknowns.
-        boolean isUnknownFilled = false;
-        for (SchemaKnowledgeTable.KnowledgeRecord knowledgeRecord : schemaKnowledgeTable) {
-            ElementLabel recordSourceLabel = knowledgeRecord.getSourceVertexLabel();
-            ElementLabel recordDestLabel = knowledgeRecord.getDestVertexLabel();
-            ElementLabel recordEdgeLabel = knowledgeRecord.getEdgeLabel();
-            boolean isSourceValidUnknown = validUnknownPredicate.apply(sourceLabels, recordSourceLabel);
-            boolean isDestValidUnknown = validUnknownPredicate.apply(destLabels, recordDestLabel);
-            boolean isEdgeValidUnknown = validUnknownPredicate.apply(edgeLabels, recordEdgeLabel);
-            if (sourceLabels.contains(recordSourceLabel)) {
-                if (edgeLabels.contains(recordEdgeLabel) && isDestValidUnknown) {
-                    // Source is known, edge is known, dest is unknown.
-                    destLabels.add(recordDestLabel.asInferred());
-                    isUnknownFilled = true;
-
-                } else if (isEdgeValidUnknown && destLabels.contains(recordDestLabel)) {
-                    // Source is known, edge is unknown, dest is known.
-                    edgeLabels.add(recordEdgeLabel.asInferred());
-                    isUnknownFilled = true;
-
-                } else if (isEdgeValidUnknown && isDestValidUnknown) {
-                    // Source is known, edge is unknown, dest is unknown.
-                    destLabels.add(recordDestLabel.asInferred());
-                    edgeLabels.add(recordEdgeLabel.asInferred());
-                    isUnknownFilled = true;
-                }
-
-            } else if (edgeLabels.contains(recordEdgeLabel)) {
-                if (isSourceValidUnknown && destLabels.contains(recordDestLabel)) {
-                    // Source is unknown, edge is known, dest is known.
-                    sourceLabels.add(recordSourceLabel.asInferred());
-                    isUnknownFilled = true;
-
-                } else if (isSourceValidUnknown && isDestValidUnknown) {
-                    // Source is unknown, edge is known, dest is unknown.
-                    sourceLabels.add(recordSourceLabel.asInferred());
-                    destLabels.add(recordDestLabel.asInferred());
-                    isUnknownFilled = true;
-                }
-
-            } else if (destLabels.contains(recordDestLabel) && isSourceValidUnknown && isEdgeValidUnknown) {
-                // Source is unknown, edge is unknown, dest is known.
-                sourceLabels.add(recordSourceLabel.asInferred());
-                edgeLabels.add(recordEdgeLabel.asInferred());
-                isUnknownFilled = true;
-            }
-        }
-        return !isUnknownFilled;
-    }
-
-    @Override
-    public boolean isAtFixedPoint() {
-        return isAtFixedPoint;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/QueryKnowledgeTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/QueryKnowledgeTable.java
deleted file mode 100644
index 23b54e4..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/QueryKnowledgeTable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.resolve;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-import org.apache.asterix.lang.common.struct.Identifier;
-
-/**
- * A knowledge base of our query graph, stored as a map of vertex variable IDs to a list of vertex labels.
- *
- * @see InferenceBasedResolver
- */
-public class QueryKnowledgeTable extends HashMap<Identifier, List<ElementLabel>> {
-    private static final long serialVersionUID = 1L;
-
-    public void put(VertexPatternExpr vertexPatternExpr) {
-        Identifier vertexIdentifier = vertexPatternExpr.getVariableExpr().getVar();
-        if (!vertexPatternExpr.getLabels().isEmpty()) {
-            if (!super.containsKey(vertexIdentifier)) {
-                super.put(vertexIdentifier, new ArrayList<>());
-            }
-            super.get(vertexIdentifier).addAll(vertexPatternExpr.getLabels());
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/SchemaKnowledgeTable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/SchemaKnowledgeTable.java
deleted file mode 100644
index 1b2984d..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/resolve/SchemaKnowledgeTable.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.resolve;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Objects;
-import java.util.Set;
-
-import org.apache.asterix.graphix.lang.expression.GraphConstructor;
-import org.apache.asterix.graphix.lang.struct.ElementLabel;
-import org.apache.asterix.graphix.metadata.entity.schema.Graph;
-import org.apache.asterix.graphix.metadata.entity.schema.Vertex;
-
-/**
- * A collection of ground truths, derived from the graph schema (either a {@link Graph} or {@link GraphConstructor}).
- *
- * @see InferenceBasedResolver
- */
-public class SchemaKnowledgeTable implements Iterable<SchemaKnowledgeTable.KnowledgeRecord> {
-    private final Set<KnowledgeRecord> knowledgeRecordSet = new HashSet<>();
-    private final Set<ElementLabel> vertexLabelSet = new HashSet<>();
-    private final Set<ElementLabel> edgeLabelSet = new HashSet<>();
-
-    public SchemaKnowledgeTable(Graph graph) {
-        graph.getGraphSchema().getVertices().stream().map(Vertex::getLabel).forEach(vertexLabelSet::add);
-        graph.getGraphSchema().getEdges().forEach(e -> {
-            vertexLabelSet.add(e.getSourceLabel());
-            vertexLabelSet.add(e.getDestinationLabel());
-            edgeLabelSet.add(e.getLabel());
-            knowledgeRecordSet.add(new KnowledgeRecord(e.getSourceLabel(), e.getDestinationLabel(), e.getLabel()));
-        });
-    }
-
-    public SchemaKnowledgeTable(GraphConstructor graphConstructor) {
-        graphConstructor.getVertexElements().forEach(v -> vertexLabelSet.add(v.getLabel()));
-        graphConstructor.getEdgeElements().forEach(e -> {
-            vertexLabelSet.add(e.getSourceLabel());
-            vertexLabelSet.add(e.getDestinationLabel());
-            edgeLabelSet.add(e.getEdgeLabel());
-            knowledgeRecordSet.add(new KnowledgeRecord(e.getSourceLabel(), e.getDestinationLabel(), e.getEdgeLabel()));
-        });
-    }
-
-    public Set<ElementLabel> getVertexLabelSet() {
-        return vertexLabelSet;
-    }
-
-    public Set<ElementLabel> getEdgeLabelSet() {
-        return edgeLabelSet;
-    }
-
-    @Override
-    public Iterator<KnowledgeRecord> iterator() {
-        return knowledgeRecordSet.iterator();
-    }
-
-    public static class KnowledgeRecord {
-        private final ElementLabel sourceVertexLabel;
-        private final ElementLabel destVertexLabel;
-        private final ElementLabel edgeLabel;
-
-        public KnowledgeRecord(ElementLabel sourceVertexLabel, ElementLabel destVertexLabel, ElementLabel edgeLabel) {
-            this.sourceVertexLabel = Objects.requireNonNull(sourceVertexLabel);
-            this.destVertexLabel = Objects.requireNonNull(destVertexLabel);
-            this.edgeLabel = Objects.requireNonNull(edgeLabel);
-        }
-
-        public ElementLabel getSourceVertexLabel() {
-            return sourceVertexLabel;
-        }
-
-        public ElementLabel getDestVertexLabel() {
-            return destVertexLabel;
-        }
-
-        public ElementLabel getEdgeLabel() {
-            return edgeLabel;
-        }
-
-        @Override
-        public String toString() {
-            return String.format("(%s)-[%s]->(%s)", sourceVertexLabel, edgeLabel, destVertexLabel);
-        }
-
-        @Override
-        public boolean equals(Object object) {
-            if (this == object) {
-                return true;
-            }
-            if (!(object instanceof KnowledgeRecord)) {
-                return false;
-            }
-            KnowledgeRecord target = (KnowledgeRecord) object;
-            return sourceVertexLabel.equals(target.sourceVertexLabel) && destVertexLabel.equals(target.destVertexLabel)
-                    && edgeLabel.equals(target.edgeLabel);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(sourceVertexLabel, destVertexLabel, edgeLabel);
-        }
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/CanonicalExpansionVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/CanonicalExpansionVisitor.java
deleted file mode 100644
index b7b1b33..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/CanonicalExpansionVisitor.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import static org.apache.asterix.graphix.extension.GraphixMetadataExtension.getGraph;
-
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.canonical.DanglingVertexExpander;
-import org.apache.asterix.graphix.lang.rewrites.canonical.EdgeSubPathExpander;
-import org.apache.asterix.graphix.lang.rewrites.resolve.SchemaKnowledgeTable;
-import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
-import org.apache.asterix.graphix.metadata.entity.schema.Graph;
-import org.apache.asterix.lang.common.base.AbstractClause;
-import org.apache.asterix.lang.common.base.Clause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
-import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.asterix.lang.sqlpp.optype.SetOpType;
-import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
-import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-
-/**
- * Expand a single {@link SelectSetOperation} with {@link VertexPatternExpr} and {@link EdgePatternExpr} nodes into
- * several UNION-ALL branches of "canonical form". This preprocessing step allows for simpler lowering logic (and
- * therefore, potentially more efficient plans) at the cost of a wider AST.
- *
- * @see DanglingVertexExpander
- * @see EdgeSubPathExpander
- */
-public class CanonicalExpansionVisitor extends AbstractGraphixQueryVisitor {
-    private final GraphixRewritingContext graphixRewritingContext;
-    private final Deque<CanonicalPatternEnvironment> environmentStack;
-    private final DanglingVertexExpander danglingVertexExpander;
-    private final EdgeSubPathExpander edgeSubPathExpander;
-
-    // To avoid "over-expanding", we require knowledge of our schema.
-    private final Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs;
-    private final MetadataProvider metadataProvider;
-
-    private static class CanonicalPatternEnvironment {
-        private List<GraphSelectBlock> graphSelectBlockList;
-        private List<SetOperationInput> setOperationInputList;
-        private SchemaKnowledgeTable schemaKnowledgeTable;
-        private boolean wasExpanded = false;
-
-        // The following is collected for our post-canonicalization pass.
-        private GraphSelectBlock selectBlockExpansionSource;
-        private Set<SetOperationInput> generatedSetInputs;
-        private List<VarIdentifier> userLiveVariables;
-    }
-
-    public CanonicalExpansionVisitor(GraphixRewritingContext graphixRewritingContext) {
-        this.metadataProvider = graphixRewritingContext.getMetadataProvider();
-        this.declaredGraphs = graphixRewritingContext.getDeclaredGraphs();
-        this.danglingVertexExpander = new DanglingVertexExpander();
-        this.edgeSubPathExpander = new EdgeSubPathExpander(graphixRewritingContext::getNewGraphixVariable);
-        this.graphixRewritingContext = graphixRewritingContext;
-
-        // Keep an empty environment in the stack, in case we have a non-SELECT expression.
-        this.environmentStack = new ArrayDeque<>();
-        this.environmentStack.addLast(new CanonicalPatternEnvironment());
-    }
-
-    @Override
-    public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
-        environmentStack.addLast(new CanonicalPatternEnvironment());
-        super.visit(selectExpression, arg);
-
-        // If expansion has occurred, we need to perform clean-up if we have output modifiers / grouping.
-        CanonicalPatternEnvironment workingEnvironment = environmentStack.removeLast();
-        SelectExpression workingSelectExpression = selectExpression;
-        if (workingEnvironment.wasExpanded && (selectExpression.hasLimit() || selectExpression.hasOrderby()
-                || workingEnvironment.graphSelectBlockList.stream().anyMatch(SelectBlock::hasGroupbyClause))) {
-            PostCanonicalizationVisitor postCanonicalizationVisitor = new PostCanonicalizationVisitor(
-                    graphixRewritingContext, workingEnvironment.selectBlockExpansionSource,
-                    workingEnvironment.generatedSetInputs, workingEnvironment.userLiveVariables);
-            workingSelectExpression = (SelectExpression) postCanonicalizationVisitor.visit(selectExpression, arg);
-        }
-        return workingSelectExpression;
-    }
-
-    @Override
-    public Expression visit(SelectSetOperation selectSetOperation, ILangExpression arg) throws CompilationException {
-        CanonicalPatternEnvironment workingEnvironment = environmentStack.getLast();
-        workingEnvironment.setOperationInputList = new ArrayList<>();
-        selectSetOperation.getLeftInput().accept(this, arg);
-        for (SetOperationRight right : selectSetOperation.getRightInputs()) {
-            right.getSetOperationRightInput().accept(this, arg);
-        }
-        for (int i = 0; i < workingEnvironment.setOperationInputList.size(); i++) {
-            SetOperationInput setOperationInput = workingEnvironment.setOperationInputList.get(i);
-            if (i == 0) {
-                selectSetOperation.getLeftInput().setSelectBlock(setOperationInput.getSelectBlock());
-                selectSetOperation.getLeftInput().setSubquery(setOperationInput.getSubquery());
-
-            } else if (selectSetOperation.getRightInputs().size() > i) {
-                SetOperationInput setOperationRightInput =
-                        selectSetOperation.getRightInputs().get(i - 1).getSetOperationRightInput();
-                setOperationRightInput.setSelectBlock(setOperationInput.getSelectBlock());
-                setOperationRightInput.setSubquery(setOperationRightInput.getSubquery());
-
-            } else {
-                SetOperationRight setOperationRight = new SetOperationRight(SetOpType.UNION, false, setOperationInput);
-                selectSetOperation.getRightInputs().add(setOperationRight);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(GraphSelectBlock graphSelectBlock, ILangExpression arg) throws CompilationException {
-        CanonicalPatternEnvironment workingEnvironment = environmentStack.getLast();
-        workingEnvironment.graphSelectBlockList = new ArrayList<>();
-        workingEnvironment.graphSelectBlockList.add(graphSelectBlock);
-        super.visit(graphSelectBlock, arg);
-
-        if (workingEnvironment.wasExpanded) {
-            // If we have expanded, then we need to keep track of this GRAPH-SELECT-BLOCK.
-            workingEnvironment.selectBlockExpansionSource = new GraphixDeepCopyVisitor().visit(graphSelectBlock, null);
-
-            // We also need to collect all live variables up to this point.
-            workingEnvironment.userLiveVariables = new ArrayList<>();
-            for (MatchClause matchClause : graphSelectBlock.getFromGraphClause().getMatchClauses()) {
-                for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
-                    if (pathExpression.getVariableExpr() != null) {
-                        workingEnvironment.userLiveVariables.add(pathExpression.getVariableExpr().getVar());
-                    }
-                    for (VertexPatternExpr vertexExpression : pathExpression.getVertexExpressions()) {
-                        VarIdentifier vertexVariable = vertexExpression.getVariableExpr().getVar();
-                        if (!GraphixRewritingContext.isGraphixVariable(vertexVariable)) {
-                            workingEnvironment.userLiveVariables.add(vertexVariable);
-                        }
-                    }
-                    for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
-                        VarIdentifier edgeVariable = edgeExpression.getEdgeDescriptor().getVariableExpr().getVar();
-                        if (!GraphixRewritingContext.isGraphixVariable(edgeVariable)) {
-                            workingEnvironment.userLiveVariables.add(edgeVariable);
-                        }
-                    }
-                }
-            }
-            if (!graphSelectBlock.getFromGraphClause().getCorrelateClauses().isEmpty()) {
-                FromGraphClause fromGraphClause = graphSelectBlock.getFromGraphClause();
-                List<AbstractBinaryCorrelateClause> correlateClauses = fromGraphClause.getCorrelateClauses();
-                for (AbstractBinaryCorrelateClause correlateClause : correlateClauses) {
-                    VarIdentifier bindingVariable = correlateClause.getRightVariable().getVar();
-                    if (!GraphixRewritingContext.isGraphixVariable(bindingVariable)) {
-                        workingEnvironment.userLiveVariables.add(bindingVariable);
-                    }
-                }
-            }
-            if (graphSelectBlock.hasLetWhereClauses()) {
-                for (AbstractClause abstractClause : graphSelectBlock.getLetWhereList()) {
-                    if (abstractClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
-                        LetClause letClause = (LetClause) abstractClause;
-                        VarIdentifier bindingVariable = letClause.getVarExpr().getVar();
-                        if (!GraphixRewritingContext.isGraphixVariable(bindingVariable)) {
-                            workingEnvironment.userLiveVariables.add(bindingVariable);
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
-        CanonicalPatternEnvironment workingEnvironment = environmentStack.getLast();
-
-        // Establish our schema knowledge.
-        if (fromGraphClause.getGraphConstructor() == null) {
-            DataverseName dataverseName = (fromGraphClause.getDataverseName() == null)
-                    ? metadataProvider.getDefaultDataverseName() : fromGraphClause.getDataverseName();
-            Identifier graphName = fromGraphClause.getGraphName();
-
-            // First, try to find our graph inside our declared graph set.
-            GraphIdentifier graphIdentifier = new GraphIdentifier(dataverseName, graphName.getValue());
-            DeclareGraphStatement declaredGraph = declaredGraphs.get(graphIdentifier);
-            if (declaredGraph != null) {
-                workingEnvironment.schemaKnowledgeTable = new SchemaKnowledgeTable(declaredGraph.getGraphConstructor());
-
-            } else {
-                // Otherwise, fetch the graph from our metadata.
-                try {
-                    Graph graphFromMetadata =
-                            getGraph(metadataProvider.getMetadataTxnContext(), dataverseName, graphName.getValue());
-                    if (graphFromMetadata == null) {
-                        throw new CompilationException(ErrorCode.COMPILATION_ERROR, fromGraphClause.getSourceLocation(),
-                                "Graph " + graphName.getValue() + " does not exist.");
-                    }
-                    workingEnvironment.schemaKnowledgeTable = new SchemaKnowledgeTable(graphFromMetadata);
-
-                } catch (AlgebricksException e) {
-                    throw new CompilationException(ErrorCode.COMPILATION_ERROR, fromGraphClause.getSourceLocation(),
-                            "Graph " + graphName.getValue() + " does not exist.");
-                }
-            }
-
-        } else {
-            workingEnvironment.schemaKnowledgeTable = new SchemaKnowledgeTable(fromGraphClause.getGraphConstructor());
-        }
-        super.visit(fromGraphClause, arg);
-
-        // Create SOI from our GSBs back to our immediate ancestor SELECT-EXPR.
-        if (workingEnvironment.graphSelectBlockList.size() > 1) {
-            workingEnvironment.generatedSetInputs = new HashSet<>();
-            workingEnvironment.wasExpanded = true;
-        }
-        for (GraphSelectBlock graphSelectBlock : workingEnvironment.graphSelectBlockList) {
-            SetOperationInput setOperationInput = new SetOperationInput(graphSelectBlock, null);
-            workingEnvironment.setOperationInputList.add(setOperationInput);
-            if (workingEnvironment.wasExpanded) {
-                workingEnvironment.generatedSetInputs.add(setOperationInput);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(PathPatternExpr pathPatternExpr, ILangExpression arg) throws CompilationException {
-        CanonicalPatternEnvironment workingEnvironment = environmentStack.getLast();
-        Set<VertexPatternExpr> connectedVertices = new HashSet<>();
-        for (EdgePatternExpr edgeExpression : pathPatternExpr.getEdgeExpressions()) {
-            connectedVertices.add(edgeExpression.getLeftVertex());
-            connectedVertices.add(edgeExpression.getRightVertex());
-            edgeSubPathExpander.resetSchema(workingEnvironment.schemaKnowledgeTable);
-            edgeSubPathExpander.apply(edgeExpression, workingEnvironment.graphSelectBlockList);
-        }
-        for (VertexPatternExpr vertexExpression : pathPatternExpr.getVertexExpressions()) {
-            if (!connectedVertices.contains(vertexExpression)) {
-                danglingVertexExpander.apply(vertexExpression, workingEnvironment.graphSelectBlockList);
-            }
-        }
-        return pathPatternExpr;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixLoweringVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixLoweringVisitor.java
deleted file mode 100644
index 0b55145..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GraphixLoweringVisitor.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
-import org.apache.asterix.graphix.lang.rewrites.lower.EnvironmentActionFactory;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringAliasLookupTable;
-import org.apache.asterix.graphix.lang.rewrites.lower.LoweringEnvironment;
-import org.apache.asterix.graphix.lang.rewrites.visitor.ElementBodyAnalysisVisitor.ElementBodyAnalysisContext;
-import org.apache.asterix.graphix.lang.rewrites.visitor.StructureAnalysisVisitor.StructureContext;
-import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.expression.CallExpr;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.FromTerm;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-
-/**
- * Rewrite a graph AST to utilize non-graph AST nodes (i.e. replace GRAPH-SELECT-BLOCKs with a SELECT-BLOCK).
- */
-public class GraphixLoweringVisitor extends AbstractGraphixQueryVisitor {
-    private final Map<FromGraphClause, StructureContext> fromGraphClauseContextMap;
-    private final ElementLookupTable elementLookupTable;
-    private final GraphixRewritingContext graphixRewritingContext;
-    private SelectExpression topLevelSelectExpression;
-
-    // Our stack corresponds to which GRAPH-SELECT-BLOCK we are currently working with.
-    private final Map<GraphElementIdentifier, ElementBodyAnalysisContext> analysisContextMap;
-    private final Deque<LoweringEnvironment> environmentStack;
-    private final LoweringAliasLookupTable aliasLookupTable;
-    private final EnvironmentActionFactory environmentActionFactory;
-
-    public GraphixLoweringVisitor(GraphixRewritingContext graphixRewritingContext,
-            ElementLookupTable elementLookupTable, Map<FromGraphClause, StructureContext> fromGraphClauseContextMap) {
-        this.fromGraphClauseContextMap = Objects.requireNonNull(fromGraphClauseContextMap);
-        this.elementLookupTable = Objects.requireNonNull(elementLookupTable);
-        this.graphixRewritingContext = Objects.requireNonNull(graphixRewritingContext);
-        this.aliasLookupTable = new LoweringAliasLookupTable();
-        this.environmentStack = new ArrayDeque<>();
-
-        // All actions on our environment are supplied by the factory below.
-        Map<GraphElementIdentifier, ElementBodyAnalysisContext> bodyAnalysisContextMap = new HashMap<>();
-        this.environmentActionFactory = new EnvironmentActionFactory(bodyAnalysisContextMap, elementLookupTable,
-                aliasLookupTable, graphixRewritingContext);
-        this.analysisContextMap = bodyAnalysisContextMap;
-    }
-
-    @Override
-    public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
-        if (!selectExpression.isSubquery() || topLevelSelectExpression == null) {
-            topLevelSelectExpression = selectExpression;
-        }
-        return super.visit(selectExpression, arg);
-    }
-
-    @Override
-    public Expression visit(GraphSelectBlock graphSelectBlock, ILangExpression arg) throws CompilationException {
-        SelectExpression selectExpression = (SelectExpression) arg;
-        if (graphSelectBlock.hasFromGraphClause()) {
-            FromGraphClause fromGraphClause = graphSelectBlock.getFromGraphClause();
-
-            // Initialize a new lowering environment.
-            GraphIdentifier graphIdentifier = fromGraphClauseContextMap.get(fromGraphClause).getGraphIdentifier();
-            LoweringEnvironment newEnvironment = new LoweringEnvironment(graphSelectBlock, graphixRewritingContext);
-            environmentActionFactory.reset(graphIdentifier);
-
-            // We will remove the FROM-GRAPH node and replace this with a FROM node on the child visit.
-            environmentStack.addLast(newEnvironment);
-            super.visit(graphSelectBlock, graphSelectBlock);
-            environmentStack.removeLast();
-
-            // See if there are Graphix functions declared anywhere in our query.
-            Set<FunctionIdentifier> graphixFunctionSet = new HashSet<>();
-            topLevelSelectExpression.accept(new AbstractGraphixQueryVisitor() {
-                @Override
-                public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
-                    FunctionSignature functionSignature = callExpr.getFunctionSignature();
-                    if (functionSignature.getDataverseName().equals(GraphixFunctionIdentifiers.GRAPHIX_DV)) {
-                        graphixFunctionSet.add(functionSignature.createFunctionIdentifier());
-                    }
-                    return super.visit(callExpr, arg);
-                }
-            }, null);
-
-            // If so, then we need to perform a pass for schema enrichment.
-            if (!graphixFunctionSet.isEmpty()) {
-                SchemaEnrichmentVisitor schemaEnrichmentVisitor = new SchemaEnrichmentVisitor(elementLookupTable,
-                        graphIdentifier, graphSelectBlock, graphixFunctionSet);
-                selectExpression.accept(schemaEnrichmentVisitor, null);
-                if (selectExpression.hasOrderby()) {
-                    selectExpression.getOrderbyClause().accept(schemaEnrichmentVisitor, null);
-                }
-                if (selectExpression.hasLimit()) {
-                    selectExpression.getLimitClause().accept(schemaEnrichmentVisitor, null);
-                }
-            }
-
-        } else {
-            super.visit(graphSelectBlock, arg);
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
-        // Perform an analysis pass over each element body. We need to determine what we can and can't inline.
-        for (GraphElementDeclaration graphElementDeclaration : elementLookupTable) {
-            ElementBodyAnalysisVisitor elementBodyAnalysisVisitor = new ElementBodyAnalysisVisitor();
-            GraphElementIdentifier elementIdentifier = graphElementDeclaration.getIdentifier();
-            graphElementDeclaration.getNormalizedBody().accept(elementBodyAnalysisVisitor, null);
-            analysisContextMap.put(elementIdentifier, elementBodyAnalysisVisitor.getElementBodyAnalysisContext());
-        }
-        LoweringEnvironment workingEnvironment = environmentStack.getLast();
-
-        // Lower our MATCH-CLAUSEs. We should be working with canonical-ized patterns.
-        boolean wasInitialEdgeOrderingEncountered = false;
-        StructureContext structureContext = fromGraphClauseContextMap.get(fromGraphClause);
-        Deque<List<VertexPatternExpr>> danglingVertexQueue = structureContext.getDanglingVertexQueue();
-        Deque<List<PathPatternExpr>> pathPatternQueue = structureContext.getPathPatternQueue();
-        for (Iterable<EdgePatternExpr> edgeOrdering : structureContext.getEdgeDependencyGraph()) {
-            if (wasInitialEdgeOrderingEncountered) {
-                workingEnvironment.beginLeftMatch();
-            }
-            for (EdgePatternExpr edgePatternExpr : edgeOrdering) {
-                edgePatternExpr.accept(this, fromGraphClause);
-            }
-            for (VertexPatternExpr danglingVertexExpr : danglingVertexQueue.removeFirst()) {
-                workingEnvironment.acceptAction(environmentActionFactory.buildDanglingVertexAction(danglingVertexExpr));
-            }
-            if (wasInitialEdgeOrderingEncountered) {
-                workingEnvironment.endLeftMatch(graphixRewritingContext.getWarningCollector());
-            }
-            for (PathPatternExpr pathPatternExpr : pathPatternQueue.removeFirst()) {
-                workingEnvironment.acceptAction(environmentActionFactory.buildPathPatternAction(pathPatternExpr));
-            }
-            wasInitialEdgeOrderingEncountered = true;
-        }
-        if (!structureContext.getEdgeDependencyGraph().iterator().hasNext()) {
-            for (VertexPatternExpr danglingVertexExpr : danglingVertexQueue.removeFirst()) {
-                workingEnvironment.acceptAction(environmentActionFactory.buildDanglingVertexAction(danglingVertexExpr));
-            }
-            for (PathPatternExpr pathPatternExpr : pathPatternQueue.removeFirst()) {
-                workingEnvironment.acceptAction(environmentActionFactory.buildPathPatternAction(pathPatternExpr));
-            }
-        }
-        workingEnvironment.acceptAction(environmentActionFactory.buildIsomorphismAction(fromGraphClause));
-
-        // Finalize our lowering by removing this FROM-GRAPH-CLAUSE from our parent GRAPH-SELECT-BLOCK.
-        workingEnvironment.finalizeLowering(fromGraphClause, graphixRewritingContext.getWarningCollector());
-
-        // Add our correlate clauses, if any, to our tail FROM-TERM.
-        if (!fromGraphClause.getCorrelateClauses().isEmpty()) {
-            GraphSelectBlock graphSelectBlock = (GraphSelectBlock) arg;
-            List<FromTerm> fromTerms = graphSelectBlock.getFromClause().getFromTerms();
-            FromTerm tailFromTerm = fromTerms.get(fromTerms.size() - 1);
-            tailFromTerm.getCorrelateClauses().addAll(fromGraphClause.getCorrelateClauses());
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        LoweringEnvironment lowerEnvironment = environmentStack.getLast();
-
-        // We should only be working with one identifier (given that we only have one label).
-        GraphIdentifier graphIdentifier = fromGraphClauseContextMap.get((FromGraphClause) arg).getGraphIdentifier();
-        List<GraphElementIdentifier> edgeElementIDs = edgeDescriptor.generateIdentifiers(graphIdentifier);
-        if (edgeElementIDs.size() != 1) {
-            throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, "Found non-canonical edge pattern!");
-        }
-        GraphElementIdentifier edgeIdentifier = edgeElementIDs.get(0);
-        ElementBodyAnalysisContext edgeBodyAnalysisContext = analysisContextMap.get(edgeIdentifier);
-        DataverseName edgeDataverseName = edgeBodyAnalysisContext.getDataverseName();
-        String edgeDatasetName = edgeBodyAnalysisContext.getDatasetName();
-        boolean isEdgeInline = edgeBodyAnalysisContext.isExpressionInline();
-
-        // Determine our source and destination vertices.
-        VertexPatternExpr sourceVertex, destVertex;
-        if (edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
-            sourceVertex = edgePatternExpr.getLeftVertex();
-            destVertex = edgePatternExpr.getRightVertex();
-
-        } else { // edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT
-            sourceVertex = edgePatternExpr.getRightVertex();
-            destVertex = edgePatternExpr.getLeftVertex();
-        }
-
-        // Collect information about our source -> edge JOIN.
-        GraphElementIdentifier sourceIdentifier = sourceVertex.generateIdentifiers(graphIdentifier).get(0);
-        ElementBodyAnalysisContext sourceBodyAnalysisContext = analysisContextMap.get(sourceIdentifier);
-        VarIdentifier sourceVertexVariable = sourceVertex.getVariableExpr().getVar();
-        List<List<String>> sourceVertexKey = elementLookupTable.getVertexKey(sourceIdentifier);
-        List<List<String>> sourceEdgeKey = elementLookupTable.getEdgeSourceKey(edgeIdentifier);
-        Function<GraphElementIdentifier, List<List<String>>> sourceKey = elementLookupTable::getEdgeSourceKey;
-        boolean isSourceInline = sourceBodyAnalysisContext.isExpressionInline();
-        boolean isSourceIntroduced = aliasLookupTable.getIterationAlias(sourceVertexVariable) != null;
-        boolean isSourceFolded = isSourceInline && sourceBodyAnalysisContext.getDatasetName().equals(edgeDatasetName)
-                && sourceBodyAnalysisContext.getDataverseName().equals(edgeDataverseName)
-                && sourceVertexKey.equals(sourceEdgeKey);
-
-        // ...and our dest -> edge JOIN.
-        GraphElementIdentifier destIdentifier = destVertex.generateIdentifiers(graphIdentifier).get(0);
-        ElementBodyAnalysisContext destBodyAnalysisContext = analysisContextMap.get(destIdentifier);
-        VarIdentifier destVertexVariable = destVertex.getVariableExpr().getVar();
-        List<List<String>> destVertexKey = elementLookupTable.getVertexKey(destIdentifier);
-        List<List<String>> destEdgeKey = elementLookupTable.getEdgeDestKey(edgeIdentifier);
-        Function<GraphElementIdentifier, List<List<String>>> destKey = elementLookupTable::getEdgeDestKey;
-        boolean isDestInline = destBodyAnalysisContext.isExpressionInline();
-        boolean isDestIntroduced = aliasLookupTable.getIterationAlias(destVertexVariable) != null;
-        boolean isDestFolded = isDestInline && destBodyAnalysisContext.getDatasetName().equals(edgeDatasetName)
-                && destBodyAnalysisContext.getDataverseName().equals(edgeDataverseName)
-                && destVertexKey.equals(destEdgeKey);
-
-        // Determine our strategy for lowering our edge.
-        if (isEdgeInline && isSourceFolded && !isDestIntroduced) {
-            if (!isSourceIntroduced) {
-                lowerEnvironment.acceptAction(environmentActionFactory.buildDanglingVertexAction(sourceVertex));
-            }
-            lowerEnvironment
-                    .acceptAction(environmentActionFactory.buildFoldedEdgeAction(sourceVertex, edgePatternExpr));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildBoundVertexAction(destVertex, edgePatternExpr, destKey));
-
-        } else if (isEdgeInline && isDestFolded && !isSourceIntroduced) {
-            if (!isDestIntroduced) {
-                lowerEnvironment.acceptAction(environmentActionFactory.buildDanglingVertexAction(destVertex));
-            }
-            lowerEnvironment.acceptAction(environmentActionFactory.buildFoldedEdgeAction(destVertex, edgePatternExpr));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildBoundVertexAction(sourceVertex, edgePatternExpr, sourceKey));
-
-        } else if (isSourceIntroduced && isDestIntroduced) {
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildNonFoldedEdgeAction(sourceVertex, edgePatternExpr, sourceKey));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildRawJoinVertexAction(destVertex, edgePatternExpr, destKey));
-
-        } else if (isSourceIntroduced) { // !isDestIntroduced
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildNonFoldedEdgeAction(sourceVertex, edgePatternExpr, sourceKey));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildBoundVertexAction(destVertex, edgePatternExpr, destKey));
-
-        } else if (isDestIntroduced) { // !isSourceIntroduced
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildNonFoldedEdgeAction(destVertex, edgePatternExpr, destKey));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildBoundVertexAction(sourceVertex, edgePatternExpr, sourceKey));
-
-        } else { // !isSourceIntroduced && !isDestIntroduced
-            // When nothing is introduced, start off from LEFT to RIGHT instead of considering our source and dest.
-            VertexPatternExpr leftVertex = edgePatternExpr.getLeftVertex();
-            VertexPatternExpr rightVertex = edgePatternExpr.getRightVertex();
-            Function<GraphElementIdentifier, List<List<String>>> leftKey;
-            Function<GraphElementIdentifier, List<List<String>>> rightKey;
-            if (edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT) {
-                leftKey = sourceKey;
-                rightKey = destKey;
-
-            } else { // edgeDescriptor.getEdgeDirection() == EdgeDescriptor.EdgeDirection.RIGHT_TO_LEFT
-                leftKey = destKey;
-                rightKey = sourceKey;
-            }
-            lowerEnvironment.acceptAction(environmentActionFactory.buildDanglingVertexAction(leftVertex));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildNonFoldedEdgeAction(leftVertex, edgePatternExpr, leftKey));
-            lowerEnvironment.acceptAction(
-                    environmentActionFactory.buildBoundVertexAction(rightVertex, edgePatternExpr, rightKey));
-        }
-        return edgePatternExpr;
-    }
-}
\ No newline at end of file
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GroupByAggSugarVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GroupByAggSugarVisitor.java
deleted file mode 100644
index fe4b8b8..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/GroupByAggSugarVisitor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.context.Scope;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupByAggregationSugarVisitor;
-import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-
-/**
- * An extension of {@link SqlppGroupByAggregationSugarVisitor} to properly handle {@link CorrLetClause} nodes.
- */
-public class GroupByAggSugarVisitor extends SqlppGroupByAggregationSugarVisitor
-        implements ILetCorrelateClauseVisitor<Expression, ILangExpression> {
-    public GroupByAggSugarVisitor(LangRewritingContext context, Collection<VarIdentifier> externalVars) {
-        super(context, externalVars);
-    }
-
-    @Override
-    public Expression visit(CorrLetClause corrLetClause, ILangExpression arg) throws CompilationException {
-        // Do NOT extend the current scope.
-        corrLetClause.setRightExpression(visit(corrLetClause.getRightExpression(), corrLetClause));
-        VariableExpr varExpr = corrLetClause.getRightVariable();
-        Scope currentScope = scopeChecker.getCurrentScope();
-        if (currentScope.findLocalSymbol(varExpr.getVar().getValue()) != null) {
-            throw new CompilationException(ErrorCode.COMPILATION_ERROR, varExpr.getSourceLocation(),
-                    "Duplicate alias definitions: " + SqlppVariableUtil.toUserDefinedName(varExpr.getVar().getValue()));
-        }
-        currentScope.addNewVarSymbolToScope(varExpr.getVar(), Collections.emptySet());
-        return null;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ILetCorrelateClauseVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ILetCorrelateClauseVisitor.java
deleted file mode 100644
index dd8a89d..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/ILetCorrelateClauseVisitor.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-
-public interface ILetCorrelateClauseVisitor<R, T> extends ILangVisitor<R, T> {
-    R visit(CorrLetClause lcc, T arg) throws CompilationException;
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/LabelConsistencyVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/LabelConsistencyVisitor.java
deleted file mode 100644
index 1b8bd4b..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/LabelConsistencyVisitor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.resolve.QueryKnowledgeTable;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.struct.Identifier;
-
-/**
- * Unify the labels across vertices of the same variable name.
- *
- * @see org.apache.asterix.graphix.lang.rewrites.resolve.InferenceBasedResolver
- */
-public class LabelConsistencyVisitor extends AbstractGraphixQueryVisitor {
-    private final QueryKnowledgeTable queryKnowledgeTable;
-
-    public LabelConsistencyVisitor(QueryKnowledgeTable queryKnowledgeTable) {
-        this.queryKnowledgeTable = queryKnowledgeTable;
-    }
-
-    @Override
-    public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) {
-        if (vertexPatternExpr.getLabels().isEmpty()) {
-            Identifier vertexIdentifier = vertexPatternExpr.getVariableExpr().getVar();
-            if (queryKnowledgeTable.containsKey(vertexIdentifier)) {
-                vertexPatternExpr.getLabels().addAll(queryKnowledgeTable.get(vertexIdentifier));
-            }
-        }
-        return vertexPatternExpr;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PopulateUnknownsVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PopulateUnknownsVisitor.java
deleted file mode 100644
index 7da0df5..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PopulateUnknownsVisitor.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- * http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Supplier;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.lang.common.base.AbstractClause;
-import org.apache.asterix.lang.common.base.Clause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.asterix.lang.sqlpp.rewrites.visitor.GenerateColumnNameVisitor;
-import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-
-/**
- * A pre-Graphix transformation pass to populate a number of unknowns in our Graphix AST.
- * a) Populate all unknown graph elements (vertices and edges).
- * b) Populate all unknown column names in SELECT-CLAUSEs.
- * c) Populate all unknown GROUP-BY keys.
- * d) Fill in all GROUP-BY fields.
- */
-public class PopulateUnknownsVisitor extends AbstractGraphixQueryVisitor {
-    private final GenerateColumnNameVisitor generateColumnNameVisitor;
-    private final Supplier<VarIdentifier> newVariableSupplier;
-
-    public PopulateUnknownsVisitor(GraphixRewritingContext graphixRewritingContext) {
-        generateColumnNameVisitor = new GenerateColumnNameVisitor(graphixRewritingContext);
-        newVariableSupplier = graphixRewritingContext::getNewGraphixVariable;
-    }
-
-    @Override
-    public Expression visit(SelectExpression selectExpression, ILangExpression arg) throws CompilationException {
-        selectExpression.accept(generateColumnNameVisitor, arg);
-        return super.visit(selectExpression, arg);
-    }
-
-    @Override
-    public Expression visit(GraphSelectBlock graphSelectBlock, ILangExpression arg) throws CompilationException {
-        super.visit(graphSelectBlock, arg);
-
-        if (graphSelectBlock.hasGroupbyClause()) {
-            // Collect all variables that should belong in the GROUP-BY field list.
-            List<VarIdentifier> userLiveVariables = new ArrayList<>();
-            for (MatchClause matchClause : graphSelectBlock.getFromGraphClause().getMatchClauses()) {
-                for (PathPatternExpr pathExpression : matchClause.getPathExpressions()) {
-                    if (pathExpression.getVariableExpr() != null) {
-                        userLiveVariables.add(pathExpression.getVariableExpr().getVar());
-                    }
-                    for (VertexPatternExpr vertexExpression : pathExpression.getVertexExpressions()) {
-                        VarIdentifier vertexVariable = vertexExpression.getVariableExpr().getVar();
-                        if (!GraphixRewritingContext.isGraphixVariable(vertexVariable)) {
-                            userLiveVariables.add(vertexVariable);
-                        }
-                    }
-                    for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
-                        VarIdentifier edgeVariable = edgeExpression.getEdgeDescriptor().getVariableExpr().getVar();
-                        if (!GraphixRewritingContext.isGraphixVariable(edgeVariable)) {
-                            userLiveVariables.add(edgeVariable);
-                        }
-                    }
-                }
-            }
-            if (!graphSelectBlock.getFromGraphClause().getCorrelateClauses().isEmpty()) {
-                FromGraphClause fromGraphClause = graphSelectBlock.getFromGraphClause();
-                List<AbstractBinaryCorrelateClause> correlateClauses = fromGraphClause.getCorrelateClauses();
-                for (AbstractBinaryCorrelateClause correlateClause : correlateClauses) {
-                    VarIdentifier bindingVariable = correlateClause.getRightVariable().getVar();
-                    if (!GraphixRewritingContext.isGraphixVariable(bindingVariable)) {
-                        userLiveVariables.add(bindingVariable);
-                    }
-                }
-            }
-            if (graphSelectBlock.hasLetWhereClauses()) {
-                for (AbstractClause abstractClause : graphSelectBlock.getLetWhereList()) {
-                    if (abstractClause.getClauseType() == Clause.ClauseType.LET_CLAUSE) {
-                        LetClause letClause = (LetClause) abstractClause;
-                        VarIdentifier bindingVariable = letClause.getVarExpr().getVar();
-                        if (!GraphixRewritingContext.isGraphixVariable(bindingVariable)) {
-                            userLiveVariables.add(bindingVariable);
-                        }
-                    }
-                }
-            }
-
-            // Add the live variables to our GROUP-BY field list.
-            List<Pair<Expression, Identifier>> newGroupFieldList = new ArrayList<>();
-            for (VarIdentifier userLiveVariable : userLiveVariables) {
-                String variableName = SqlppVariableUtil.toUserDefinedName(userLiveVariable.getValue());
-                VariableExpr variableExpr = new VariableExpr(userLiveVariable);
-                newGroupFieldList.add(new Pair<>(variableExpr, new Identifier(variableName)));
-            }
-            graphSelectBlock.getGroupbyClause().setGroupFieldList(newGroupFieldList);
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(VertexPatternExpr vertexExpression, ILangExpression arg) throws CompilationException {
-        if (vertexExpression.getVariableExpr() == null) {
-            vertexExpression.setVariableExpr(new VariableExpr(newVariableSupplier.get()));
-        }
-        return super.visit(vertexExpression, arg);
-    }
-
-    @Override
-    public Expression visit(EdgePatternExpr edgeExpression, ILangExpression arg) throws CompilationException {
-        EdgeDescriptor edgeDescriptor = edgeExpression.getEdgeDescriptor();
-        if (edgeDescriptor.getVariableExpr() == null) {
-            edgeDescriptor.setVariableExpr(new VariableExpr(newVariableSupplier.get()));
-        }
-        return super.visit(edgeExpression, arg);
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostRewriteVariableVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostRewriteVariableVisitor.java
deleted file mode 100644
index eea6b98..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/PostRewriteVariableVisitor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.context.Scope;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.rewrites.visitor.VariableCheckAndRewriteVisitor;
-import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-
-/**
- * An extension of {@link VariableCheckAndRewriteVisitor} to properly handle {@link CorrLetClause} nodes.
- */
-public class PostRewriteVariableVisitor extends VariableCheckAndRewriteVisitor
-        implements ILetCorrelateClauseVisitor<Expression, ILangExpression> {
-    public PostRewriteVariableVisitor(LangRewritingContext context, MetadataProvider metadataProvider,
-            Collection<VarIdentifier> externalVars) {
-        super(context, metadataProvider, externalVars);
-    }
-
-    @Override
-    public Expression visit(CorrLetClause corrLetClause, ILangExpression arg) throws CompilationException {
-        // Do NOT extend the current scope.
-        corrLetClause.setRightExpression(visit(corrLetClause.getRightExpression(), corrLetClause));
-        VariableExpr varExpr = corrLetClause.getRightVariable();
-        Scope currentScope = scopeChecker.getCurrentScope();
-        if (currentScope.findLocalSymbol(varExpr.getVar().getValue()) != null) {
-            throw new CompilationException(ErrorCode.COMPILATION_ERROR, varExpr.getSourceLocation(),
-                    "Duplicate alias definitions: " + SqlppVariableUtil.toUserDefinedName(varExpr.getVar().getValue()));
-        }
-        currentScope.addNewVarSymbolToScope(varExpr.getVar(), Collections.emptySet());
-        return null;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/QueryKnowledgeVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/QueryKnowledgeVisitor.java
deleted file mode 100644
index d56419b..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/QueryKnowledgeVisitor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.resolve.QueryKnowledgeTable;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-
-/**
- * @see QueryKnowledgeTable
- */
-public class QueryKnowledgeVisitor extends AbstractGraphixQueryVisitor {
-    private final QueryKnowledgeTable queryKnowledgeTable = new QueryKnowledgeTable();
-
-    @Override
-    public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) {
-        queryKnowledgeTable.put(vertexPatternExpr);
-        return vertexPatternExpr;
-    }
-
-    public QueryKnowledgeTable getQueryKnowledgeTable() {
-        return queryKnowledgeTable;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/SchemaEnrichmentVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/SchemaEnrichmentVisitor.java
deleted file mode 100644
index f91ebb7..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/SchemaEnrichmentVisitor.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.isEdgeFunction;
-import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.isVertexFunction;
-import static org.apache.asterix.graphix.function.GraphixFunctionMap.getFunctionPrepare;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.function.prepare.IFunctionPrepare;
-import org.apache.asterix.graphix.lang.clause.CorrLetClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.common.ElementLookupTable;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-
-/**
- * Perform a pass to enrich any {@link CorrLetClause} nodes with necessary schema information. Note that this
- * process may overestimate the amount of enrichment actually required (to minimize this difference requires some form
- * of equivalence classes @ the rewriter level).
- */
-public class SchemaEnrichmentVisitor extends AbstractGraphixQueryVisitor {
-    private final ElementLookupTable elementLookupTable;
-    private final Set<FunctionIdentifier> functionIdentifiers;
-    private final Map<VarIdentifier, Expression> expressionMap;
-    private final GraphSelectBlock workingSelectBlock;
-    private final GraphIdentifier graphIdentifier;
-
-    public SchemaEnrichmentVisitor(ElementLookupTable elementLookupTable, GraphIdentifier graphIdentifier,
-            GraphSelectBlock workingSelectBlock, Set<FunctionIdentifier> functionIdentifiers) {
-        this.graphIdentifier = graphIdentifier;
-        this.elementLookupTable = elementLookupTable;
-        this.workingSelectBlock = workingSelectBlock;
-        this.functionIdentifiers = functionIdentifiers;
-        this.expressionMap = new HashMap<>();
-    }
-
-    @Override
-    public Expression visit(GraphSelectBlock graphSelectBlock, ILangExpression arg) throws CompilationException {
-        // Visit our immediate MATCH AST nodes (do not visit lower levels).
-        for (MatchClause matchClause : graphSelectBlock.getFromGraphClause().getMatchClauses()) {
-            matchClause.accept(this, arg);
-        }
-
-        // We are going to enrich these LET-CORRELATE clauses w/ the necessary schema.
-        if (workingSelectBlock.equals(graphSelectBlock)) {
-            List<CorrLetClause> corrLetClauses = graphSelectBlock.getFromClause().getFromTerms().get(0)
-                    .getCorrelateClauses().stream().filter(c -> c instanceof CorrLetClause).map(c -> (CorrLetClause) c)
-                    .collect(Collectors.toList());
-            Collections.reverse(corrLetClauses);
-            for (FunctionIdentifier functionIdentifier : functionIdentifiers) {
-                IFunctionPrepare functionPrepare = getFunctionPrepare(functionIdentifier);
-                Set<VarIdentifier> visitedBindings = new HashSet<>();
-                for (CorrLetClause corrLetClause : corrLetClauses) {
-                    VarIdentifier rightVar = corrLetClause.getRightVariable().getVar();
-                    Expression graphExpr = expressionMap.getOrDefault(rightVar, null);
-                    boolean isVertex = isVertexFunction(functionIdentifier) && graphExpr instanceof VertexPatternExpr;
-                    boolean isEdge = isEdgeFunction(functionIdentifier) && graphExpr instanceof EdgePatternExpr;
-                    if (!visitedBindings.contains(rightVar) && (isEdge || isVertex)) {
-                        Expression outputExpr = functionPrepare.prepare(corrLetClause.getRightExpression(), graphExpr,
-                                graphIdentifier, elementLookupTable);
-                        corrLetClause.setRightExpression(outputExpr);
-                        visitedBindings.add(rightVar);
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) throws CompilationException {
-        VariableExpr variableExpr = vertexPatternExpr.getVariableExpr();
-        if (variableExpr != null) {
-            expressionMap.put(variableExpr.getVar(), vertexPatternExpr);
-        }
-        return super.visit(vertexPatternExpr, arg);
-    }
-
-    @Override
-    public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
-        EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-        VariableExpr variableExpr = edgeDescriptor.getVariableExpr();
-        if (variableExpr != null) {
-            expressionMap.put(variableExpr.getVar(), edgePatternExpr);
-        }
-        return super.visit(edgePatternExpr, arg);
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/StructureAnalysisVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/StructureAnalysisVisitor.java
deleted file mode 100644
index 36969e2..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/StructureAnalysisVisitor.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.MatchClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.optype.MatchType;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.common.EdgeDependencyGraph;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-
-/**
- * Perform an analysis pass of our AST to generate three items: a) a list of edge orderings, b) a list of dangling
- * vertices, and c) a list of path patterns.
- * - To generate an {@link EdgeDependencyGraph}, we create an adjacency map of query edges whose adjacency between
- * other query edges is defined as sharing some vertex. The adjacency list associated with each query edge is ordered
- * by visitation, and will be used in {@link EdgeDependencyGraph#iterator()}- in short, this means that the order of
- * the patterns in query may affect the resulting lowered AST.
- * - For each LEFT-MATCH-CLAUSE, we build a new dependency subgraph. Every subsequent subgraph should possess a
- * leading edge that contains a vertex found in the previous subgraph (if it exists).
- */
-public class StructureAnalysisVisitor extends AbstractGraphixQueryVisitor {
-    private static class AnalysisEnvironment {
-        // We must populate these maps (edge ID -> edge IDs).
-        private final List<Map<Identifier, List<Identifier>>> adjacencyMaps;
-        private final Map<Identifier, EdgePatternExpr> edgePatternMap;
-        private Map<Identifier, List<Identifier>> workingAdjacencyMap;
-
-        // Build a separate map to define dependencies (vertex ID -> edge IDs).
-        private final Map<Identifier, List<Identifier>> vertexEdgeMap;
-        private final Deque<List<VertexPatternExpr>> danglingVertices;
-        private final Deque<List<PathPatternExpr>> pathPatterns;
-
-        private AnalysisEnvironment() {
-            this.adjacencyMaps = new ArrayList<>();
-            this.edgePatternMap = new LinkedHashMap<>();
-            this.workingAdjacencyMap = new LinkedHashMap<>();
-
-            this.pathPatterns = new ArrayDeque<>();
-            this.danglingVertices = new ArrayDeque<>();
-            this.pathPatterns.addLast(new ArrayList<>());
-            this.danglingVertices.addLast(new ArrayList<>());
-            this.vertexEdgeMap = new LinkedHashMap<>();
-        }
-    }
-
-    // We will return instances of the following back to our caller.
-    public static class StructureContext {
-        private final Deque<List<PathPatternExpr>> pathPatternQueue;
-        private final Deque<List<VertexPatternExpr>> danglingVertexQueue;
-        private final EdgeDependencyGraph edgeDependencyGraph;
-        private final GraphIdentifier graphIdentifier;
-
-        private StructureContext(EdgeDependencyGraph edgeGraph, Deque<List<PathPatternExpr>> pathPatternQueue,
-                Deque<List<VertexPatternExpr>> danglingVertexQueue, GraphIdentifier graphIdentifier) {
-            this.edgeDependencyGraph = edgeGraph;
-            this.pathPatternQueue = pathPatternQueue;
-            this.danglingVertexQueue = danglingVertexQueue;
-            this.graphIdentifier = graphIdentifier;
-        }
-
-        public EdgeDependencyGraph getEdgeDependencyGraph() {
-            return edgeDependencyGraph;
-        }
-
-        public Deque<List<VertexPatternExpr>> getDanglingVertexQueue() {
-            return danglingVertexQueue;
-        }
-
-        public Deque<List<PathPatternExpr>> getPathPatternQueue() {
-            return pathPatternQueue;
-        }
-
-        public GraphIdentifier getGraphIdentifier() {
-            return graphIdentifier;
-        }
-    }
-
-    // We will build new environments on each visit of a FROM-GRAPH-CLAUSE.
-    private final Map<FromGraphClause, AnalysisEnvironment> analysisEnvironmentMap;
-    private final GraphixRewritingContext graphixRewritingContext;
-    private AnalysisEnvironment workingEnvironment;
-
-    public StructureAnalysisVisitor(GraphixRewritingContext graphixRewritingContext) {
-        this.analysisEnvironmentMap = new HashMap<>();
-        this.graphixRewritingContext = graphixRewritingContext;
-    }
-
-    private void addEdgeDependency(VarIdentifier vertexID, VarIdentifier edgeID, List<Identifier> dependencyList) {
-        if (workingEnvironment.vertexEdgeMap.containsKey(vertexID)) {
-            dependencyList.addAll(workingEnvironment.vertexEdgeMap.get(vertexID));
-            workingEnvironment.vertexEdgeMap.get(vertexID).add(edgeID);
-
-        } else {
-            List<Identifier> vertexDependencies = new ArrayList<>();
-            vertexDependencies.add(edgeID);
-            workingEnvironment.vertexEdgeMap.put(vertexID, vertexDependencies);
-        }
-    }
-
-    @Override
-    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
-        // Add to our a map a new analysis environment.
-        workingEnvironment = new AnalysisEnvironment();
-        analysisEnvironmentMap.put(fromGraphClause, workingEnvironment);
-
-        // Collect our structure context.
-        return super.visit(fromGraphClause, arg);
-    }
-
-    @Override
-    public Expression visit(MatchClause matchClause, ILangExpression arg) throws CompilationException {
-        // Reset to build a new graph.
-        if (matchClause.getMatchType() == MatchType.LEFTOUTER) {
-            workingEnvironment.danglingVertices.addLast(new ArrayList<>());
-            workingEnvironment.pathPatterns.addLast(new ArrayList<>());
-            workingEnvironment.vertexEdgeMap.clear();
-
-            // We should retain all adjacency information from the previous walks.
-            workingEnvironment.adjacencyMaps.add(workingEnvironment.workingAdjacencyMap);
-            workingEnvironment.workingAdjacencyMap = new LinkedHashMap<>(workingEnvironment.workingAdjacencyMap);
-        }
-        return super.visit(matchClause, arg);
-    }
-
-    @Override
-    public Expression visit(PathPatternExpr pathExpression, ILangExpression arg) throws CompilationException {
-        // Visit our edges first, then our vertices. This allows us to determine our dangling vertices.
-        for (EdgePatternExpr edgeExpression : pathExpression.getEdgeExpressions()) {
-            edgeExpression.accept(this, arg);
-        }
-        for (VertexPatternExpr vertexExpression : pathExpression.getVertexExpressions()) {
-            vertexExpression.accept(this, arg);
-        }
-        workingEnvironment.pathPatterns.getLast().add(pathExpression);
-        return pathExpression;
-    }
-
-    @Override
-    public Expression visit(VertexPatternExpr vertexExpression, ILangExpression arg) throws CompilationException {
-        VarIdentifier vertexID = vertexExpression.getVariableExpr().getVar();
-        if (!workingEnvironment.vertexEdgeMap.containsKey(vertexID)) {
-            workingEnvironment.danglingVertices.getLast().add(vertexExpression);
-        }
-        return vertexExpression;
-    }
-
-    @Override
-    public Expression visit(EdgePatternExpr edgeExpression, ILangExpression arg) throws CompilationException {
-        VarIdentifier leftVertexID = edgeExpression.getLeftVertex().getVariableExpr().getVar();
-        VarIdentifier rightVertexID = edgeExpression.getRightVertex().getVariableExpr().getVar();
-        VarIdentifier edgeID = edgeExpression.getEdgeDescriptor().getVariableExpr().getVar();
-        List<Identifier> edgeDependencies = new ArrayList<>();
-
-        addEdgeDependency(leftVertexID, edgeID, edgeDependencies);
-        addEdgeDependency(rightVertexID, edgeID, edgeDependencies);
-        workingEnvironment.workingAdjacencyMap.put(edgeID, edgeDependencies);
-        workingEnvironment.edgePatternMap.put(edgeID, edgeExpression);
-        for (Identifier dependencyEdgeID : edgeDependencies) {
-            // Populate our map in reverse as well.
-            workingEnvironment.workingAdjacencyMap.get(dependencyEdgeID).add(edgeID);
-        }
-
-        // We ignore any internal vertices here.
-        return edgeExpression;
-    }
-
-    public Map<FromGraphClause, StructureContext> getFromGraphClauseContextMap() {
-        return analysisEnvironmentMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> {
-            AnalysisEnvironment analysisEnvironment = e.getValue();
-            if (!analysisEnvironment.workingAdjacencyMap.isEmpty()) {
-                // We have not finished building our edge dependency subgraph.
-                analysisEnvironment.adjacencyMaps.add(analysisEnvironment.workingAdjacencyMap);
-                analysisEnvironment.workingAdjacencyMap = new LinkedHashMap<>();
-                analysisEnvironment.vertexEdgeMap.clear();
-            }
-
-            // Build our graph identifier.
-            FromGraphClause fromGraphClause = e.getKey();
-            MetadataProvider metadataProvider = graphixRewritingContext.getMetadataProvider();
-            DataverseName dataverseName = (fromGraphClause.getDataverseName() == null)
-                    ? metadataProvider.getDefaultDataverseName() : fromGraphClause.getDataverseName();
-            String graphName = (fromGraphClause.getGraphName() != null) ? fromGraphClause.getGraphName().getValue()
-                    : fromGraphClause.getGraphConstructor().getInstanceID();
-            GraphIdentifier graphIdentifier = new GraphIdentifier(dataverseName, graphName);
-
-            // Construct our output.
-            List<Map<Identifier, List<Identifier>>> adjacencyMaps = e.getValue().adjacencyMaps;
-            Map<Identifier, EdgePatternExpr> edgePatternMap = e.getValue().edgePatternMap;
-            EdgeDependencyGraph edgeDependencyGraph = new EdgeDependencyGraph(adjacencyMaps, edgePatternMap);
-            Deque<List<VertexPatternExpr>> danglingVertices = e.getValue().danglingVertices;
-            Deque<List<PathPatternExpr>> pathPatterns = e.getValue().pathPatterns;
-            return new StructureContext(edgeDependencyGraph, pathPatterns, danglingVertices, graphIdentifier);
-        }));
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/StructureResolutionVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/StructureResolutionVisitor.java
deleted file mode 100644
index 38bebe9..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/StructureResolutionVisitor.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import static org.apache.asterix.graphix.extension.GraphixMetadataExtension.getGraph;
-
-import java.util.Map;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.algebra.compiler.provider.GraphixCompilationProvider;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
-import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
-import org.apache.asterix.graphix.lang.rewrites.GraphixRewritingContext;
-import org.apache.asterix.graphix.lang.rewrites.resolve.IGraphElementResolver;
-import org.apache.asterix.graphix.lang.rewrites.resolve.InferenceBasedResolver;
-import org.apache.asterix.graphix.lang.rewrites.resolve.SchemaKnowledgeTable;
-import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
-import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.graphix.metadata.entity.schema.Graph;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.metadata.MetadataTransactionContext;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-/**
- * Resolve graph element labels and edge directions in our AST. We assume that all graph elements have a variable.
- *
- * @see InferenceBasedResolver
- */
-public class StructureResolutionVisitor extends AbstractGraphixQueryVisitor {
-    private static final Logger LOGGER = LogManager.getLogger(StructureResolutionVisitor.class);
-
-    // If we exceed 500 iterations, something is probably wrong... log this.
-    private static final long DEFAULT_RESOLVER_ITERATION_MAX = 500;
-
-    private final MetadataProvider metadataProvider;
-    private final Map<GraphIdentifier, DeclareGraphStatement> declaredGraphs;
-
-    public StructureResolutionVisitor(GraphixRewritingContext graphixRewritingContext) {
-        this.declaredGraphs = graphixRewritingContext.getDeclaredGraphs();
-        this.metadataProvider = graphixRewritingContext.getMetadataProvider();
-    }
-
-    @Override
-    public Expression visit(FromGraphClause fromGraphClause, ILangExpression arg) throws CompilationException {
-        // Establish our schema knowledge.
-        SchemaKnowledgeTable schemaKnowledgeTable;
-        if (fromGraphClause.getGraphConstructor() == null) {
-            DataverseName dataverseName = (fromGraphClause.getDataverseName() == null)
-                    ? metadataProvider.getDefaultDataverseName() : fromGraphClause.getDataverseName();
-            Identifier graphName = fromGraphClause.getGraphName();
-
-            // First, try to find our graph inside our declared graph set.
-            GraphIdentifier graphIdentifier = new GraphIdentifier(dataverseName, graphName.getValue());
-            DeclareGraphStatement declaredGraph = declaredGraphs.get(graphIdentifier);
-            if (declaredGraph != null) {
-                schemaKnowledgeTable = new SchemaKnowledgeTable(declaredGraph.getGraphConstructor());
-
-            } else {
-                // Otherwise, fetch the graph from our metadata.
-                try {
-                    MetadataTransactionContext metadataTxnContext = metadataProvider.getMetadataTxnContext();
-                    Graph graphFromMetadata = getGraph(metadataTxnContext, dataverseName, graphName.getValue());
-                    if (graphFromMetadata == null) {
-                        throw new CompilationException(ErrorCode.COMPILATION_ERROR, fromGraphClause.getSourceLocation(),
-                                "Graph " + graphName.getValue() + " does not exist.");
-                    }
-                    schemaKnowledgeTable = new SchemaKnowledgeTable(graphFromMetadata);
-
-                } catch (AlgebricksException e) {
-                    throw new CompilationException(ErrorCode.COMPILATION_ERROR, fromGraphClause.getSourceLocation(),
-                            "Graph " + graphName.getValue() + " does not exist.");
-                }
-            }
-
-        } else {
-            schemaKnowledgeTable = new SchemaKnowledgeTable(fromGraphClause.getGraphConstructor());
-        }
-
-        // Determine our resolution strategy. By default, we will perform bare-bones resolution.
-        IGraphElementResolver graphElementResolver;
-        String resolverMetadataKeyName = GraphixCompilationProvider.RESOLVER_METADATA_CONFIG;
-        if (metadataProvider.getConfig().containsKey(resolverMetadataKeyName)) {
-            String resolverProperty = metadataProvider.getProperty(resolverMetadataKeyName);
-            if (resolverProperty.equalsIgnoreCase(InferenceBasedResolver.METADATA_CONFIG_NAME)) {
-                graphElementResolver = new InferenceBasedResolver(schemaKnowledgeTable);
-
-            } else {
-                throw new CompilationException(ErrorCode.ILLEGAL_SET_PARAMETER, resolverProperty);
-            }
-
-        } else {
-            graphElementResolver = new InferenceBasedResolver(schemaKnowledgeTable);
-        }
-
-        // Perform our resolution passes (repeat until we reach a fixed point or the iteration max).
-        String resolverIterationMaxMetadataKeyName = GraphixCompilationProvider.RESOLVER_ITERATION_MAX_METADATA_CONFIG;
-        long resolverIterationMax;
-        if (metadataProvider.getConfig().containsKey(resolverIterationMaxMetadataKeyName)) {
-            String resolverIterationMaxProperty = metadataProvider.getProperty(resolverIterationMaxMetadataKeyName);
-            try {
-                resolverIterationMax = Long.parseLong(resolverIterationMaxProperty);
-
-            } catch (NumberFormatException e) {
-                throw new CompilationException(ErrorCode.ILLEGAL_SET_PARAMETER, resolverIterationMaxProperty);
-            }
-
-        } else {
-            resolverIterationMax = DEFAULT_RESOLVER_ITERATION_MAX;
-        }
-        for (int i = 0; i < resolverIterationMax && !graphElementResolver.isAtFixedPoint(); i++) {
-            graphElementResolver.resolve(fromGraphClause);
-            if (i == resolverIterationMax - 1) {
-                LOGGER.warn("Number of iterations for element resolution has exceeded " + resolverIterationMax);
-            }
-        }
-
-        // Perform the final pass of our FROM-GRAPH-CLAUSE.
-        new AbstractGraphixQueryVisitor() {
-            @Override
-            public Expression visit(VertexPatternExpr vertexPatternExpr, ILangExpression arg) {
-                if (vertexPatternExpr.getLabels().isEmpty()) {
-                    vertexPatternExpr.getLabels().addAll(schemaKnowledgeTable.getVertexLabelSet());
-                }
-                return vertexPatternExpr;
-            }
-
-            @Override
-            public Expression visit(EdgePatternExpr edgePatternExpr, ILangExpression arg) throws CompilationException {
-                EdgeDescriptor edgeDescriptor = edgePatternExpr.getEdgeDescriptor();
-                if (edgeDescriptor.getEdgeLabels().isEmpty()) {
-                    edgeDescriptor.getEdgeLabels().addAll(schemaKnowledgeTable.getEdgeLabelSet());
-                }
-                for (VertexPatternExpr internalVertex : edgePatternExpr.getInternalVertices()) {
-                    internalVertex.accept(this, arg);
-                }
-                return edgePatternExpr;
-            }
-        }.visit(fromGraphClause, null);
-
-        return null;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/VariableSubstitutionVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/VariableSubstitutionVisitor.java
deleted file mode 100644
index 2f99a94..0000000
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/VariableSubstitutionVisitor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
-import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
-
-/**
- * Substitute qualifying {@link VariableExpr} nodes (via their {@link VarIdentifier}) with a deep-copy of an expression.
- */
-public class VariableSubstitutionVisitor extends AbstractSqlppExpressionScopingVisitor {
-    private final Map<VarIdentifier, Expression> substitutionMap = new HashMap<>();
-
-    public VariableSubstitutionVisitor(LangRewritingContext context) {
-        super(context);
-    }
-
-    public void addSubstitution(VarIdentifier varIdentifier, Expression substitution) {
-        substitutionMap.put(varIdentifier, substitution);
-    }
-
-    @Override
-    public Expression visit(VariableExpr variableExpr, ILangExpression arg) throws CompilationException {
-        Expression substitution = substitutionMap.getOrDefault(variableExpr.getVar(), variableExpr);
-        if (substitution != null) {
-            substitution = (Expression) SqlppRewriteUtil.deepCopy(substitution);
-        }
-        return substitution;
-    }
-}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/CreateGraphStatement.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/CreateGraphStatement.java
index 730db34..235a45f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/CreateGraphStatement.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/CreateGraphStatement.java
@@ -26,8 +26,8 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
 import org.apache.asterix.graphix.lang.util.GraphStatementHandlingUtil;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.translator.IRequestParameters;
@@ -37,10 +37,12 @@
 
 /**
  * Statement for storing a {@link GraphConstructor} instance in our metadata.
- * - A CREATE GRAPH statement MUST always include a graph name.
- * - We can specify "CREATE OR REPLACE" to perform an upsert of our graph.
- * - We can specify "CREATE ... IF NOT EXISTS" to insert the graph if it doesn't exist, and not raise an error if the
- * graph already exists.
+ * <ul>
+ *  <li>A CREATE GRAPH statement MUST always include a graph name.</li>
+ *  <li>We can specify "CREATE OR REPLACE" to perform an upsert of our graph.</li>
+ *  <li>We can specify "CREATE ... IF NOT EXISTS" to insert the graph if it doesn't exist, and not raise an error if the
+ *  graph already exists.</li>
+ * </ul>
  */
 public class CreateGraphStatement extends ExtensionStatement {
     private final GraphConstructor graphConstructor;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/DeclareGraphStatement.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/DeclareGraphStatement.java
index b5fd970..b1b0e14 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/DeclareGraphStatement.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/DeclareGraphStatement.java
@@ -25,7 +25,7 @@
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.graphix.app.translator.GraphixQueryTranslator;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.translator.IRequestParameters;
@@ -33,7 +33,7 @@
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 
 /**
- * Statement for storing a {@link GraphConstructor} instance in our _context_ instead of our metadata.
+ * Statement for storing a {@link GraphConstructor} instance in our <i>context</i> instead of our metadata.
  */
 public class DeclareGraphStatement extends ExtensionStatement {
     private final GraphConstructor graphConstructor;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphDropStatement.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphDropStatement.java
index 9aadb97..e21286f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphDropStatement.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphDropStatement.java
@@ -24,8 +24,8 @@
 import org.apache.asterix.app.translator.QueryTranslator;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.metadata.DataverseName;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
 import org.apache.asterix.graphix.lang.util.GraphStatementHandlingUtil;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.translator.IRequestParameters;
@@ -36,9 +36,11 @@
 /**
  * Statement for removing a {@link org.apache.asterix.graphix.lang.expression.GraphConstructor} instance from our
  * metadata.
- * - A DROP GRAPH statement MUST always include a graph name.
- * - We can specify "DROP ... IF EXISTS" to drop the graph if it exists, and not raise an error if the graph doesn't
- * exist.
+ * <ul>
+ *  <li>A DROP GRAPH statement MUST always include a graph name.</li>
+ *  <li>We can specify "DROP ... IF EXISTS" to drop the graph if it exists, and not raise an error if the graph
+ *  doesn't exist,</li>
+ * </ul>
  */
 public class GraphDropStatement extends ExtensionStatement {
     private final DataverseName dataverseName;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphElementDeclaration.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphElementDeclaration.java
index 790a6be..32b720c 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphElementDeclaration.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/statement/GraphElementDeclaration.java
@@ -23,9 +23,9 @@
 import org.apache.asterix.algebra.extension.ExtensionStatement;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
-import org.apache.asterix.graphix.lang.rewrites.visitor.IGraphixLangVisitor;
+import org.apache.asterix.graphix.common.metadata.IElementIdentifier;
+import org.apache.asterix.graphix.lang.visitor.base.IGraphixLangVisitor;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -38,16 +38,16 @@
  * use this class to store the directly parsed AST and a normalized AST for the bodies themselves.
  */
 public final class GraphElementDeclaration extends ExtensionStatement {
-    private final GraphElementIdentifier identifier;
+    private final IElementIdentifier identifier;
     private final Expression rawBody;
     private Expression normalizedBody;
 
-    public GraphElementDeclaration(GraphElementIdentifier identifier, Expression rawBody) {
+    public GraphElementDeclaration(IElementIdentifier identifier, Expression rawBody) {
         this.identifier = Objects.requireNonNull(identifier);
         this.rawBody = Objects.requireNonNull(rawBody);
     }
 
-    public GraphElementIdentifier getIdentifier() {
+    public IElementIdentifier getIdentifier() {
         return identifier;
     }
 
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/EdgeDescriptor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/EdgeDescriptor.java
index d5f88e4..094cdb4 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/EdgeDescriptor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/EdgeDescriptor.java
@@ -19,23 +19,24 @@
 package org.apache.asterix.graphix.lang.struct;
 
 import java.io.Serializable;
-import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
-import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 
 /**
  * Descriptor for a query edge instance. A query edge has the following:
- * 1. A set of edge labels.
- * 2. A variable associated with the query edge.
- * 3. A pattern type. An edge pattern can either be a pure edge, or a sub-path.
- * 4. A minimum number of hops (allowed to be NULL, indicating a minimum of 1 hop).
- * 5. A maximum number of hops (not allowed to be NULL).
- * 6. An edge direction (left to right, right to left, or undirected).
+ * <ul>
+ *  <li>A set of edge labels.</li>
+ *  <li>A variable associated with the query edge.</li>
+ *  <li>A pattern type. An edge pattern can either be a pure edge, or a sub-path.</li>
+ *  <li>A minimum number of hops (allowed to be NULL, indicating a minimum of 1 hop).</li>
+ *  <li>A maximum number of hops (allowed to be NULL, indicating an unbounded maximum).</li>
+ *  <li>An edge direction (left to right, right to left, or undirected).</li>
+ *  <li>A filter expression (allowed to be NULL).</li>
+ * </ul>
  */
 public class EdgeDescriptor implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -44,18 +45,20 @@
     private final Integer minimumHops;
     private final Integer maximumHops;
     private final PatternType patternType;
+    private final Expression filterExpr;
 
     // We must be able to assign variables to our edges, as well as change the direction of UNDIRECTED edges.
     private VariableExpr variableExpr;
     private EdgeDirection edgeDirection;
 
     public EdgeDescriptor(EdgeDirection edgeDirection, PatternType patternType, Set<ElementLabel> edgeLabels,
-            VariableExpr variableExpr, Integer minimumHops, Integer maximumHops) {
-        this.edgeDirection = edgeDirection;
+            Expression filterExpr, VariableExpr variableExpr, Integer minimumHops, Integer maximumHops) {
         this.edgeLabels = edgeLabels;
+        this.patternType = patternType;
         this.minimumHops = minimumHops;
         this.maximumHops = maximumHops;
-        this.patternType = patternType;
+        this.filterExpr = filterExpr;
+        this.edgeDirection = edgeDirection;
         this.variableExpr = variableExpr;
     }
 
@@ -83,6 +86,10 @@
         return patternType;
     }
 
+    public Expression getFilterExpr() {
+        return filterExpr;
+    }
+
     public VariableExpr getVariableExpr() {
         return variableExpr;
     }
@@ -91,15 +98,9 @@
         this.variableExpr = variableExpr;
     }
 
-    public List<GraphElementIdentifier> generateIdentifiers(GraphIdentifier graphIdentifier) {
-        return edgeLabels.stream()
-                .map(e -> new GraphElementIdentifier(graphIdentifier, GraphElementIdentifier.Kind.EDGE, e))
-                .collect(Collectors.toList());
-    }
-
     @Override
     public int hashCode() {
-        return Objects.hash(edgeDirection, patternType, edgeLabels, variableExpr, minimumHops, maximumHops);
+        return Objects.hash(edgeDirection, patternType, edgeLabels, variableExpr, filterExpr, minimumHops, maximumHops);
     }
 
     @Override
@@ -115,6 +116,7 @@
                 && Objects.equals(this.patternType, that.patternType)
                 && Objects.equals(this.edgeLabels, that.edgeLabels)
                 && Objects.equals(this.variableExpr, that.variableExpr)
+                && Objects.equals(this.filterExpr, that.filterExpr)
                 && Objects.equals(this.minimumHops, that.minimumHops)
                 && Objects.equals(this.maximumHops, that.maximumHops);
     }
@@ -123,16 +125,31 @@
     public String toString() {
         String labelsString = edgeLabels.stream().map(ElementLabel::toString).collect(Collectors.joining("|"));
         String variableString = (variableExpr != null) ? variableExpr.getVar().toString() : "";
-        String subPathString = (patternType != PatternType.PATH) ? ""
-                : "{" + ((minimumHops == null) ? "" : minimumHops) + "," + maximumHops + "}";
-        return String.format("%s-[%s:(%s)%s]-%s", (edgeDirection == EdgeDirection.LEFT_TO_RIGHT) ? "" : "<",
-                variableString, labelsString, subPathString, (edgeDirection == EdgeDirection.RIGHT_TO_LEFT) ? "" : ">");
+        String minHopsString = ((minimumHops == null) ? "" : minimumHops.toString());
+        String maxHopsString = ((maximumHops == null) ? "" : maximumHops.toString());
+        String subPathString = (patternType != PatternType.PATH) ? "" : "{" + minHopsString + "," + maxHopsString + "}";
+        String filterString = (filterExpr == null) ? "" : (" WHERE " + filterExpr + " ");
+        return String.format("%s-[%s:(%s)%s%s]-%s", (edgeDirection == EdgeDirection.LEFT_TO_RIGHT) ? "" : "<",
+                variableString, labelsString, subPathString, filterString,
+                (edgeDirection == EdgeDirection.RIGHT_TO_LEFT) ? "" : ">");
     }
 
     public enum EdgeDirection {
-        LEFT_TO_RIGHT,
-        RIGHT_TO_LEFT,
-        UNDIRECTED
+        LEFT_TO_RIGHT("L2R"),
+        RIGHT_TO_LEFT("R2L"),
+        UNDIRECTED("U");
+
+        // For printing purposes...
+        private final String shortName;
+
+        EdgeDirection(String shortName) {
+            this.shortName = shortName;
+        }
+
+        @Override
+        public String toString() {
+            return shortName;
+        }
     }
 
     public enum PatternType {
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/ElementLabel.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/ElementLabel.java
index a65afc6..a3807ce 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/ElementLabel.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/ElementLabel.java
@@ -21,41 +21,36 @@
 import java.io.Serializable;
 import java.util.Objects;
 
+/**
+ * Label for a vertex, uniquely identified by the label name.
+ */
 public class ElementLabel implements Serializable {
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 2L;
 
     private final String labelName;
-    private boolean isInferred;
+    private final boolean isNegated;
 
-    public ElementLabel(String labelName) {
-        this(labelName, false);
-    }
-
-    private ElementLabel(String labelName, boolean isInferred) {
+    public ElementLabel(String labelName, boolean isNegated) {
         this.labelName = Objects.requireNonNull(labelName);
-        this.isInferred = isInferred;
+        this.isNegated = isNegated;
     }
 
-    public ElementLabel asInferred() {
-        return new ElementLabel(labelName, true);
+    public boolean isNegated() {
+        return isNegated;
     }
 
-    public void markInferred(boolean isInferred) {
-        this.isInferred = isInferred;
-    }
-
-    public boolean isInferred() {
-        return isInferred;
-    }
-
-    @Override
-    public String toString() {
+    public String getLabelName() {
         return labelName;
     }
 
     @Override
+    public String toString() {
+        return (isNegated ? "NOT " : "") + labelName;
+    }
+
+    @Override
     public int hashCode() {
-        return Objects.hashCode(labelName);
+        return Objects.hash(labelName, isNegated);
     }
 
     @Override
@@ -65,7 +60,7 @@
         }
         if (o instanceof ElementLabel) {
             ElementLabel that = (ElementLabel) o;
-            return this.labelName.equals(that.labelName);
+            return this.labelName.equals(that.labelName) && this.isNegated == that.isNegated;
         }
         return false;
     }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/PatternGroup.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/PatternGroup.java
new file mode 100644
index 0000000..7356668
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/struct/PatternGroup.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.lang.struct;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
+import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+
+/**
+ * A container for a collection of vertices and edges. In contrast to the expression
+ * {@link org.apache.asterix.graphix.lang.expression.PathPatternExpr}, the following elements do not have to be
+ * connected.
+ */
+public class PatternGroup implements Iterable<AbstractExpression> {
+    // Users should add to the following sets directly.
+    private final Set<VertexPatternExpr> vertexPatternSet = new HashSet<>();
+    private final Set<EdgePatternExpr> edgePatternSet = new HashSet<>();
+
+    public Set<VertexPatternExpr> getVertexPatternSet() {
+        return vertexPatternSet;
+    }
+
+    public Set<EdgePatternExpr> getEdgePatternSet() {
+        return edgePatternSet;
+    }
+
+    public void replace(VertexPatternExpr searchExpression, VertexPatternExpr replaceExpression) {
+        if (!vertexPatternSet.contains(searchExpression)) {
+            throw new IllegalArgumentException("Vertex pattern not found in group!");
+        }
+        vertexPatternSet.remove(searchExpression);
+        vertexPatternSet.add(replaceExpression);
+    }
+
+    public void replace(EdgePatternExpr searchExpression, EdgePatternExpr replaceExpression) {
+        if (!edgePatternSet.contains(searchExpression)) {
+            throw new IllegalArgumentException("Edge pattern not found in group!");
+        }
+        edgePatternSet.remove(searchExpression);
+        edgePatternSet.add(replaceExpression);
+    }
+
+    @Override
+    public Iterator<AbstractExpression> iterator() {
+        Iterator<VertexPatternExpr> vertexPatternIterator = vertexPatternSet.iterator();
+        Iterator<EdgePatternExpr> edgePatternIterator = edgePatternSet.iterator();
+        return new Iterator<>() {
+            @Override
+            public boolean hasNext() {
+                return vertexPatternIterator.hasNext() || edgePatternIterator.hasNext();
+            }
+
+            @Override
+            public AbstractExpression next() {
+                if (vertexPatternIterator.hasNext()) {
+                    return vertexPatternIterator.next();
+                }
+                if (edgePatternIterator.hasNext()) {
+                    return edgePatternIterator.next();
+                }
+                throw new NoSuchElementException();
+            }
+        };
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/util/GraphStatementHandlingUtil.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/util/GraphStatementHandlingUtil.java
index c4cc975..df2569f 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/util/GraphStatementHandlingUtil.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/util/GraphStatementHandlingUtil.java
@@ -30,16 +30,17 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.graphix.app.translator.GraphixQueryTranslator;
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
 import org.apache.asterix.graphix.extension.GraphixMetadataExtension;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
-import org.apache.asterix.graphix.lang.rewrites.GraphixQueryRewriter;
-import org.apache.asterix.graphix.lang.rewrites.visitor.AbstractGraphixQueryVisitor;
+import org.apache.asterix.graphix.lang.rewrite.GraphixQueryRewriter;
 import org.apache.asterix.graphix.lang.statement.CreateGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
+import org.apache.asterix.graphix.lang.visitor.base.AbstractGraphixQueryVisitor;
 import org.apache.asterix.graphix.metadata.entity.dependency.DependencyIdentifier;
 import org.apache.asterix.graphix.metadata.entity.dependency.GraphRequirements;
 import org.apache.asterix.graphix.metadata.entity.dependency.IEntityRequirements;
@@ -139,7 +140,7 @@
                     schemaBuilder.addVertex(vertex.getLabel(), vertex.getPrimaryKeyFields(), vertex.getDefinition());
             switch (schemaBuilder.getLastError()) {
                 case NO_ERROR:
-                    GraphElementIdentifier id = schemaVertex.getIdentifier();
+                    VertexIdentifier id = schemaVertex.getIdentifier();
                     GraphElementDeclaration decl = new GraphElementDeclaration(id, vertex.getExpression());
                     decl.setSourceLocation(vertex.getSourceLocation());
                     graphElementDeclarations.add(decl);
@@ -160,7 +161,7 @@
                             edge.getDestinationKeyFields(), edge.getSourceKeyFields(), edge.getDefinition());
             switch (schemaBuilder.getLastError()) {
                 case NO_ERROR:
-                    GraphElementIdentifier id = schemaEdge.getIdentifier();
+                    EdgeIdentifier id = schemaEdge.getIdentifier();
                     GraphElementDeclaration decl = new GraphElementDeclaration(id, edge.getExpression());
                     decl.setSourceLocation(edge.getSourceLocation());
                     graphElementDeclarations.add(decl);
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/AbstractGraphixQueryVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/visitor/base/AbstractGraphixQueryVisitor.java
similarity index 77%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/AbstractGraphixQueryVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/visitor/base/AbstractGraphixQueryVisitor.java
index 8fdc0da..c281058 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/AbstractGraphixQueryVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/visitor/base/AbstractGraphixQueryVisitor.java
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.visitor.base;
+
+import java.util.ListIterator;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
@@ -31,11 +32,10 @@
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
 import org.apache.asterix.graphix.lang.statement.GraphElementDeclaration;
 import org.apache.asterix.graphix.lang.struct.EdgeDescriptor;
-import org.apache.asterix.lang.common.base.AbstractClause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
 
 public abstract class AbstractGraphixQueryVisitor extends AbstractSqlppSimpleExpressionVisitor
@@ -63,34 +63,13 @@
     }
 
     @Override
-    public Expression visit(SelectBlock sb, ILangExpression arg) throws CompilationException {
-        return (sb instanceof GraphSelectBlock) ? this.visit((GraphSelectBlock) sb, arg) : super.visit(sb, arg);
-    }
+    public Expression visit(FromClause fc, ILangExpression arg) throws CompilationException {
+        if (fc instanceof FromGraphClause) {
+            return visit((FromGraphClause) fc, arg);
 
-    @Override
-    public Expression visit(GraphSelectBlock gsb, ILangExpression arg) throws CompilationException {
-        // Traverse in the same order as a regular SELECT-BLOCK: FROM, LET/WHERE, GROUP-BY, LET/HAVING, SELECT.
-        if (gsb.hasFromGraphClause()) {
-            gsb.getFromGraphClause().accept(this, arg);
-
-        } else if (gsb.hasFromClause()) {
-            gsb.getFromClause().accept(this, arg);
+        } else {
+            return super.visit(fc, arg);
         }
-        if (gsb.hasLetWhereClauses()) {
-            for (AbstractClause clause : gsb.getLetWhereList()) {
-                clause.accept(this, arg);
-            }
-        }
-        if (gsb.hasGroupbyClause()) {
-            gsb.getGroupbyClause().accept(this, arg);
-        }
-        if (gsb.hasLetHavingClausesAfterGroupby()) {
-            for (AbstractClause clause : gsb.getLetHavingListAfterGroupby()) {
-                clause.accept(this, arg);
-            }
-        }
-        gsb.getSelectClause().accept(this, arg);
-        return null;
     }
 
     @Override
@@ -110,8 +89,9 @@
 
     @Override
     public Expression visit(MatchClause mc, ILangExpression arg) throws CompilationException {
-        for (PathPatternExpr pathPatternExpr : mc.getPathExpressions()) {
-            pathPatternExpr.accept(this, arg);
+        ListIterator<PathPatternExpr> ppeIterator = mc.getPathExpressions().listIterator();
+        while (ppeIterator.hasNext()) {
+            ppeIterator.set((PathPatternExpr) ppeIterator.next().accept(this, arg));
         }
         return null;
     }
@@ -138,8 +118,11 @@
         if (edgeDescriptor.getVariableExpr() != null) {
             edgeDescriptor.getVariableExpr().accept(this, arg);
         }
-        for (VertexPatternExpr internalVertex : epe.getInternalVertices()) {
-            internalVertex.accept(this, arg);
+        if (epe.getInternalVertex() != null) {
+            epe.getInternalVertex().accept(this, arg);
+        }
+        if (edgeDescriptor.getFilterExpr() != null) {
+            edgeDescriptor.getFilterExpr().accept(this, arg);
         }
         return epe;
     }
@@ -149,6 +132,9 @@
         if (vpe.getVariableExpr() != null) {
             vpe.getVariableExpr().accept(this, arg);
         }
+        if (vpe.getFilterExpr() != null) {
+            vpe.getFilterExpr().accept(this, arg);
+        }
         return vpe;
     }
 
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/IGraphixLangVisitor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/visitor/base/IGraphixLangVisitor.java
similarity index 92%
rename from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/IGraphixLangVisitor.java
rename to asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/visitor/base/IGraphixLangVisitor.java
index 9d5ece9..9da17d9 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/visitor/IGraphixLangVisitor.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/visitor/base/IGraphixLangVisitor.java
@@ -16,11 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.visitor;
+package org.apache.asterix.graphix.lang.visitor.base;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
@@ -47,8 +46,6 @@
 
     R visit(GraphDropStatement gds, T arg) throws CompilationException;
 
-    R visit(GraphSelectBlock gsb, T arg) throws CompilationException;
-
     R visit(FromGraphClause fgc, T arg) throws CompilationException;
 
     R visit(MatchClause mc, T arg) throws CompilationException;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/FunctionRequirements.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/FunctionRequirements.java
index 0b88f27..ec3964e 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/FunctionRequirements.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/FunctionRequirements.java
@@ -29,7 +29,7 @@
 
 /**
  * A collection of {@link org.apache.asterix.graphix.metadata.entity.schema.Graph} dependencies associated with a
- * {@link org.apache.asterix.metadata.entities.Function} instance. This does **not** include non-graph dependencies
+ * {@link org.apache.asterix.metadata.entities.Function} instance. This does <b>not</b> include non-graph dependencies
  * for functions.
  */
 public class FunctionRequirements implements IEntityRequirements {
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/ViewRequirements.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/ViewRequirements.java
index 6c84eab..ade330e 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/ViewRequirements.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/dependency/ViewRequirements.java
@@ -29,7 +29,7 @@
 
 /**
  * A collection of {@link org.apache.asterix.graphix.metadata.entity.schema.Graph} dependencies associated with a view
- * instance. This does **not** include non-graph dependencies for views.
+ * instance. This does <b>not</b> include non-graph dependencies for views.
  */
 public class ViewRequirements implements IEntityRequirements {
     private static final long serialVersionUID = 1L;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Edge.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Edge.java
index 1c4cc17..d9a8ca9 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Edge.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Edge.java
@@ -21,24 +21,24 @@
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
 
 /**
  * Metadata representation of an edge. An edge consists of the following:
- * 1. A {@link GraphElementIdentifier}, to uniquely identify the edge across other graph elements.
- * 2. An {@link ElementLabel} instance associated with the source vertex.
- * 3. An {@link ElementLabel} instance associated with the destination vertex.
- * 4. A list of source key fields, associated with the definition body.
- * 5. A list of destination key fields, associated with the definition body.
- * 6. A SQL++ string denoting the definition body.
+ * <ul>
+ *  <li>A {@link EdgeIdentifier}, to uniquely identify the edge across other graph elements.</li>
+ *  <li>An {@link ElementLabel} instance associated with the source vertex.</li>
+ *  <li>An {@link ElementLabel} instance associated with the destination vertex.</li>
+ *  <li>A list of source key fields, associated with the definition body.</li>
+ *  <li>A list of destination key fields, associated with the definition body.</li>
+ *  <li>A SQL++ string denoting the definition body.</li>
+ * </ul>
  */
 public class Edge implements IElement {
     private static final long serialVersionUID = 1L;
 
-    private final GraphElementIdentifier identifier;
-    private final ElementLabel sourceVertexLabel;
-    private final ElementLabel destinationVertexLabel;
+    private final EdgeIdentifier identifier;
     private final List<List<String>> sourceKeyFieldNames;
     private final List<List<String>> destinationKeyFieldNames;
     private final String definitionBody;
@@ -46,11 +46,9 @@
     /**
      * Use {@link Schema.Builder} to build Edge instances instead of this constructor.
      */
-    Edge(GraphElementIdentifier identifier, ElementLabel sourceVertexLabel, ElementLabel destinationVertexLabel,
-            List<List<String>> sourceKeyFieldNames, List<List<String>> destKeyFieldNames, String definitionBody) {
+    Edge(EdgeIdentifier identifier, List<List<String>> sourceKeyFieldNames, List<List<String>> destKeyFieldNames,
+            String definitionBody) {
         this.identifier = Objects.requireNonNull(identifier);
-        this.sourceVertexLabel = Objects.requireNonNull(sourceVertexLabel);
-        this.destinationVertexLabel = Objects.requireNonNull(destinationVertexLabel);
         this.sourceKeyFieldNames = Objects.requireNonNull(sourceKeyFieldNames);
         this.destinationKeyFieldNames = Objects.requireNonNull(destKeyFieldNames);
         this.definitionBody = Objects.requireNonNull(definitionBody);
@@ -82,11 +80,11 @@
     }
 
     public ElementLabel getDestinationLabel() {
-        return destinationVertexLabel;
+        return identifier.getDestinationLabel();
     }
 
     public ElementLabel getSourceLabel() {
-        return sourceVertexLabel;
+        return identifier.getSourceLabel();
     }
 
     public List<List<String>> getSourceKeyFieldNames() {
@@ -98,13 +96,13 @@
     }
 
     @Override
-    public GraphElementIdentifier getIdentifier() {
+    public EdgeIdentifier getIdentifier() {
         return identifier;
     }
 
     @Override
     public ElementLabel getLabel() {
-        return identifier.getElementLabel();
+        return identifier.getEdgeLabel();
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/IElement.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/IElement.java
index 3637a45..0e38e92 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/IElement.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/IElement.java
@@ -20,17 +20,17 @@
 
 import java.io.Serializable;
 
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.IElementIdentifier;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
 
 /**
  * Metadata interface for a graph element (i.e. edge or vertex). An element has the following:
- * 1. A {@link GraphElementIdentifier}, to uniquely identify the element across other graph elements.
- * 2. A {@link ElementLabel} unique amongst the element classes (e.g. an edge label is unique amongst all graph edges).
+ * 1. A {@link Serializable}, to uniquely identify the element across other graph elements.
+ * 2. A {@link ElementLabel} unique amongst the element classes.
  * 3. A non-null SQL++ string, representing a graph element body.
  */
 public interface IElement extends Serializable {
-    GraphElementIdentifier getIdentifier();
+    IElementIdentifier getIdentifier();
 
     ElementLabel getLabel();
 
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Schema.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Schema.java
index d19590f..c2f9e54 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Schema.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Schema.java
@@ -18,23 +18,26 @@
  */
 package org.apache.asterix.graphix.metadata.entity.schema;
 
-import static org.apache.asterix.graphix.common.metadata.GraphElementIdentifier.Kind.EDGE;
-import static org.apache.asterix.graphix.common.metadata.GraphElementIdentifier.Kind.VERTEX;
-
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.EdgeIdentifier;
 import org.apache.asterix.graphix.common.metadata.GraphIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
 
 /**
  * Metadata representation of a graph schema. A graph schema consists of:
- * 1. A list of {@link Vertex} instances.
- * 2. A list of {@link Edge} instances, which link the aforementioned vertices.
+ * <ul>
+ *  <li>A list of {@link Vertex} instances.</li>
+ *  <li>A list of {@link Edge} instances, which link the aforementioned vertices.</li>
+ * </ul>
  */
 public class Schema implements Serializable {
     private static final long serialVersionUID = 1L;
@@ -59,7 +62,7 @@
 
     public static class Builder {
         private final Map<ElementLabel, Vertex> vertexLabelMap = new HashMap<>();
-        private final Map<ElementLabel, List<Edge>> edgeLabelMap = new HashMap<>();
+        private final Map<EdgeLabel, List<Edge>> edgeLabelMap = new HashMap<>();
 
         // We aim to populate the schema object below.
         private final Schema workingSchema;
@@ -74,12 +77,12 @@
         /**
          * @return Null if a vertex with the same label already exists. The vertex to-be-added otherwise.
          */
-        public Vertex addVertex(ElementLabel vertexLabel, List<List<String>> primaryKeyFieldNames, String definition) {
-            if (!vertexLabelMap.containsKey(vertexLabel)) {
-                GraphElementIdentifier identifier = new GraphElementIdentifier(graphIdentifier, VERTEX, vertexLabel);
+        public Vertex addVertex(ElementLabel elementLabel, List<List<String>> primaryKeyFieldNames, String definition) {
+            if (!vertexLabelMap.containsKey(elementLabel)) {
+                VertexIdentifier identifier = new VertexIdentifier(graphIdentifier, elementLabel);
                 Vertex newVertex = new Vertex(identifier, primaryKeyFieldNames, definition);
                 workingSchema.vertexList.add(newVertex);
-                vertexLabelMap.put(vertexLabel, newVertex);
+                vertexLabelMap.put(elementLabel, newVertex);
                 return newVertex;
 
             } else {
@@ -102,22 +105,27 @@
             } else if (!vertexLabelMap.containsKey(destinationLabel)) {
                 lastError = Error.DESTINATION_VERTEX_NOT_FOUND;
                 return null;
+            }
 
-            } else if (edgeLabelMap.containsKey(edgeLabel)) {
+            // Ensure we have unique <source, edge, dest> triples.
+            EdgeLabel edgePatternLabel = new EdgeLabel();
+            edgePatternLabel.endpointLabels.add(sourceLabel);
+            edgePatternLabel.endpointLabels.add(destinationLabel);
+            edgePatternLabel.edgeLabel = edgeLabel;
+            if (edgeLabelMap.containsKey(edgePatternLabel)) {
                 lastError = Error.EDGE_LABEL_CONFLICT;
                 return null;
             }
 
             // Update our schema.
-            GraphElementIdentifier identifier = new GraphElementIdentifier(graphIdentifier, EDGE, edgeLabel);
-            Edge newEdge = new Edge(identifier, sourceLabel, destinationLabel, sourceKeyFieldNames,
-                    destinationKeyFieldNames, definitionBody);
+            EdgeIdentifier identifier = new EdgeIdentifier(graphIdentifier, sourceLabel, edgeLabel, destinationLabel);
+            Edge newEdge = new Edge(identifier, sourceKeyFieldNames, destinationKeyFieldNames, definitionBody);
             workingSchema.edgeList.add(newEdge);
 
             // Update our edge label map.
             ArrayList<Edge> edgeList = new ArrayList<>();
             edgeList.add(newEdge);
-            edgeLabelMap.put(edgeLabel, edgeList);
+            edgeLabelMap.put(edgePatternLabel, edgeList);
             return newEdge;
         }
 
@@ -137,4 +145,27 @@
             DESTINATION_VERTEX_NOT_FOUND
         }
     }
+
+    private static class EdgeLabel {
+        public Set<ElementLabel> endpointLabels = new HashSet<>();
+        public ElementLabel edgeLabel = null;
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(edgeLabel, endpointLabels);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o instanceof EdgeLabel) {
+                EdgeLabel that = (EdgeLabel) o;
+                return Objects.equals(this.endpointLabels, that.endpointLabels)
+                        && Objects.equals(this.edgeLabel, that.edgeLabel);
+            }
+            return false;
+        }
+    }
 }
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Vertex.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Vertex.java
index dd4a21e..e25df84 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Vertex.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entity/schema/Vertex.java
@@ -21,26 +21,28 @@
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.VertexIdentifier;
 import org.apache.asterix.graphix.lang.struct.ElementLabel;
 
 /**
  * Metadata representation of a vertex. A vertex consists of the following:
- * 1. A {@link GraphElementIdentifier}, to uniquely identify the vertex across other graph elements.
- * 2. A list of primary key fields, associated with the definition body.
- * 3. A SQL++ string denoting the definition body.
+ * <ul>
+ *  <li>A {@link VertexIdentifier}, to uniquely identify the vertex across other graph elements.</li>
+ *  <li>A list of primary key fields, associated with the definition body.</li>
+ *  <li>A SQL++ string denoting the definition body.</li>
+ * </ul>
  */
 public class Vertex implements IElement {
     private static final long serialVersionUID = 1L;
 
-    private final GraphElementIdentifier identifier;
+    private final VertexIdentifier identifier;
     private final List<List<String>> primaryKeyFieldNames;
     private final String definitionBody;
 
     /**
      * Use {@link Schema.Builder} to build Vertex instances instead of this constructor.
      */
-    Vertex(GraphElementIdentifier identifier, List<List<String>> primaryKeyFieldNames, String definitionBody) {
+    Vertex(VertexIdentifier identifier, List<List<String>> primaryKeyFieldNames, String definitionBody) {
         this.identifier = Objects.requireNonNull(identifier);
         this.primaryKeyFieldNames = primaryKeyFieldNames;
         this.definitionBody = Objects.requireNonNull(definitionBody);
@@ -51,13 +53,13 @@
     }
 
     @Override
-    public GraphElementIdentifier getIdentifier() {
+    public VertexIdentifier getIdentifier() {
         return identifier;
     }
 
     @Override
     public ElementLabel getLabel() {
-        return identifier.getElementLabel();
+        return identifier.getVertexLabel();
     }
 
     @Override
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entitytupletranslators/GraphTupleTranslator.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entitytupletranslators/GraphTupleTranslator.java
index 446ae27..fef8772 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entitytupletranslators/GraphTupleTranslator.java
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/metadata/entitytupletranslators/GraphTupleTranslator.java
@@ -126,7 +126,7 @@
 
             // Read in the label name.
             IAObject labelNameObj = VERTEX_RECORD_DETAIL.getObjectForField(vertex, FIELD_NAME_LABEL);
-            ElementLabel vertexLabel = new ElementLabel(((AString) labelNameObj).getStringValue());
+            ElementLabel elementLabel = new ElementLabel(((AString) labelNameObj).getStringValue(), false);
 
             // Read in the primary key fields.
             List<List<String>> primaryKeyFields = new ArrayList<>();
@@ -142,14 +142,14 @@
             String definitionBody = ((AString) bodyObj).getStringValue();
 
             // Read in the vertex definition, and perform validation of the metadata record.
-            schemaBuilder.addVertex(vertexLabel, primaryKeyFields, definitionBody);
+            schemaBuilder.addVertex(elementLabel, primaryKeyFields, definitionBody);
             switch (schemaBuilder.getLastError()) {
                 case NO_ERROR:
                     break;
 
                 case VERTEX_LABEL_CONFLICT:
                     throw new AsterixException(ErrorCode.METADATA_ERROR,
-                            "Conflicting vertex label found: " + vertexLabel);
+                            "Conflicting vertex label found: " + elementLabel);
 
                 default:
                     throw new AsterixException(ErrorCode.METADATA_ERROR,
@@ -165,15 +165,16 @@
 
             // Read in the label name.
             IAObject labelNameObj = EDGE_RECORD_DETAIL.getObjectForField(edge, FIELD_NAME_LABEL);
-            ElementLabel edgeLabel = new ElementLabel(((AString) labelNameObj).getStringValue());
+            ElementLabel edgeLabel = new ElementLabel(((AString) labelNameObj).getStringValue(), false);
 
             // Read in the destination label name.
             IAObject destinationLabelNameObj = EDGE_RECORD_DETAIL.getObjectForField(edge, FIELD_NAME_DESTINATION_LABEL);
-            ElementLabel destinationLabel = new ElementLabel(((AString) destinationLabelNameObj).getStringValue());
+            AString destinationLabelString = (AString) destinationLabelNameObj;
+            ElementLabel destinationLabel = new ElementLabel(destinationLabelString.getStringValue(), false);
 
             // Read in the source label name.
             IAObject sourceLabelNameObj = EDGE_RECORD_DETAIL.getObjectForField(edge, FIELD_NAME_SOURCE_LABEL);
-            ElementLabel sourceLabel = new ElementLabel(((AString) sourceLabelNameObj).getStringValue());
+            ElementLabel sourceLabel = new ElementLabel(((AString) sourceLabelNameObj).getStringValue(), false);
 
             // Read in the source key fields.
             List<List<String>> sourceKeyFields = new ArrayList<>();
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/AppendInternalPathDescriptor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/AppendInternalPathDescriptor.java
new file mode 100644
index 0000000..5b07204
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/AppendInternalPathDescriptor.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.evaluator;
+
+import static org.apache.asterix.graphix.runtime.pointable.InternalPathPointable.HEADER_EDGE_LIST_END;
+import static org.apache.asterix.graphix.runtime.pointable.InternalPathPointable.HEADER_VERTEX_LIST_END;
+import static org.apache.asterix.graphix.runtime.pointable.InternalPathPointable.PATH_HEADER_LENGTH;
+import static org.apache.asterix.graphix.runtime.pointable.InternalPathPointable.PATH_SERIALIZED_TYPE_TAG;
+import static org.apache.asterix.graphix.runtime.pointable.SinglyLinkedListPointable.LIST_ITEM_LENGTH_SIZE;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * Given a vertex (our first argument), an edge (our second argument), and an existing path (our third argument), create
+ * a new path that includes our given vertex and edge. This action is append-only, so we do not peer inside the existing
+ * vertex or edge lists.
+ */
+public class AppendInternalPathDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+
+    // We
+    private MaterializeInternalPathCallbackFactory materializeInternalPathCallbackFactory;
+
+    @Override
+    public void setImmutableStates(Object... states) {
+        if (states != null) {
+            materializeInternalPathCallbackFactory = (MaterializeInternalPathCallbackFactory) states[0];
+        }
+    }
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
+                return new IScalarEvaluator() {
+                    private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+                    private final DataOutput dataOutput = resultStorage.getDataOutput();
+
+                    private final IScalarEvaluator arg0Eval = args[0].createScalarEvaluator(ctx);
+                    private final IScalarEvaluator arg1Eval = args[1].createScalarEvaluator(ctx);
+                    private final IScalarEvaluator arg2Eval = args[2].createScalarEvaluator(ctx);
+                    private final IPointable arg0Ptr = new VoidPointable();
+                    private final IPointable arg1Ptr = new VoidPointable();
+                    private final IPointable arg2Ptr = new VoidPointable();
+
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        arg0Eval.evaluate(tuple, arg0Ptr);
+                        arg1Eval.evaluate(tuple, arg1Ptr);
+                        arg2Eval.evaluate(tuple, arg2Ptr);
+                        if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr, arg2Ptr)) {
+                            return;
+                        }
+                        resultStorage.reset();
+
+                        try {
+                            // Build our path header. We start with our type tag.
+                            dataOutput.writeByte(PATH_SERIALIZED_TYPE_TAG);
+
+                            // Write the end offset of our new vertex list.
+                            int oldVertexLocalListEnd = IntegerPointable.getInteger(arg2Ptr.getByteArray(),
+                                    arg2Ptr.getStartOffset() + HEADER_VERTEX_LIST_END);
+                            int vertexItemSize = arg0Ptr.getLength() + LIST_ITEM_LENGTH_SIZE;
+                            dataOutput.writeInt(oldVertexLocalListEnd + vertexItemSize);
+                            //                            materializeInternalPathCallbackFactory
+
+                            // Write the end offset of our new edge list.
+                            int oldEdgeLocalListEnd = IntegerPointable.getInteger(arg2Ptr.getByteArray(),
+                                    arg2Ptr.getStartOffset() + HEADER_EDGE_LIST_END);
+                            int edgeItemSize = arg1Ptr.getLength() + LIST_ITEM_LENGTH_SIZE;
+                            dataOutput.writeInt(oldEdgeLocalListEnd + edgeItemSize);
+
+                            // Copy all of our old vertices.
+                            int oldVertexAbsoluteListStart = arg2Ptr.getStartOffset() + PATH_HEADER_LENGTH;
+                            dataOutput.write(arg2Ptr.getByteArray(), oldVertexAbsoluteListStart,
+                                    (oldVertexLocalListEnd + arg2Ptr.getStartOffset()) - oldVertexAbsoluteListStart);
+
+                            // Copy our new vertex.
+                            dataOutput.writeInt(arg0Ptr.getLength());
+                            dataOutput.write(arg0Ptr.getByteArray(), arg0Ptr.getStartOffset(), arg0Ptr.getLength());
+
+                            // Copy all of our new edges.
+                            int oldEdgeAbsoluteListStart = oldVertexLocalListEnd + arg2Ptr.getStartOffset();
+                            dataOutput.write(arg2Ptr.getByteArray(), oldEdgeAbsoluteListStart,
+                                    (oldEdgeLocalListEnd + arg2Ptr.getStartOffset()) - oldEdgeAbsoluteListStart);
+
+                            // Copy our new edge.
+                            dataOutput.writeInt(arg1Ptr.getLength());
+                            dataOutput.write(arg1Ptr.getByteArray(), arg1Ptr.getStartOffset(), arg1Ptr.getLength());
+
+                        } catch (IOException e) {
+                            throw HyracksDataException.create(e);
+                        }
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return GraphixFunctionIdentifiers.APPEND_INTERNAL_PATH;
+    }
+
+    public static final class MaterializeInternalPathCallbackFactory {
+        //        private Consumer<VoidPointable>
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/CreateInternalPathDescriptor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/CreateInternalPathDescriptor.java
new file mode 100644
index 0000000..08f9c78
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/CreateInternalPathDescriptor.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.evaluator;
+
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.graphix.runtime.pointable.InternalPathPointable;
+import org.apache.asterix.graphix.runtime.pointable.SinglyLinkedListPointable;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * Create an initial path, which will consist of a single vertex (our argument) and zero edges.
+ */
+public class CreateInternalPathDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
+                return new IScalarEvaluator() {
+                    private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+                    private final DataOutput dataOutput = resultStorage.getDataOutput();
+                    private final IScalarEvaluator arg0Eval = args[0].createScalarEvaluator(ctx);
+                    private final IPointable arg0Ptr = new VoidPointable();
+
+                    @Override
+                    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+                        arg0Eval.evaluate(tuple, arg0Ptr);
+                        if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr)) {
+                            return;
+                        }
+                        resultStorage.reset();
+
+                        try {
+                            // Build our path header. We start with our type tag.
+                            dataOutput.writeByte(InternalPathPointable.PATH_SERIALIZED_TYPE_TAG);
+
+                            // Write the size of our vertex as a list item twice (to indicate we have no edges).
+                            int vertexItemSize = arg0Ptr.getLength() + SinglyLinkedListPointable.LIST_ITEM_LENGTH_SIZE;
+                            int startOfEdgeList = vertexItemSize + InternalPathPointable.PATH_HEADER_LENGTH;
+                            dataOutput.writeInt(startOfEdgeList);
+                            dataOutput.writeInt(startOfEdgeList);
+
+                            // Write our vertex item (size + the item itself).
+                            dataOutput.writeInt(vertexItemSize);
+                            dataOutput.write(arg0Ptr.getByteArray(), arg0Ptr.getStartOffset(), arg0Ptr.getLength());
+
+                        } catch (IOException e) {
+                            throw HyracksDataException.create(e);
+                        }
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return GraphixFunctionIdentifiers.CREATE_INTERNAL_PATH;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEdgeDescriptor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEdgeDescriptor.java
new file mode 100644
index 0000000..9c03938
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEdgeDescriptor.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.evaluator;
+
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.graphix.runtime.evaluator.common.AbstractElementCompareEvaluator;
+import org.apache.asterix.graphix.runtime.pointable.InternalPathPointable;
+import org.apache.asterix.graphix.runtime.pointable.SinglyLinkedListPointable;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * For a given tuple (edge, path) pair, return true if there are no duplicate edges in the given path (and false
+ * otherwise). This function is used internally to enforce no-repeated-edge navigation semantics.
+ */
+public class IsDistinctEdgeDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractElementCompareEvaluator() {
+                    private final IScalarEvaluator arg0Eval = args[0].createScalarEvaluator(ctx);
+                    private final IScalarEvaluator arg1Eval = args[1].createScalarEvaluator(ctx);
+                    private final IPointable arg0Ptr = new VoidPointable();
+                    private final IPointable arg1Ptr = new VoidPointable();
+
+                    @Override
+                    protected boolean readTuple(IFrameTupleReference tuple, IPointable result)
+                            throws HyracksDataException {
+                        arg0Eval.evaluate(tuple, arg0Ptr);
+                        arg1Eval.evaluate(tuple, arg1Ptr);
+
+                        // If our edge or path is NULL or MISSING, then our result is NULL / MISSING.
+                        if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr)) {
+                            return false;
+                        }
+
+                        // Ensure that we have a path (i.e. bit-array) as our second argument.
+                        byte typeTagByte = arg1Ptr.getByteArray()[arg1Ptr.getStartOffset()];
+                        if (typeTagByte != InternalPathPointable.PATH_SERIALIZED_TYPE_TAG) {
+                            throw new TypeMismatchException(sourceLoc, getIdentifier(), 1, typeTagByte,
+                                    InternalPathPointable.PATH_SERIALIZED_TYPE_TAG);
+                        }
+
+                        edgeListItemCallback.getInputItemPtr().set(arg0Ptr);
+                        pathPtr.set(arg1Ptr);
+                        return true;
+                    }
+
+                    @Override
+                    protected boolean compare() {
+                        SinglyLinkedListPointable<Boolean> edgeListPointable = pathPtr.getEdgeListPointable();
+                        while (edgeListPointable.hasNext()) {
+                            if (edgeListPointable.next()) {
+                                return true;
+                            }
+                        }
+                        return false;
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return GraphixFunctionIdentifiers.IS_DISTINCT_EDGE;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEverythingDescriptor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEverythingDescriptor.java
new file mode 100644
index 0000000..b3dda6e
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctEverythingDescriptor.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.evaluator;
+
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.graphix.runtime.evaluator.common.AbstractElementCompareEvaluator;
+import org.apache.asterix.graphix.runtime.pointable.InternalPathPointable;
+import org.apache.asterix.graphix.runtime.pointable.SinglyLinkedListPointable;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * For a given tuple (vertex, edge, path) triple, return true if there are no duplicate vertices or edges in the given
+ * path (and false otherwise). This function is used internally to enforce no-repeated-everything navigation semantics.
+ */
+public class IsDistinctEverythingDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractElementCompareEvaluator() {
+                    private final IScalarEvaluator arg0Eval = args[0].createScalarEvaluator(ctx);
+                    private final IScalarEvaluator arg1Eval = args[1].createScalarEvaluator(ctx);
+                    private final IScalarEvaluator arg2Eval = args[2].createScalarEvaluator(ctx);
+                    private final IPointable arg0Ptr = new VoidPointable();
+                    private final IPointable arg1Ptr = new VoidPointable();
+                    private final IPointable arg2Ptr = new VoidPointable();
+
+                    @Override
+                    protected boolean readTuple(IFrameTupleReference tuple, IPointable result)
+                            throws HyracksDataException {
+                        arg0Eval.evaluate(tuple, arg0Ptr);
+                        arg1Eval.evaluate(tuple, arg1Ptr);
+                        arg2Eval.evaluate(tuple, arg2Ptr);
+
+                        // If our edge, vertex, or path is NULL or MISSING, then our result is NULL / MISSING.
+                        if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr, arg2Ptr)) {
+                            return false;
+                        }
+
+                        // Ensure that we have a path (i.e. bit-array) as our third argument.
+                        byte typeTagByte = arg2Ptr.getByteArray()[arg2Ptr.getStartOffset()];
+                        if (typeTagByte != InternalPathPointable.PATH_SERIALIZED_TYPE_TAG) {
+                            throw new TypeMismatchException(sourceLoc, getIdentifier(), 2, typeTagByte,
+                                    InternalPathPointable.PATH_SERIALIZED_TYPE_TAG);
+                        }
+
+                        vertexListItemCallback.getInputItemPtr().set(arg0Ptr);
+                        edgeListItemCallback.getInputItemPtr().set(arg1Ptr);
+                        pathPtr.set(arg2Ptr);
+                        return true;
+                    }
+
+                    @Override
+                    protected boolean compare() {
+                        SinglyLinkedListPointable<Boolean> vertexListPointable = pathPtr.getVertexListPointable();
+                        SinglyLinkedListPointable<Boolean> edgeListPointable = pathPtr.getEdgeListPointable();
+                        while (vertexListPointable.hasNext()) {
+                            if (vertexListPointable.next()) {
+                                return true;
+                            }
+                        }
+                        while (edgeListPointable.hasNext()) {
+                            if (edgeListPointable.next()) {
+                                return true;
+                            }
+                        }
+                        return false;
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return GraphixFunctionIdentifiers.IS_DISTINCT_EVERYTHING;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctVertexDescriptor.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctVertexDescriptor.java
new file mode 100644
index 0000000..160837e
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/IsDistinctVertexDescriptor.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.evaluator;
+
+import org.apache.asterix.graphix.function.GraphixFunctionIdentifiers;
+import org.apache.asterix.graphix.runtime.evaluator.common.AbstractElementCompareEvaluator;
+import org.apache.asterix.graphix.runtime.pointable.InternalPathPointable;
+import org.apache.asterix.graphix.runtime.pointable.SinglyLinkedListPointable;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.PointableHelper;
+import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+/**
+ * For a given tuple (vertex, path) pair, return true if there are no duplicate vertices in the given path (and false
+ * otherwise). This function is used internally to enforce no-repeated-vertex navigation semantics.
+ */
+public class IsDistinctVertexDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException {
+                return new AbstractElementCompareEvaluator() {
+                    private final IScalarEvaluator arg0Eval = args[0].createScalarEvaluator(ctx);
+                    private final IScalarEvaluator arg1Eval = args[1].createScalarEvaluator(ctx);
+                    private final IPointable arg0Ptr = new VoidPointable();
+                    private final IPointable arg1Ptr = new VoidPointable();
+
+                    @Override
+                    protected boolean readTuple(IFrameTupleReference tuple, IPointable result)
+                            throws HyracksDataException {
+                        arg0Eval.evaluate(tuple, arg0Ptr);
+                        arg1Eval.evaluate(tuple, arg1Ptr);
+
+                        // If our vertex or path is NULL or MISSING, then our result is NULL / MISSING.
+                        if (PointableHelper.checkAndSetMissingOrNull(result, arg0Ptr, arg1Ptr)) {
+                            return false;
+                        }
+
+                        // Ensure that we have a path (i.e. bit-array) as our second argument.
+                        byte typeTagByte = arg1Ptr.getByteArray()[arg1Ptr.getStartOffset()];
+                        if (typeTagByte != InternalPathPointable.PATH_SERIALIZED_TYPE_TAG) {
+                            throw new TypeMismatchException(sourceLoc, getIdentifier(), 1, typeTagByte,
+                                    InternalPathPointable.PATH_SERIALIZED_TYPE_TAG);
+                        }
+
+                        vertexListItemCallback.getInputItemPtr().set(arg0Ptr);
+                        pathPtr.set(arg1Ptr);
+                        return true;
+                    }
+
+                    @Override
+                    protected boolean compare() {
+                        SinglyLinkedListPointable<Boolean> vertexListPointable = pathPtr.getVertexListPointable();
+                        while (vertexListPointable.hasNext()) {
+                            if (vertexListPointable.next()) {
+                                return true;
+                            }
+                        }
+                        return false;
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return GraphixFunctionIdentifiers.IS_DISTINCT_VERTEX;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/common/AbstractElementCompareEvaluator.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/common/AbstractElementCompareEvaluator.java
new file mode 100644
index 0000000..7185b16
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/evaluator/common/AbstractElementCompareEvaluator.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.evaluator.common;
+
+import java.io.DataOutput;
+import java.util.function.Function;
+
+import org.apache.asterix.dataflow.data.nontagged.serde.AObjectSerializerDeserializer;
+import org.apache.asterix.graphix.runtime.pointable.InternalPathPointable;
+import org.apache.asterix.om.base.ABoolean;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.data.std.util.DataUtils;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+public abstract class AbstractElementCompareEvaluator implements IScalarEvaluator {
+    protected final AObjectSerializerDeserializer serde = AObjectSerializerDeserializer.INSTANCE;
+    protected final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
+    protected final DataOutput dataOutput = resultStorage.getDataOutput();
+
+    protected final ListItemCompareCallback vertexListItemCallback = new ListItemCompareCallback();
+    protected final ListItemCompareCallback edgeListItemCallback = new ListItemCompareCallback();
+    protected final InternalPathPointable<Boolean> pathPtr =
+            new InternalPathPointable<>(vertexListItemCallback, edgeListItemCallback);
+
+    @Override
+    public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
+        if (!readTuple(tuple, result)) {
+            return;
+        }
+
+        if (compare()) {
+            // We have found a duplicate item. Exit and return false.
+            resultStorage.reset();
+            serde.serialize(ABoolean.FALSE, dataOutput);
+            result.set(resultStorage);
+        }
+
+        // No duplicate items have been found. Return true.
+        resultStorage.reset();
+        serde.serialize(ABoolean.TRUE, dataOutput);
+        result.set(resultStorage);
+    }
+
+    /**
+     * @return True if we should proceed (and result has been set). False otherwise.
+     */
+    protected abstract boolean readTuple(IFrameTupleReference tuple, IPointable result) throws HyracksDataException;
+
+    protected abstract boolean compare() throws HyracksDataException;
+
+    // We treat vertices / edges as black-boxes, we do not know their contents. We compare blindly.
+    public static final class ListItemCompareCallback implements Function<VoidPointable, Boolean> {
+        private final VoidPointable inputItemPtr = new VoidPointable();
+
+        public VoidPointable getInputItemPtr() {
+            return inputItemPtr;
+        }
+
+        @Override
+        public Boolean apply(VoidPointable listItemPtr) {
+            return DataUtils.equals(inputItemPtr, listItemPtr);
+        }
+    }
+
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/function/GraphixFunctionInfoCollection.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/function/GraphixFunctionInfoCollection.java
new file mode 100644
index 0000000..acdaf26
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/function/GraphixFunctionInfoCollection.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.function;
+
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.APPEND_INTERNAL_PATH;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.CREATE_INTERNAL_PATH;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.IS_DISTINCT_EDGE;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.IS_DISTINCT_EVERYTHING;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.IS_DISTINCT_VERTEX;
+import static org.apache.asterix.graphix.function.GraphixFunctionIdentifiers.MATERIALIZE_PATH;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.graphix.type.MaterializePathTypeComputer;
+import org.apache.asterix.om.functions.FunctionInfo;
+import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
+import org.apache.asterix.om.typecomputer.impl.ABooleanTypeComputer;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
+
+public class GraphixFunctionInfoCollection {
+    private static final Map<FunctionIdentifier, IFunctionInfo> functionInfoMap = new HashMap<>();
+
+    static {
+        // The following functions yield boolean values.
+        final IResultTypeComputer booleanComputer = ABooleanTypeComputer.INSTANCE_NULLABLE;
+        functionInfoMap.put(IS_DISTINCT_VERTEX, new GraphixFunctionInfo(IS_DISTINCT_VERTEX, booleanComputer));
+        functionInfoMap.put(IS_DISTINCT_EDGE, new GraphixFunctionInfo(IS_DISTINCT_EDGE, booleanComputer));
+        functionInfoMap.put(IS_DISTINCT_EVERYTHING, new GraphixFunctionInfo(IS_DISTINCT_EVERYTHING, booleanComputer));
+
+        // The following functions yield raw path values (we hijack the bitarray type here).
+        final IResultTypeComputer rawPathComputer = new AbstractResultTypeComputer() {
+            @Override
+            protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) {
+                return BuiltinType.ABITARRAY;
+            }
+        };
+        functionInfoMap.put(CREATE_INTERNAL_PATH, new GraphixFunctionInfo(CREATE_INTERNAL_PATH, rawPathComputer));
+        functionInfoMap.put(APPEND_INTERNAL_PATH, new GraphixFunctionInfo(APPEND_INTERNAL_PATH, rawPathComputer));
+
+        // The following function yields a closed record value.
+        final IResultTypeComputer pathComputer = MaterializePathTypeComputer.INSTANCE;
+        functionInfoMap.put(MATERIALIZE_PATH, new GraphixFunctionInfo(MATERIALIZE_PATH, pathComputer));
+    }
+
+    public static IFunctionInfo getFunctionInfo(FunctionIdentifier functionIdentifier) {
+        return functionInfoMap.get(functionIdentifier);
+    }
+
+    public static class GraphixFunctionInfo extends FunctionInfo {
+        private static final long serialVersionUID = 1L;
+
+        public GraphixFunctionInfo(FunctionIdentifier functionIdentifier, IResultTypeComputer typeComputer) {
+            // We only have functional functions.
+            super(functionIdentifier, typeComputer, true);
+        }
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/function/GraphixFunctionRegistrant.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/function/GraphixFunctionRegistrant.java
new file mode 100644
index 0000000..983165b
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/function/GraphixFunctionRegistrant.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.function;
+
+import org.apache.asterix.graphix.runtime.evaluator.AppendInternalPathDescriptor;
+import org.apache.asterix.graphix.runtime.evaluator.CreateInternalPathDescriptor;
+import org.apache.asterix.graphix.runtime.evaluator.IsDistinctEdgeDescriptor;
+import org.apache.asterix.graphix.runtime.evaluator.IsDistinctEverythingDescriptor;
+import org.apache.asterix.graphix.runtime.evaluator.IsDistinctVertexDescriptor;
+import org.apache.asterix.om.functions.IFunctionCollection;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionRegistrant;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+
+public class GraphixFunctionRegistrant implements IFunctionRegistrant {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public void register(IFunctionCollection fc) {
+        fc.add(IsDistinctVertexDescriptor::new);
+        fc.add(IsDistinctEdgeDescriptor::new);
+        fc.add(IsDistinctEverythingDescriptor::new);
+        fc.add(CreateInternalPathDescriptor::new);
+
+        // We have a callback-factory we need to pass to our APPEND-INTERNAL-PATH evaluator-factory.
+        fc.add(new IFunctionDescriptorFactory() {
+            @Override
+            public IFunctionTypeInferer createFunctionTypeInferer() {
+                return (expr, fd, context, compilerProps) -> {
+                    AbstractFunctionCallExpression funcCallExpr = (AbstractFunctionCallExpression) expr;
+                    fd.setImmutableStates(funcCallExpr.getOpaqueParameters()[0]);
+                };
+            }
+
+            @Override
+            public IFunctionDescriptor createFunctionDescriptor() {
+                return new AppendInternalPathDescriptor();
+            }
+        });
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/pointable/InternalPathPointable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/pointable/InternalPathPointable.java
new file mode 100644
index 0000000..2fcf96c
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/pointable/InternalPathPointable.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.pointable;
+
+import java.util.function.Function;
+
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.hyracks.data.std.api.AbstractPointable;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+
+/**
+ * A path consists of a header, a list of vertices, and a list of edges.
+ * <p>
+ * <ol>
+ * <li>A path header consists of 9 bytes, and is formatted as such:
+ *  <pre>
+ *    [bit-array type tag]      -- 1 byte
+ *    [vertex-list end offset]  -- 4 bytes
+ *    [edge-list end offset]    -- 4 bytes
+ *  </pre></li>
+ *  <li>A path's list of vertices starts at 8 bytes and ends at [vertex-list end offset] bytes.</li>
+ *  <li>A path's list of edges starts at [vertex-list end offset] bytes and ends at [edge-list end offset] bytes. All
+ *  offsets are given from the start of the path itself (not absolute, from the containing byte array).</li>
+ * </ol>
+ */
+public class InternalPathPointable<T> extends AbstractPointable {
+    public static final int HEADER_VERTEX_LIST_END = 1;
+    public static final int HEADER_EDGE_LIST_END = 5;
+    public static final int PATH_HEADER_LENGTH = 9;
+
+    // TODO (GLENN): Create a custom type tag specifically for extensions.
+    public static final byte PATH_SERIALIZED_TYPE_TAG = ATypeTag.BITARRAY.serialize();
+
+    // We will set the following on invocation of our "set".
+    private final SinglyLinkedListPointable<T> edgeListPointable;
+    private final SinglyLinkedListPointable<T> vertexListPointable;
+
+    public InternalPathPointable(Function<VoidPointable, T> vertexListItemCallback,
+            Function<VoidPointable, T> edgeListItemCallback) {
+        this.vertexListPointable = new SinglyLinkedListPointable<>(vertexListItemCallback);
+        this.edgeListPointable = new SinglyLinkedListPointable<>(edgeListItemCallback);
+    }
+
+    @Override
+    public void set(byte[] bytes, int start, int length) {
+        int absoluteStartOfVertices = start + PATH_HEADER_LENGTH;
+        int localEndOfVertices = IntegerPointable.getInteger(bytes, start + HEADER_VERTEX_LIST_END);
+        int localEndOfEdges = IntegerPointable.getInteger(bytes, start + HEADER_EDGE_LIST_END);
+        int absoluteEndOfVertices = start + localEndOfVertices;
+        int absoluteEndOfEdges = start + localEndOfEdges;
+        vertexListPointable.set(bytes, absoluteStartOfVertices, absoluteEndOfVertices - absoluteStartOfVertices);
+        edgeListPointable.set(bytes, absoluteEndOfVertices, absoluteEndOfEdges - absoluteEndOfVertices);
+        super.set(bytes, start, length);
+    }
+
+    public SinglyLinkedListPointable<T> getEdgeListPointable() {
+        return edgeListPointable;
+    }
+
+    public SinglyLinkedListPointable<T> getVertexListPointable() {
+        return vertexListPointable;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/pointable/SinglyLinkedListPointable.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/pointable/SinglyLinkedListPointable.java
new file mode 100644
index 0000000..6ceb0ae
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/runtime/pointable/SinglyLinkedListPointable.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.runtime.pointable;
+
+import java.util.NoSuchElementException;
+import java.util.function.Function;
+
+import org.apache.hyracks.data.std.api.AbstractPointable;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+
+/**
+ * A lean representation of a singly-linked list, where each item in the list only has a 4-byte length. We can only
+ * access this SLL from start to finish, as we do not know the size of each item (nor the number of items) apriori.
+ */
+public class SinglyLinkedListPointable<T> extends AbstractPointable {
+    public static final int LIST_ITEM_LENGTH_SIZE = 4;
+
+    private final Function<VoidPointable, T> listItemConsumer;
+    private final VoidPointable listItemPointable;
+
+    // This is a **stateful** pointable, whose action is dictated by the given list-item callback.
+    private int currentPosition;
+
+    public SinglyLinkedListPointable(Function<VoidPointable, T> listItemConsumer) {
+        this.listItemPointable = new VoidPointable();
+        this.listItemConsumer = listItemConsumer;
+    }
+
+    @Override
+    public void set(byte[] bytes, int start, int length) {
+        super.set(bytes, start, length);
+        currentPosition = 0;
+    }
+
+    public boolean hasNext() {
+        return currentPosition < length;
+    }
+
+    public T next() {
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+
+        // Determine the length of our working item.
+        int itemLength = IntegerPointable.getInteger(bytes, start + currentPosition);
+        currentPosition = currentPosition + LIST_ITEM_LENGTH_SIZE;
+
+        // Consume our list item.
+        listItemPointable.set(bytes, currentPosition, itemLength);
+        T result = listItemConsumer.apply(listItemPointable);
+
+        // Advance our cursor.
+        currentPosition = currentPosition + itemLength;
+        return result;
+    }
+}
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/type/MaterializePathTypeComputer.java b/asterix-graphix/src/main/java/org/apache/asterix/graphix/type/MaterializePathTypeComputer.java
new file mode 100644
index 0000000..52e3be5
--- /dev/null
+++ b/asterix-graphix/src/main/java/org/apache/asterix/graphix/type/MaterializePathTypeComputer.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.graphix.type;
+
+import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
+import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+
+public class MaterializePathTypeComputer extends AbstractResultTypeComputer {
+    public static final String VERTICES_FIELD_NAME = "Vertices";
+    public static final String EDGES_FIELD_NAME = "Edges";
+    public static final ARecordType TYPE;
+    static {
+        String typeName = "materializedPathType";
+        String[] fieldNames = new String[] { VERTICES_FIELD_NAME, EDGES_FIELD_NAME };
+        AOrderedListType listType = new AOrderedListType(RecordUtil.FULLY_OPEN_RECORD_TYPE, null);
+        TYPE = new ARecordType(typeName, fieldNames, new IAType[] { listType, listType }, false);
+    }
+
+    // Our type computer will always return the type above (while respecting NULL/MISSING IN -> OUT semantics).
+    public static final IResultTypeComputer INSTANCE = new MaterializePathTypeComputer();
+
+    @Override
+    protected IAType getResultType(ILogicalExpression expr, IAType... strippedInputTypes) {
+        return TYPE;
+    }
+}
diff --git a/asterix-graphix/src/main/resources/META-INF/services/org.apache.asterix.om.functions.IFunctionRegistrant b/asterix-graphix/src/main/resources/META-INF/services/org.apache.asterix.om.functions.IFunctionRegistrant
new file mode 100644
index 0000000..5ee5a83
--- /dev/null
+++ b/asterix-graphix/src/main/resources/META-INF/services/org.apache.asterix.om.functions.IFunctionRegistrant
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+org.apache.asterix.graphix.runtime.function.GraphixFunctionRegistrant
\ No newline at end of file
diff --git a/asterix-graphix/src/main/resources/cc.conf b/asterix-graphix/src/main/resources/cc.conf
index ae068ca..968c07c 100644
--- a/asterix-graphix/src/main/resources/cc.conf
+++ b/asterix-graphix/src/main/resources/cc.conf
@@ -32,7 +32,13 @@
 log.level=INFO
 
 [extension/org.apache.asterix.graphix.extension.GraphixQueryTranslatorExtension]
-enabled=true
+graphix.evaluation.default=expand-and-union
+graphix.semantics.pattern=isomorphism
+graphix.semantics.navigation=no-repeat-anything
+graphix.schema-decorate.vertex=as-needed
+graphix.schema-decorate.edge=as-needed
+
+; We use dummy keys for the extension sections below.
 [extension/org.apache.asterix.graphix.extension.GraphixLangExtension]
 enabled=true
 [extension/org.apache.asterix.graphix.extension.GraphixMetadataExtension]
diff --git a/asterix-graphix/src/main/resources/lang-extension/lang.txt b/asterix-graphix/src/main/resources/lang-extension/lang.txt
index 99952bf..ca7aa66 100644
--- a/asterix-graphix/src/main/resources/lang-extension/lang.txt
+++ b/asterix-graphix/src/main/resources/lang-extension/lang.txt
@@ -18,17 +18,19 @@
 //
 
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
-import org.apache.asterix.graphix.common.metadata.GraphElementIdentifier;
+import org.apache.asterix.graphix.common.metadata.IElementIdentifier;
+import org.apache.asterix.graphix.lang.annotation.ElementEvaluationAnnotation;
 import org.apache.asterix.graphix.lang.clause.FromGraphClause;
-import org.apache.asterix.graphix.lang.clause.GraphSelectBlock;
 import org.apache.asterix.graphix.lang.clause.MatchClause;
 import org.apache.asterix.graphix.lang.expression.EdgePatternExpr;
 import org.apache.asterix.graphix.lang.expression.GraphConstructor;
 import org.apache.asterix.graphix.lang.expression.PathPatternExpr;
 import org.apache.asterix.graphix.lang.expression.VertexPatternExpr;
 import org.apache.asterix.graphix.lang.optype.MatchType;
+import org.apache.asterix.graphix.lang.parser.GraphixParserHint;
 import org.apache.asterix.graphix.lang.statement.CreateGraphStatement;
 import org.apache.asterix.graphix.lang.statement.DeclareGraphStatement;
 import org.apache.asterix.graphix.lang.statement.GraphDropStatement;
@@ -40,7 +42,7 @@
 import org.apache.asterix.lang.sqlpp.parser.Token;
 
 @new_at_the_class_def
-public GraphElementDeclaration parseGraphElementBody(GraphElementIdentifier identifier) throws CompilationException {
+public GraphElementDeclaration parseGraphElementBody(IElementIdentifier identifier) throws CompilationException {
     return parseImpl(new ParseFunction<GraphElementDeclaration>() {
         @Override
         public GraphElementDeclaration parse() throws ParseException {
@@ -58,6 +60,35 @@
     });
 }
 
+@new_at_the_class_def
+public GraphixParserHint fetchGraphixHint(Token token, GraphixParserHint[] expectedHints) {
+    if (token == null) {
+      return null;
+    }
+    Token hintToken = token.specialToken;
+
+    // We have a hint. Pull this from our collector.
+    if (hintToken == null) {
+      return null;
+    }
+    SourceLocation sourceLoc = getSourceLocation(hintToken);
+    hintCollector.remove(sourceLoc);
+
+    // Check for Graphix hints.
+    if (hintToken.hint != null) {
+        // A Graphix hint is not a SQLPP hint, so we shouldn't get anything in the "hint" field.
+        warnUnexpectedHint(hintToken.hint.getIdentifier(), sourceLoc, StringUtil.join(expectedHints, ", ", "\""));
+
+    } else if (hintToken.hintParams != null) {
+        for (GraphixParserHint graphixHint : expectedHints) {
+            if (graphixHint.getId().equals(hintToken.hintParams)) {
+                return graphixHint;
+            }
+        }
+    }
+    return null;
+}
+
 @override
 SelectBlock SelectBlock() throws ParseException:
 {
@@ -146,8 +177,8 @@
       return selectBlock;
 
     } else {
-      GraphSelectBlock selectBlock = new GraphSelectBlock(selectClause, fromGraphClause,
-        fromLetWhereClauses, groupbyClause, gbyLetHavingClauses);
+      SelectBlock selectBlock = new SelectBlock(selectClause, fromGraphClause, fromLetWhereClauses,
+        groupbyClause, gbyLetHavingClauses);
       selectBlock.setSourceLocation(startSrcLoc);
       return selectBlock;
     }
@@ -389,11 +420,11 @@
   Token beginPos = null, endPos = null;
   int positionOffset = 0;
   Expression vertexDefinitionExpr;
-  ElementLabel vertexLabel;
+  ElementLabel elementLabel;
 }
 {
   <VERTEX>
-  vertexLabel = GraphVertexDefinitionPattern()
+  elementLabel = GraphVertexDefinitionPattern()
   <PRIMARY> <KEY> <LEFTPAREN> primaryKeyFields = KeyFields() <RIGHTPAREN>
   <AS>
   {
@@ -408,7 +439,7 @@
     String vDef = extractFragment(beginPos.beginLine, beginPos.beginColumn + positionOffset, endPos.endLine,
       endPos.endColumn + 1);
     removeCurrentScope();
-    GraphConstructor.VertexConstructor vertexConstructor = new GraphConstructor.VertexConstructor(vertexLabel,
+    GraphConstructor.VertexConstructor vertexConstructor = new GraphConstructor.VertexConstructor(elementLabel,
       primaryKeyFields.second, primaryKeyFields.first, vertexDefinitionExpr, vDef);
     return addSourceLocation(vertexConstructor, startStmtToken);
   }
@@ -422,7 +453,7 @@
 {
   <LEFTPAREN> <COLON> vertexName = Identifier() <RIGHTPAREN>
   {
-    return new ElementLabel(vertexName);
+    return new ElementLabel(vertexName, false);
   }
 }
 
@@ -494,18 +525,18 @@
 @new
 Pair<Triple<ElementLabel, ElementLabel, ElementLabel>, Boolean> GraphEdgeDefinitionPattern() throws ParseException:
 {
-  ElementLabel leftVertexLabel, rightVertexLabel;
+  ElementLabel leftElementLabel, rightElementLabel;
   boolean isDirectedLeft;
   String edgeName;
 }
 {
-  leftVertexLabel = GraphVertexDefinitionPattern()
+  leftElementLabel = GraphVertexDefinitionPattern()
   ( <MINUS> <LEFTBRACKET> <COLON> edgeName = Identifier() <RIGHTBRACKET> <MINUS> <GT> { isDirectedLeft = false; }
   | <LT> <MINUS> <LEFTBRACKET> <COLON> edgeName = Identifier() <RIGHTBRACKET> <MINUS> { isDirectedLeft = true; } )
-  rightVertexLabel = GraphVertexDefinitionPattern()
+  rightElementLabel = GraphVertexDefinitionPattern()
   {
     Triple<ElementLabel, ElementLabel, ElementLabel> t = new Triple<ElementLabel, ElementLabel, ElementLabel>(
-      leftVertexLabel, new ElementLabel(edgeName), rightVertexLabel);
+      leftElementLabel, new ElementLabel(edgeName, false), rightElementLabel);
     return new Pair<Triple<ElementLabel, ElementLabel, ElementLabel>, Boolean>(t, isDirectedLeft);
   }
 }
@@ -603,7 +634,7 @@
 
   Token startToken = null, edgeStartToken = null;
   VertexPatternExpr vertexExpr = null;
-  EdgeDescriptor edgeDescriptor = null;
+  Pair<EdgeDescriptor, List<IExpressionAnnotation>> edgeDescriptorPair = null;
 }
 {
   vertexExpr = VertexPatternExpression()
@@ -612,11 +643,16 @@
     orderedVertexExpressions.add(vertexExpr);
   }
   (
-    edgeDescriptor = EdgeDescriptor() { edgeStartToken = token; }
+    edgeDescriptorPair = EdgeDescriptorPair() { edgeStartToken = token; }
     vertexExpr = VertexPatternExpression()
     {
       VertexPatternExpr leftVertex = orderedVertexExpressions.get(orderedVertexExpressions.size() - 1);
-      EdgePatternExpr edgePattern = new EdgePatternExpr(leftVertex, vertexExpr, edgeDescriptor);
+      EdgePatternExpr edgePattern = new EdgePatternExpr(leftVertex, vertexExpr, edgeDescriptorPair.first);
+      if (!edgeDescriptorPair.second.isEmpty()) {
+        for (IExpressionAnnotation annotation : edgeDescriptorPair.second) {
+          edgePattern.addHint(annotation);
+        }
+      }
       orderedEdgeExpressions.add(addSourceLocation(edgePattern, edgeStartToken));
       orderedVertexExpressions.add(vertexExpr);
     }
@@ -630,33 +666,44 @@
 @new
 VertexPatternExpr VertexPatternExpression() throws ParseException:
 {
-  Set<ElementLabel> vertexLabels = new HashSet<ElementLabel>();
+  Set<String> vertexLabels = new HashSet<String>();
   VariableExpr variableExpr = null;
+  Expression filterExpr = null;
+  boolean isNegatedLabelSet = false;
   Token startToken = null;
   String vertexLabelName;
 }
 {
   <LEFTPAREN> { startToken = token; }
+  ( variableExpr = Variable() )?
   (
-    variableExpr = Variable()
+    <COLON>
+    ( <CARET> { isNegatedLabelSet = true; } )?
+    vertexLabels = ParenthesizedLabelValueSet()
   )?
-  (
-    <COLON> vertexLabelName = Identifier() { vertexLabels.add(new ElementLabel(vertexLabelName)); }
-    ( <BAR> vertexLabelName = Identifier() { vertexLabels.add(new ElementLabel(vertexLabelName)); } )*
-  )?
+  ( <WHERE> filterExpr = Expression() )?
   <RIGHTPAREN>
   {
-    VertexPatternExpr vertexExpression = new VertexPatternExpr(variableExpr, vertexLabels);
+    // Construct our label set.
+    Set<ElementLabel> labels = new HashSet<ElementLabel>();
+    for (String vertexLabelValue : vertexLabels) {
+      labels.add(new ElementLabel(vertexLabelValue, isNegatedLabelSet));
+    }
+    VertexPatternExpr vertexExpression = new VertexPatternExpr(variableExpr, filterExpr, labels);
     return addSourceLocation(vertexExpression, startToken);
   }
 }
 
 @new
-EdgeDescriptor EdgeDescriptor() throws ParseException:
+Pair<EdgeDescriptor, List<IExpressionAnnotation>> EdgeDescriptorPair() throws ParseException:
 {
-  Pair<Set<ElementLabel>, Pair<Integer, Integer>> edgeDetail = null;
-  Token startToken = null;
+  GraphixParserHint[] expectedHints = { GraphixParserHint.EXPAND_AND_UNION_HINT,
+                                        GraphixParserHint.SWITCH_AND_CYCLE_HINT };
+  List<IExpressionAnnotation> hintList = new ArrayList<IExpressionAnnotation>();
+  Triple<Set<ElementLabel>, Pair<Integer, Integer>, Expression> edgeDetail = null;
+  Token startToken = null, hintToken = null;
   VariableExpr edgeVariable = null;
+  Expression filterExpr = null;
 
   // We default to undirected edges.
   EdgeDescriptor.EdgeDirection edgeDirection = EdgeDescriptor.EdgeDirection.UNDIRECTED;
@@ -666,11 +713,9 @@
     <MINUS> { startToken = token; }
     (
       <LEFTBRACKET>
-      (
-        edgeVariable = Variable()
-      )?
-      ( <COLON> edgeDetail = EdgeDetail() )?
-      <RIGHTBRACKET> <MINUS>
+      ( edgeVariable = Variable() )?
+      ( edgeDetail = EdgeDetail() )?
+      <RIGHTBRACKET> { hintToken = token; } <MINUS>
     )?
     ( <GT> { edgeDirection = EdgeDescriptor.EdgeDirection.LEFT_TO_RIGHT; } )?
     |
@@ -681,14 +726,21 @@
     <MINUS>
     (
       <LEFTBRACKET>
-      (
-        edgeVariable = Variable()
-      )?
-      ( <COLON> edgeDetail = EdgeDetail() )?
-      <RIGHTBRACKET> <MINUS>
+      ( edgeVariable = Variable() )?
+      ( edgeDetail = EdgeDetail() )?
+      <RIGHTBRACKET> { hintToken = token; } <MINUS>
     )?
   )
   {
+    // See if we have an evaluation hint.
+    GraphixParserHint evalHint = fetchGraphixHint(hintToken, expectedHints);
+    if (Objects.equals(evalHint, GraphixParserHint.EXPAND_AND_UNION_HINT)) {
+      hintList.add(new ElementEvaluationAnnotation(ElementEvaluationAnnotation.Kind.EXPAND_AND_UNION));
+
+    } else if (Objects.equals(evalHint, GraphixParserHint.SWITCH_AND_CYCLE_HINT)) {
+      hintList.add(new ElementEvaluationAnnotation(ElementEvaluationAnnotation.Kind.SWITCH_AND_CYCLE));
+    }
+
     // Edges (by default) are of pattern type EDGE and are not sub-paths.
     EdgeDescriptor.PatternType patternType = EdgeDescriptor.PatternType.EDGE;
     Integer hopCountMin = 1;
@@ -697,6 +749,7 @@
     Set<ElementLabel> labels = new HashSet<ElementLabel>();
     if (edgeDetail != null) {
       labels = edgeDetail.first;
+      filterExpr = edgeDetail.third;
 
       // We have explicitly specified "{" and "}". Use sub-path semantics.
       if (edgeDetail.second != null) {
@@ -705,42 +758,71 @@
         hopCountMax = edgeDetail.second.second;
       }
     }
-
-    return new EdgeDescriptor(edgeDirection, patternType, labels, edgeVariable, hopCountMin, hopCountMax);
+    EdgeDescriptor edgeDescriptor =
+      new EdgeDescriptor(edgeDirection, patternType, labels, filterExpr, edgeVariable, hopCountMin, hopCountMax);
+    return new Pair<EdgeDescriptor, List<IExpressionAnnotation>>(edgeDescriptor, hintList);
   }
 }
 
 @new
-Pair<Set<ElementLabel>, Pair<Integer, Integer>> EdgeDetail() throws ParseException:
+Triple<Set<ElementLabel>, Pair<Integer, Integer>, Expression> EdgeDetail() throws ParseException:
 {
-  Set<ElementLabel> edgeLabels = new HashSet<ElementLabel>();
+  Set<String> edgeLabels = new HashSet<String>();
   Pair<Integer, Integer> repetitionQuantifier = null;
+  Expression filterExpr = null;
+  boolean isNegatedLabelSet = false;
   String labelName = null;
 }
 {
   (
-    // Note: we want to forbid LABEL_1|LABEL_2{...}.
-    LOOKAHEAD(2, <BAR>)
-    (
-      labelName = Identifier() { edgeLabels.add(new ElementLabel(labelName)); }
-      <BAR> labelName = Identifier() { edgeLabels.add(new ElementLabel(labelName)); }
-      ( <BAR> labelName = Identifier() { edgeLabels.add(new ElementLabel(labelName)); } )*
-    )
-    |
-    (
-      labelName = Identifier() { edgeLabels.add(new ElementLabel(labelName)); }
-      |
-      <LEFTPAREN>
-      labelName = Identifier() { edgeLabels.add(new ElementLabel(labelName)); }
-      ( <BAR> labelName = Identifier() { edgeLabels.add(new ElementLabel(labelName)); } )*
-      <RIGHTPAREN>
-    )
-    ( repetitionQuantifier = EdgeRepetitionQuantifier() )?
-    |
     ( repetitionQuantifier = EdgeRepetitionQuantifier() )
+    |
+    (
+      <COLON>
+      ( <CARET> { isNegatedLabelSet = true; } )?
+      edgeLabels = ParenthesizedLabelValueSet()
+      ( LOOKAHEAD(2)
+        ( <WHERE> filterExpr = Expression() )
+        |
+        ( repetitionQuantifier = EdgeRepetitionQuantifier() )
+      )?
+    )
+    |
+    ( <WHERE> filterExpr = Expression() )
   )
   {
-    return new Pair<Set<ElementLabel>, Pair<Integer, Integer>> (edgeLabels, repetitionQuantifier);
+    // Construct our label set.
+    Set<ElementLabel> labels = new HashSet<ElementLabel>();
+    for (String edgeLabelValue : edgeLabels) {
+      labels.add(new ElementLabel(edgeLabelValue, isNegatedLabelSet));
+    }
+    return new Triple<Set<ElementLabel>, Pair<Integer, Integer>, Expression> (labels, repetitionQuantifier, filterExpr);
+  }
+}
+
+@new
+Set<String> ParenthesizedLabelValueSet() throws ParseException:
+{
+  Set<String> labelSet = new HashSet<String>();
+  Set<String> innerLabelSet = null;
+  String labelName = null;
+}
+{
+  (
+    ( labelName = Identifier() { labelSet.add(labelName); } )
+    |
+    (
+      <LEFTPAREN>
+      innerLabelSet = ParenthesizedLabelValueSet() { labelSet.addAll(innerLabelSet); }
+      (
+        <BAR>
+        innerLabelSet = ParenthesizedLabelValueSet() { labelSet.addAll(innerLabelSet); }
+      )*
+      <RIGHTPAREN>
+    )
+  )
+  {
+    return labelSet;
   }
 }
 
@@ -751,12 +833,17 @@
   Integer hopCountMax = null;
 }
 {
-  <LEFTBRACE>
-  ( // Note: we forbid unbounded edge repetition.
-    ( <INTEGER_LITERAL> { hopCountMin = Integer.valueOf(token.image); } )?
-    <COMMA> <INTEGER_LITERAL> { hopCountMax = Integer.valueOf(token.image); }
+  (
+    <PLUS>
+    |
+    (
+      <LEFTBRACE>
+      ( <INTEGER_LITERAL> { hopCountMin = Integer.valueOf(token.image); } )?
+      <COMMA>
+      ( <INTEGER_LITERAL> { hopCountMax = Integer.valueOf(token.image); } )?
+      <RIGHTBRACE>
+    )
   )
-  <RIGHTBRACE>
   {
     return new Pair<Integer, Integer>(hopCountMin, hopCountMax);
   }
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.1.ddl.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.1.ddl.sqlpp
similarity index 100%
copy from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.1.ddl.sqlpp
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.1.ddl.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.2.update.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.2.update.sqlpp
similarity index 100%
copy from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.2.update.sqlpp
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.2.update.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.3.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.3.query.sqlpp
similarity index 95%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.3.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.3.query.sqlpp
index 8122ce1..9252f72 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.3.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.3.query.sqlpp
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-// Subquery expressing anti-join of patterns.
+// Subquery expressing anti-join of patterns from different graphs.
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS Yelp.Users,
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.4.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.4.query.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.4.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.4.query.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.5.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.5.query.sqlpp
new file mode 100644
index 0000000..f2d93cd
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/correlated-vertex-join/correlated-vertex-join.5.query.sqlpp
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Implicit correlated vertex anti-JOIN.
+DECLARE GRAPH  YelpGraph AS
+VERTEX         (:User)
+               PRIMARY KEY (user_id)
+               AS Yelp.Users,
+VERTEX         (:Review)
+               PRIMARY KEY (review_id)
+               AS Yelp.Reviews,
+EDGE           (:Review)-[:MADE_BY]->(:User)
+               SOURCE KEY (review_id)
+               DESTINATION KEY (user_id)
+               AS ( FROM    Yelp.Reviews R
+                    SELECT  R.review_id, R.user_id );
+
+FROM GRAPH  YelpGraph
+MATCH       (u:User)<-(r)
+WHERE       NOT EXISTS ( FROM   GRAPH YelpGraph
+                         MATCH  (u)
+                         WHERE  u.user_id = 1
+                         SELECT VALUE 1 )
+SELECT      u.user_id, r.review_id
+ORDER BY    u.user_id, r.review_id;
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/dangling-vertices/dangling-vertices.5.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/dangling-vertices/dangling-vertices.5.query.sqlpp
index 78851df..f9ea1cd 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/dangling-vertices/dangling-vertices.5.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/dangling-vertices/dangling-vertices.5.query.sqlpp
@@ -17,7 +17,7 @@
  * under the License.
  */
 
--- param max-warnings:string=2
+-- param max-warnings:string=3
 
 // There are two dangling vertices of different labels, and zero edges.
 FROM GRAPH  Yelp.YelpGraph
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.6.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.6.query.sqlpp
index e3f1e7c..49e851b 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.6.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.6.query.sqlpp
@@ -18,7 +18,7 @@
  */
 
 // There should be results where (u) = (v).
-SET  `graphix.match-evaluation` "homomorphism";
+SET  `graphix.semantics.pattern` "homomorphism";
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS Yelp.Users
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.7.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.7.query.sqlpp
index 0e2cbc9..8451d7d 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.7.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graph-isomorphism/graph-isomorphism.7.query.sqlpp
@@ -18,7 +18,7 @@
  */
 
 // There should be results where (u) = (w) (i.e. only edge adjacency should be preserved).
-SET  `graphix.match-evaluation` "homomorphism";
+SET  `graphix.semantics.pattern` "homomorphism";
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS Yelp.Users,
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.3.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.3.query.sqlpp
index 71e441c..7de7558 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.3.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.3.query.sqlpp
@@ -25,6 +25,6 @@
                    PRIMARY KEY (review_id)
                    AS Yelp.Reviews
 MATCH       (n)
-SELECT      LABEL(n) AS vertexLabel,
+SELECT      LABEL(n) AS elementLabel,
             VERTEX_DETAIL(n) AS vertexDetail
 ORDER BY    n;
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.4.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.4.query.sqlpp
index 0283334..b468c26 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.4.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.4.query.sqlpp
@@ -43,7 +43,7 @@
             LABEL(e) AS edgeLabel,
             LABEL(n1) AS n1Label,
             LABEL(n2) AS n2Label,
-            LABEL(sourceVertex) AS sourceVertexLabel,
-            LABEL(destVertex) AS destVertexLabel,
+            LABEL(sourceVertex) AS sourceElementLabel,
+            LABEL(destVertex) AS destElementLabel,
             EDGE_DETAIL(e) AS edgeDetail
 ORDER BY    direction, edgeLabel, n1Label, n2Label, edgeDetail;
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.5.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.5.query.sqlpp
index a427758..08319e2 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.5.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/graphix-functions/graphix-functions.5.query.sqlpp
@@ -27,7 +27,7 @@
                    AS ( FROM    Yelp.Friends F
                         SELECT  F.user_id AS user_id,
                                 F.friend AS friend )
-MATCH       (n1)-[e:{1,2}]->(n2)->(n3) AS p
+MATCH       (n1)-[e{1,2}]->(n2)->(n3) AS p
 SELECT      EDGES(p) AS pEdges,
             EDGES(e) AS eEdges,
             HOP_COUNT(p) AS pHopCount,
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/on-query-error/on-query-error.13.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/on-query-error/on-query-error.13.query.sqlpp
new file mode 100644
index 0000000..a995d98
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/on-query-error/on-query-error.13.query.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Verify that a query that doesn't adhere to the graph schema returns an error.
+USE         TestDataverse;
+FROM GRAPH  VERTEX  (:Vertex1)
+                    PRIMARY KEY (_id)
+                    AS GenericDataset,
+            VERTEX  (:Vertex2)
+                    PRIMARY KEY (_id)
+                    AS GenericDataset,
+            EDGE    (:Vertex1)-[:EDGE_1]->(:Vertex2)
+                    SOURCE KEY (_id)
+                    DESTINATION KEY (_to_id)
+                    AS ( FROM    GenericDataset GD
+                         SELECT  GD._id, GD._to_id )
+MATCH       (v:Vertex1)<-[:EDGE_1]-(:Vertex2)
+SELECT      v;
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/path-variable/path-variable.6.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/path-variable/path-variable.6.query.sqlpp
index 595463c..3538605 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/path-variable/path-variable.6.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/path-variable/path-variable.6.query.sqlpp
@@ -27,7 +27,7 @@
                    AS ( FROM    Yelp.Friends F
                         WHERE   F.friend_group = "A"
                         SELECT  F.user_id, F.friend )
-MATCH       (u)-[e1:{1,2}]-(v) AS p
+MATCH       (u)-[e1{1,2}]-(v) AS p
 SELECT      LEN(p.Edges) AS pathLength,
             u.user_id AS u_user_id,
             v.user_id AS v_user_id
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.1.ddl.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.1.ddl.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.1.ddl.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.1.ddl.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.2.update.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.2.update.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.2.update.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.2.update.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.3.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.3.query.sqlpp
new file mode 100644
index 0000000..b11858b
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/same-edge-label/same-edge-label.3.query.sqlpp
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Query with a schema edge of the same label.
+DECLARE GRAPH  YelpGraph AS
+VERTEX         (:User)
+               PRIMARY KEY (user_id)
+               AS Yelp.Users,
+VERTEX         (:Review)
+               PRIMARY KEY (review_id)
+               AS Yelp.Reviews,
+EDGE           (:Review)-[:RELATED_TO]->(:User)
+               SOURCE KEY (review_id)
+               DESTINATION KEY (user_id)
+               AS ( FROM    Yelp.Reviews R
+                    SELECT  R.review_id, R.user_id ),
+EDGE           (:User)-[:RELATED_TO]->(:User)
+               SOURCE KEY (user_id)
+               DESTINATION KEY (friend)
+               AS ( FROM    Yelp.Friends F
+                    SELECT  F.user_id, F.friend );
+
+FROM     GRAPH YelpGraph
+MATCH    (u)-[:RELATED_TO]->(v)
+SELECT   v.user_id AS v_user_id,
+         CASE
+         WHEN LABEL(u) = "User"
+         THEN { "user_id": u.user_id }
+         WHEN LABEL(u) = "Review"
+         THEN { "review_id": u.review_id }
+         END AS u_record
+ORDER BY u, v;
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.1.ddl.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.1.ddl.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.1.ddl.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.1.ddl.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.2.update.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.2.update.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.2.update.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.2.update.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.3.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.3.query.sqlpp
similarity index 96%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.3.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.3.query.sqlpp
index 700fe8f..f1e7af5 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.3.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.3.query.sqlpp
@@ -20,7 +20,6 @@
 -- param max-warnings:string=1
 
 // We should be able to resolve both e and n, using the edge direction.
-SET         `graphix.resolver` "inference-based";
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS ( FROM    Yelp.Users U
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.4.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.4.query.sqlpp
similarity index 97%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.4.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.4.query.sqlpp
index 5533ede..1b4282a 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.4.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.4.query.sqlpp
@@ -20,7 +20,6 @@
 -- param max-warnings:string=1
 
 // We should be able to resolve all elements (e, n, f, m), using the edge direction of the last edge in our pattern.
-SET         `graphix.resolver` "inference-based";
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS ( FROM    Yelp.Users U
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.5.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.5.query.sqlpp
similarity index 97%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.5.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.5.query.sqlpp
index df7e676..9202011 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.5.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.5.query.sqlpp
@@ -20,7 +20,6 @@
 -- param max-warnings:string=1
 
 // We should be able to resolve all elements (e, n, f, last direction), using the edge direction of the first pattern.
-SET         `graphix.resolver` "inference-based";
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS ( FROM    Yelp.Users U
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.6.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.6.query.sqlpp
similarity index 94%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.6.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.6.query.sqlpp
index 30de634..fa256a5 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.6.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.6.query.sqlpp
@@ -20,7 +20,6 @@
 -- param max-warnings:string=1
 
 // We should be able to resolve all elements (e, n, f, last direction), using the edge direction of the first pattern.
-SET         `graphix.resolver` "inference-based";
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS ( FROM    Yelp.Users U
@@ -39,7 +38,7 @@
                    DESTINATION KEY (user_id)
                    AS ( FROM    Yelp.Reviews R
                         SELECT  R.review_id, R.user_id )
-MATCH       (u:User)-[e:{2,2}]->(n) // (u:User)-[]->()-[]->(n)
+MATCH       (u:User)-[e{2,2}]->(n) // (u:User)-[]->()-[]->(n)
 UNNEST      PATH_EDGES(e) AS ee
 SELECT      DISTINCT LABEL(ee) AS e_label,
                      LABEL(n) AS n_label,
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.3.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.7.query.sqlpp
similarity index 89%
copy from asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.3.query.sqlpp
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.7.query.sqlpp
index 700fe8f..780f1a2 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/inference-resolution/inference-resolution.3.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.7.query.sqlpp
@@ -19,8 +19,7 @@
 
 -- param max-warnings:string=1
 
-// We should be able to resolve both e and n, using the edge direction.
-SET         `graphix.resolver` "inference-based";
+// We should be able to resolve both u and n, using the negated edge label.
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS ( FROM    Yelp.Users U
@@ -39,6 +38,6 @@
                    DESTINATION KEY (user_id)
                    AS ( FROM    Yelp.Reviews R
                         SELECT  R.review_id, R.user_id )
-MATCH       (u:User)-[e]->(n)
-SELECT      DISTINCT LABEL(e) AS e_label,
+MATCH       (u)-[e:^MADE_BY]-(n)
+SELECT      DISTINCT LABEL(u) AS u_label,
                      LABEL(n) AS n_label;
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.8.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.8.query.sqlpp
new file mode 100644
index 0000000..34b03d6
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/schema-resolution/schema-resolution.8.query.sqlpp
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+-- param max-warnings:string=1
+
+// We should be able to resolve both subquery vertex JOINs in both directions.
+DECLARE GRAPH  YelpGraph AS
+VERTEX         (:User)
+               PRIMARY KEY (user_id)
+               AS ( FROM    Yelp.Users U
+                    SELECT  U.user_id ),
+VERTEX         (:Review)
+               PRIMARY KEY (review_id)
+               AS ( FROM    Yelp.Reviews R
+                    SELECT  R.review_id ),
+EDGE           (:User)-[:FRIENDS_WITH]->(:User)
+               SOURCE KEY (user_id)
+               DESTINATION KEY (friend)
+               AS ( FROM    Yelp.Friends F
+                    SELECT  F.user_id, F.friend ),
+EDGE           (:Review)-[:MADE_BY]->(:User)
+               SOURCE KEY (review_id)
+               DESTINATION KEY (user_id)
+               AS ( FROM    Yelp.Reviews R
+                    SELECT  R.review_id, R.user_id );
+
+FROM   GRAPH YelpGraph
+MATCH  (u)->(r)
+WHERE  EXISTS ( FROM   GRAPH YelpGraph
+                MATCH  (u:User)
+                WHERE  u.user_id = 1
+                SELECT VALUE 1 )
+SELECT DISTINCT LABEL(u) AS u_label,
+                LABEL(r) AS r_label
+
+UNION ALL
+
+FROM   GRAPH YelpGraph
+MATCH  (u:User)->(r)
+WHERE  EXISTS ( FROM   GRAPH YelpGraph
+                MATCH  (u)
+                WHERE  u.user_id = 1
+                SELECT VALUE 1 )
+SELECT DISTINCT LABEL(u) AS u_label,
+                LABEL(r) AS r_label;
+
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.1.ddl.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.1.ddl.sqlpp
similarity index 100%
copy from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.1.ddl.sqlpp
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.1.ddl.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.2.update.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.2.update.sqlpp
similarity index 100%
copy from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.2.update.sqlpp
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.2.update.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.7.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.3.query.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.7.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.3.query.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.8.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.4.query.sqlpp
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.8.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-validation/scope-validation.4.query.sqlpp
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.3.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/simple-1-edge/simple-1-edge.6.query.sqlpp
similarity index 63%
copy from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.3.query.sqlpp
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/simple-1-edge/simple-1-edge.6.query.sqlpp
index 8122ce1..ecec02d 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.3.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/simple-1-edge/simple-1-edge.6.query.sqlpp
@@ -17,7 +17,8 @@
  * under the License.
  */
 
-// Subquery expressing anti-join of patterns.
+// We have a single edge with a filter expression on the User vertex.
+LET         startingUserID = 1
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
                    AS Yelp.Users,
@@ -26,17 +27,11 @@
                    AS Yelp.Reviews,
             EDGE   (:Review)-[:MADE_BY]->(:User)
                    SOURCE KEY (review_id)
-                   DESTINATION KEY (user_id)
+                   DESTINATION KEY (review_user_id)
                    AS ( FROM    Yelp.Reviews R
-                        SELECT  R.review_id, R.user_id )
-MATCH       (u:User)<-(r)
-WHERE       NOT EXISTS ( FROM GRAPH   VERTEX (:User)
-                                      PRIMARY KEY (user_id)
-                                      AS ( FROM    Yelp.Users U
-                                           WHERE   U.user_id = 1
-                                           SELECT  VALUE U )
-                          MATCH       (innerU:User)
-                          WHERE       innerU = u
-                          SELECT      VALUE 1 )
-SELECT      u.user_id
-ORDER BY    u.user_id;
\ No newline at end of file
+                        SELECT  R.review_user_id, R.review_id )
+MATCH       (u:User WHERE u.user_id = startingUserID)<-[:MADE_BY]-(r:Review)
+SELECT      u.user_id,
+            r.review_id
+ORDER BY    u.user_id,
+            r.review_id;
diff --git a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java b/asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.5.update.sqlpp
similarity index 69%
copy from asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
copy to asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.5.update.sqlpp
index 4509792..fdddf8d 100644
--- a/asterix-graphix/src/main/java/org/apache/asterix/graphix/lang/rewrites/lower/transform/ISequenceTransformer.java
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.5.update.sqlpp
@@ -16,11 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.asterix.graphix.lang.rewrites.lower.transform;
 
-import org.apache.asterix.common.exceptions.CompilationException;
+USE               Yelp;
 
-@FunctionalInterface
-public interface ISequenceTransformer {
-    void accept(CorrelatedClauseSequence clauseSequence) throws CompilationException;
-}
+DELETE FROM       Users;
+DELETE FROM       Friends;
+
+INSERT INTO       Users [
+  { "user_id": 1 },
+  { "user_id": 2 },
+  { "user_id": 3 },
+  { "user_id": 4 }
+];
+
+INSERT INTO       Friends [
+  { "user_id": 1, "friend": 2 },
+  { "user_id": 2, "friend": 3 },
+  { "user_id": 3, "friend": 4 },
+  { "user_id": 1, "friend": 3 }
+];
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.5.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.6.query.sqlpp
similarity index 97%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.5.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.6.query.sqlpp
index c0c8d48..91bbdfa 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.5.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.6.query.sqlpp
@@ -26,7 +26,7 @@
                    DESTINATION KEY (friend)
                    AS ( FROM    Yelp.Friends F
                         SELECT  VALUE F )
-MATCH       (u1)-[:{1,3}]->(u2) AS p
+MATCH       (u1)-[{1,3}]->(u2) AS p
 GROUP BY    u1, u2
 GROUP AS    g
 LET         shortestPath = ( FROM      g AS gi
diff --git a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.6.query.sqlpp b/asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.7.query.sqlpp
similarity index 94%
rename from asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.6.query.sqlpp
rename to asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.7.query.sqlpp
index 62e6a83..99c8c02 100644
--- a/asterix-graphix/src/test/resources/runtimets/queries/graphix/scope-checking/scope-checking.6.query.sqlpp
+++ b/asterix-graphix/src/test/resources/runtimets/queries/graphix/variable-sub-path/variable-sub-path.7.query.sqlpp
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+// Subquery + GROUP BY expressing (bounded) shortest-path.
 // Subquery + GROUP BY expressing (bounded) shortest-path, using aliases.
 FROM GRAPH  VERTEX (:User)
                    PRIMARY KEY (user_id)
@@ -26,7 +27,7 @@
                    DESTINATION KEY (friend)
                    AS ( FROM    Yelp.Friends F
                         SELECT  VALUE F )
-MATCH       (u1)-[:{1,3}]->(u2) AS p
+MATCH       (u1)-[{1,3}]->(u2) AS p
 LET         pathHopCount = PATH_HOP_COUNT(p),
             pathVertices = PATH_VERTICES(p),
             myUser1 = u1,
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.3.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/correlated-vertex-join/correlated-vertex-join.3.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.3.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/correlated-vertex-join/correlated-vertex-join.3.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.4.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/correlated-vertex-join/correlated-vertex-join.4.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.4.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/correlated-vertex-join/correlated-vertex-join.4.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.4.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/correlated-vertex-join/correlated-vertex-join.5.adm
similarity index 100%
copy from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.4.adm
copy to asterix-graphix/src/test/resources/runtimets/results/graphix/correlated-vertex-join/correlated-vertex-join.5.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.3.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.3.adm
index c514419..47003ca 100644
--- a/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.3.adm
+++ b/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.3.adm
@@ -1,8 +1,8 @@
-{ "vertexLabel": "Review", "vertexDetail": { "ElementLabel": "Review", "VertexKey": [ "A" ] } }
-{ "vertexLabel": "Review", "vertexDetail": { "ElementLabel": "Review", "VertexKey": [ "B" ] } }
-{ "vertexLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 1 ] } }
-{ "vertexLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 2 ] } }
-{ "vertexLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 3 ] } }
-{ "vertexLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 4 ] } }
-{ "vertexLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 5 ] } }
-{ "vertexLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 6 ] } }
\ No newline at end of file
+{ "elementLabel": "Review", "vertexDetail": { "ElementLabel": "Review", "VertexKey": [ "A" ] } }
+{ "elementLabel": "Review", "vertexDetail": { "ElementLabel": "Review", "VertexKey": [ "B" ] } }
+{ "elementLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 1 ] } }
+{ "elementLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 2 ] } }
+{ "elementLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 3 ] } }
+{ "elementLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 4 ] } }
+{ "elementLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 5 ] } }
+{ "elementLabel": "User", "vertexDetail": { "ElementLabel": "User", "VertexKey": [ 6 ] } }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.4.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.4.adm
index c81b251..bfe59dc 100644
--- a/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.4.adm
+++ b/asterix-graphix/src/test/resources/runtimets/results/graphix/graphix-functions/graphix-functions.4.adm
@@ -1,14 +1,14 @@
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 1 ], "DestinationKey": [ 2 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 2 ], "DestinationKey": [ 3 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 3 ], "DestinationKey": [ 4 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 4 ], "DestinationKey": [ 5 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 5 ], "DestinationKey": [ 6 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ "A" ], "DestinationKey": [ 1 ] }, "n1Label": "Review", "n2Label": "User", "sourceVertexLabel": "Review", "destVertexLabel": "User" }
-{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ "B" ], "DestinationKey": [ 2 ] }, "n1Label": "Review", "n2Label": "User", "sourceVertexLabel": "Review", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 1 ], "DestinationKey": [ 2 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 2 ], "DestinationKey": [ 3 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 3 ], "DestinationKey": [ 4 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 4 ], "DestinationKey": [ 5 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 5 ], "DestinationKey": [ 6 ] }, "n1Label": "User", "n2Label": "User", "sourceVertexLabel": "User", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ "A" ], "DestinationKey": [ 1 ] }, "n1Label": "User", "n2Label": "Review", "sourceVertexLabel": "Review", "destVertexLabel": "User" }
-{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ "B" ], "DestinationKey": [ 2 ] }, "n1Label": "User", "n2Label": "Review", "sourceVertexLabel": "Review", "destVertexLabel": "User" }
\ No newline at end of file
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 1 ], "DestinationKey": [ 2 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 2 ], "DestinationKey": [ 3 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 3 ], "DestinationKey": [ 4 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 4 ], "DestinationKey": [ 5 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ 5 ], "DestinationKey": [ 6 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ "A" ], "DestinationKey": [ 1 ] }, "n1Label": "Review", "n2Label": "User", "sourceElementLabel": "Review", "destElementLabel": "User" }
+{ "direction": "LEFT_TO_RIGHT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "LEFT_TO_RIGHT", "SourceKey": [ "B" ], "DestinationKey": [ 2 ] }, "n1Label": "Review", "n2Label": "User", "sourceElementLabel": "Review", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 1 ], "DestinationKey": [ 2 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 2 ], "DestinationKey": [ 3 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 3 ], "DestinationKey": [ 4 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 4 ], "DestinationKey": [ 5 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "FRIENDS_WITH", "edgeDetail": { "ElementLabel": "FRIENDS_WITH", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ 5 ], "DestinationKey": [ 6 ] }, "n1Label": "User", "n2Label": "User", "sourceElementLabel": "User", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ "A" ], "DestinationKey": [ 1 ] }, "n1Label": "User", "n2Label": "Review", "sourceElementLabel": "Review", "destElementLabel": "User" }
+{ "direction": "RIGHT_TO_LEFT", "edgeLabel": "MADE_BY", "edgeDetail": { "ElementLabel": "MADE_BY", "EdgeDirection": "RIGHT_TO_LEFT", "SourceKey": [ "B" ], "DestinationKey": [ 2 ] }, "n1Label": "User", "n2Label": "Review", "sourceElementLabel": "Review", "destElementLabel": "User" }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/same-edge-label/same-edge-label.3.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/same-edge-label/same-edge-label.3.adm
new file mode 100644
index 0000000..42acc6b
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/results/graphix/same-edge-label/same-edge-label.3.adm
@@ -0,0 +1,10 @@
+{ "u_record": { "review_id": "A" }, "v_user_id": 1 }
+{ "u_record": { "review_id": "B" }, "v_user_id": 1 }
+{ "u_record": { "review_id": "C" }, "v_user_id": 1 }
+{ "u_record": { "review_id": "D" }, "v_user_id": 2 }
+{ "u_record": { "review_id": "E" }, "v_user_id": 3 }
+{ "u_record": { "review_id": "F" }, "v_user_id": 4 }
+{ "u_record": { "user_id": 1 }, "v_user_id": 2 }
+{ "u_record": { "user_id": 1 }, "v_user_id": 3 }
+{ "u_record": { "user_id": 2 }, "v_user_id": 3 }
+{ "u_record": { "user_id": 3 }, "v_user_id": 4 }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.3.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.3.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.3.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.3.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.4.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.4.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.4.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.4.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.5.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.5.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.5.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.5.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.6.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.6.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/inference-resolution/inference-resolution.6.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.6.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.7.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.7.adm
new file mode 100644
index 0000000..1588f9f
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.7.adm
@@ -0,0 +1 @@
+{ "u_label": "User", "n_label": "User" }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.8.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.8.adm
new file mode 100644
index 0000000..2677371
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/results/graphix/schema-resolution/schema-resolution.8.adm
@@ -0,0 +1,2 @@
+{ "u_label": "User", "r_label": "User" }
+{ "u_label": "User", "r_label": "User" }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.8.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.8.adm
deleted file mode 100644
index 9b24dd0..0000000
--- a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.8.adm
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "user_id": 1, "review_id": "A" }
-{ "user_id": 1, "review_id": "B" }
-{ "user_id": 1, "review_id": "C" }
-{ "user_id": 2, "review_id": "D" }
-{ "user_id": 3, "review_id": "E" }
-{ "user_id": 4, "review_id": "F" }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.7.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-validation/scope-validation.3.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.7.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/scope-validation/scope-validation.3.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.7.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-validation/scope-validation.4.adm
similarity index 100%
copy from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.7.adm
copy to asterix-graphix/src/test/resources/runtimets/results/graphix/scope-validation/scope-validation.4.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/simple-1-edge/simple-1-edge.6.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/simple-1-edge/simple-1-edge.6.adm
new file mode 100644
index 0000000..2a5d87f
--- /dev/null
+++ b/asterix-graphix/src/test/resources/runtimets/results/graphix/simple-1-edge/simple-1-edge.6.adm
@@ -0,0 +1,2 @@
+{ "user_id": 1, "review_id": "A" }
+{ "user_id": 1, "review_id": "B" }
\ No newline at end of file
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.6.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/variable-sub-path/variable-sub-path.6.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.6.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/variable-sub-path/variable-sub-path.6.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.5.adm b/asterix-graphix/src/test/resources/runtimets/results/graphix/variable-sub-path/variable-sub-path.7.adm
similarity index 100%
rename from asterix-graphix/src/test/resources/runtimets/results/graphix/scope-checking/scope-checking.5.adm
rename to asterix-graphix/src/test/resources/runtimets/results/graphix/variable-sub-path/variable-sub-path.7.adm
diff --git a/asterix-graphix/src/test/resources/runtimets/testsuite.xml b/asterix-graphix/src/test/resources/runtimets/testsuite.xml
index a5ea9fc..50abf0c 100644
--- a/asterix-graphix/src/test/resources/runtimets/testsuite.xml
+++ b/asterix-graphix/src/test/resources/runtimets/testsuite.xml
@@ -20,6 +20,13 @@
             ResultOffsetPath="results"
             QueryOffsetPath="queries"
             QueryFileExtension=".sqlpp">
+  <test-group name="correlated-vertex-join">
+    <test-case FilePath="graphix">
+      <compilation-unit name="correlated-vertex-join">
+        <output-dir compare="Text">correlated-vertex-join</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
   <test-group name="create-drop-error">
     <test-case FilePath="graphix">
       <compilation-unit name="create-drop-error">
@@ -42,10 +49,12 @@
     </test-case>
   </test-group>
   <test-group name="dangling-vertices">
-    <test-case FilePath="graphix" check-warnings="true">
+    <!--<test-case FilePath="graphix" check-warnings="true">-->
+    <test-case FilePath="graphix" check-warnings="false">
       <compilation-unit name="dangling-vertices">
         <output-dir compare="Text">dangling-vertices</output-dir>
-        <expected-warn>Potential disconnected pattern encountered! A CROSS-JOIN has been introduced.</expected-warn>
+        <!--<expected-warn>Disconnected pattern encountered! A CROSS-JOIN may been introduced.</expected-warn>-->
+        <!--<expected-warn>Encountered a cross product join</expected-warn>-->
       </compilation-unit>
     </test-case>
   </test-group>
@@ -70,13 +79,6 @@
       </compilation-unit>
     </test-case>
   </test-group>
-  <test-group name="inference-resolution">
-    <test-case FilePath="graphix" check-warnings="true">
-      <compilation-unit name="inference-resolution">
-        <output-dir compare="Text">inference-resolution</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
   <test-group name="left-match">
     <test-case FilePath="graphix">
       <compilation-unit name="left-match">
@@ -99,6 +101,7 @@
         <expected-error>Cannot resolve alias reference for undefined identifier invalidVariable</expected-error>
         <expected-error>Cannot resolve alias reference for undefined identifier invalidVariable</expected-error>
         <expected-error>Cannot resolve alias reference for undefined identifier invalidVariable</expected-error>
+        <expected-error>Encountered graph element that does not conform the queried graph schema!</expected-error>
       </compilation-unit>
     </test-case>
   </test-group>
@@ -109,10 +112,17 @@
       </compilation-unit>
     </test-case>
   </test-group>
-  <test-group name="scope-checking">
+  <test-group name="schema-resolution">
+    <test-case FilePath="graphix" check-warnings="true">
+      <compilation-unit name="schema-resolution">
+        <output-dir compare="Text">schema-resolution</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+  <test-group name="scope-validation">
     <test-case FilePath="graphix">
-      <compilation-unit name="scope-checking">
-        <output-dir compare="Text">scope-checking</output-dir>
+      <compilation-unit name="scope-validation">
+        <output-dir compare="Text">scope-validation</output-dir>
       </compilation-unit>
     </test-case>
   </test-group>
