diff --git a/tests/query/v1/test_go.py b/tests/query/v1/test_go.py
deleted file mode 100644
index 7d6d65a27b4bcfa78a560e1b8c15b3223f4f83f8..0000000000000000000000000000000000000000
--- a/tests/query/v1/test_go.py
+++ /dev/null
@@ -1,2113 +0,0 @@
-# --coding:utf-8--
-#
-# Copyright (c) 2020 vesoft inc. All rights reserved.
-#
-# This source code is licensed under Apache 2.0 License,
-# attached with Common Clause Condition 1.0, found in the LICENSES directory.
-
-import pytest
-
-from tests.common.nebula_test_suite import NebulaTestSuite
-from tests.common.nebula_test_suite import T_EMPTY
-
-
-class TestGoQuery(NebulaTestSuite):
-    @classmethod
-    def prepare(self):
-        self.use_nba()
-
-    def test_one_step(self):
-        stmt = 'GO FROM "Tim Duncan" OVER serve'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Tim Duncan", "Tim Duncan" OVER serve'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'YIELD "Tim Duncan" as vid | GO FROM $-.vid OVER serve'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-
-        stmt = '''GO FROM "Boris Diaw" OVER serve YIELD \
-            $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Boris Diaw", 2003, 2005, "Hawks"],
-                ["Boris Diaw", 2005, 2008, "Suns"],
-                ["Boris Diaw", 2008, 2012, "Hornets"],
-                ["Boris Diaw", 2012, 2016, "Spurs"],
-                ["Boris Diaw", 2016, 2017, "Jazz"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Rajon Rondo" OVER serve WHERE \
-            serve.start_year >= 2013 AND serve.end_year <= 2018 YIELD \
-            $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Rajon Rondo", 2014, 2015, "Mavericks"],
-                ["Rajon Rondo", 2015, 2016, "Kings"],
-                ["Rajon Rondo", 2016, 2017, "Bulls"],
-                ["Rajon Rondo", 2017, 2018, "Pelicans"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Boris Diaw" OVER like YIELD like._dst as id \
-            | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"],
-                ["Trail Blazers"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Thunders' OVER serve REVERSELY"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Russell Westbrook"],
-                ["Kevin Durant"],
-                ["James Harden"],
-                ["Carmelo Anthony"],
-                ["Paul George"],
-                ["Ray Allen"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Boris Diaw" OVER like YIELD like._dst as id \
-            | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"],
-                ["Trail Blazers"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "NON EXIST VERTEX ID" OVER like YIELD like._dst as id \
-            | (GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = '''GO FROM "Boris Diaw" OVER like, serve YIELD like._dst as id \
-            | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"],
-                ["Trail Blazers"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_assignment_simple(self):
-        stmt = '''$var = GO FROM "Tracy McGrady" OVER like YIELD like._dst as id; \
-            GO FROM $var.id OVER like'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tracy McGrady"],
-                ["LaMarcus Aldridge"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_assignment_pipe(self):
-        stmt = '''$var = (GO FROM "Tracy McGrady" OVER like YIELD like._dst as id \
-            | GO FROM $-.id OVER like YIELD like._dst as id); \
-            GO FROM $var.id OVER like'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Kobe Bryant"],
-                ["Grant Hill"],
-                ["Rudy Gay"],
-                ["Tony Parker"],
-                ["Tim Duncan"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_pipe_only_yield_input_prop(self):
-        stmt = '''GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid \
-            | GO FROM $-.vid OVER like YIELD $-.vid as id'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["id"],
-            "rows": [
-                ["Kobe Bryant"],
-                ["Grant Hill"],
-                ["Rudy Gay"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_pipe_only_yield_constant(self):
-        stmt = '''GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid \
-            | GO FROM $-.vid OVER like YIELD 3'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["3"],
-            "rows": [
-                [3],
-                [3],
-                [3]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_assignment_empty_result(self):
-        stmt = '''$var = GO FROM "-1" OVER like YIELD like._dst as id; \
-            GO FROM $var.id OVER like'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-
-    def test_variable_undefined(self):
-        stmt = "GO FROM $var OVER like"
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-    def test_distinct(self):
-        stmt = '''GO FROM "Nobody" OVER serve \
-            YIELD DISTINCT $^.player.name as name, $$.team.name as name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-
-        stmt = '''GO FROM "Boris Diaw" OVER like YIELD like._dst as id \
-            | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve \
-            YIELD DISTINCT serve._dst, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "$$.team.name"],
-            "rows": [
-                ["Spurs", "Spurs"],
-                ["Hornets", "Hornets"],
-                ["Trail Blazers", "Trail Blazers"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO 2 STEPS FROM "Tony Parker" OVER like YIELD DISTINCT like._dst'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["Tony Parker"],
-                ["Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_vertex_noexist(self):
-        stmt = 'GO FROM "NON EXIST VERTEX ID" OVER serve'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = '''GO FROM "NON EXIST VERTEX ID" OVER serve YIELD \
-            $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = '''GO FROM "NON EXIST VERTEX ID" OVER serve YIELD DISTINCT \
-            $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-    def test_empty_inputs(self):
-        stmt = '''GO FROM "NON EXIST VERTEX ID" OVER like YIELD like._dst as id \
-            | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = '''GO FROM "NON EXIST VERTEX ID" OVER serve YIELD serve._dst as id, serve.start_year as start \
-            | YIELD $-.id as id WHERE $-.start > 20000 | Go FROM $-.id over serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-    def test_multi_edges_over_all(self):
-        stmt = 'GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._dst, like._dst'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "James Harden"],
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "Paul George"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._src, like._src'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "Russell Westbrook"],
-                [T_EMPTY, "Russell Westbrook"],
-                [T_EMPTY, "Russell Westbrook"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Russell Westbrook" OVER * REVERSELY'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["James Harden", T_EMPTY, T_EMPTY],
-                ["Dejounte Murray", T_EMPTY, T_EMPTY],
-                ["Paul George", T_EMPTY, T_EMPTY]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Dirk Nowitzki" OVER * YIELD serve._dst, like._dst'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Mavericks", T_EMPTY],
-                [T_EMPTY, "Steve Nash"],
-                [T_EMPTY, "Jason Kidd"],
-                [T_EMPTY, "Dwyane Wade"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Paul Gasol" OVER *'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "Grizzlies", T_EMPTY],
-                [T_EMPTY, "Lakers", T_EMPTY],
-                [T_EMPTY, "Bulls", T_EMPTY],
-                [T_EMPTY, "Spurs", T_EMPTY],
-                [T_EMPTY, "Bucks", T_EMPTY],
-                ["Kobe Bryant", T_EMPTY, T_EMPTY],
-                ["Marc Gasol", T_EMPTY, T_EMPTY]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Manu Ginobili" OVER * REVERSELY YIELD like.likeness, \
-            teammate.start_year, serve.start_year, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [95, T_EMPTY, T_EMPTY, "Tim Duncan"],
-                [95, T_EMPTY, T_EMPTY, "Tony Parker"],
-                [90, T_EMPTY, T_EMPTY, "Tiago Splitter"],
-                [99, T_EMPTY, T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, 2002, T_EMPTY, "Tim Duncan"],
-                [T_EMPTY, 2002, T_EMPTY, "Tony Parker"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "LaMarcus Aldridge" OVER * YIELD $$.team.name, $$.player.name'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Trail Blazers", T_EMPTY],
-                [T_EMPTY, "Tim Duncan"],
-                [T_EMPTY, "Tony Parker"],
-                ["Spurs", T_EMPTY]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Boris Diaw" OVER * YIELD like._dst as id \
-            | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"],
-                ["Trail Blazers"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    @pytest.mark.skip(reason = 'return diffrent type when edge type wanted.')
-    def test_edge_type(self):
-        stmt = '''GO FROM "Russell Westbrook" OVER serve, like \
-            YIELD serve.start_year, like.likeness, serve._type, like._type'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [2008, T_EMPTY, 6, T_EMPTY],
-                [T_EMPTY, 90, T_EMPTY, 5],
-                [T_EMPTY, 90, T_EMPTY, 5]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Russell Westbrook" OVER serve, like REVERSELY \
-            YIELD serve._dst, like._dst, serve._type, like._type'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "James Harden", T_EMPTY, -5],
-                [T_EMPTY, "Dejounte Murray", T_EMPTY, -5],
-                [T_EMPTY, "Paul George", T_EMPTY, -5],
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_multi_edges(self):
-        stmt = '''GO FROM "Russell Westbrook" OVER serve, like \
-            YIELD serve.start_year, like.likeness'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [2008, T_EMPTY],
-                [T_EMPTY, 90],
-                [T_EMPTY, 90]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Shaquile O\'Neal" OVER serve, like'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Magic", T_EMPTY],
-                ["Lakers",T_EMPTY],
-                ["Heat", T_EMPTY],
-                ["Suns", T_EMPTY],
-                ["Cavaliers", T_EMPTY],
-                ["Celtics", T_EMPTY],
-                [T_EMPTY, "JaVale McGee"],
-                [T_EMPTY, "Tim Duncan"],
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Russell Westbrook' OVER serve, like"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Thunders", T_EMPTY],
-                [T_EMPTY, "Paul George"],
-                [T_EMPTY, "James Harden"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Russell Westbrook" OVER serve, like REVERSELY \
-            YIELD serve._dst, like._dst, serve.start_year, like.likeness'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "James Harden", T_EMPTY, 80],
-                [T_EMPTY, "Dejounte Murray", T_EMPTY, 99],
-                [T_EMPTY, "Paul George", T_EMPTY, 95],
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Russell Westbrook" OVER serve, like REVERSELY YIELD serve._src, like._src'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "Russell Westbrook"],
-                [T_EMPTY, "Russell Westbrook"],
-                [T_EMPTY, "Russell Westbrook"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = 'GO FROM "Russell Westbrook" OVER serve, like REVERSELY'
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, "James Harden"],
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "Paul George"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Manu Ginobili" OVER like, teammate REVERSELY YIELD like.likeness, \
-            teammate.start_year, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [95, T_EMPTY, "Tim Duncan"],
-                [95, T_EMPTY, "Tony Parker"],
-                [90, T_EMPTY, "Tiago Splitter"],
-                [99, T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, 2002, "Tim Duncan"],
-                [T_EMPTY, 2002, "Tony Parker"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_multi_edges_with_filter(self):
-        stmt = '''GO FROM "Russell Westbrook" OVER serve, like WHERE serve.start_year > 2000 \
-            YIELD serve.start_year, like.likeness'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [2008, T_EMPTY]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Manu Ginobili" OVER like, teammate REVERSELY WHERE like.likeness > 90 YIELD like.likeness, \
-            teammate.start_year, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [95, T_EMPTY, "Tim Duncan"],
-                [95, T_EMPTY, "Tony Parker"],
-                [99, T_EMPTY, "Dejounte Murray"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-
-        stmt = '''GO FROM "Manu Ginobili" OVER * \
-            WHERE $$.player.age > 30 or $$.team.name not starts with "Rockets" \
-            YIELD DISTINCT $$.player.age, $$.player.name, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY, T_EMPTY, "Spurs"],
-                [42, "Tim Duncan", T_EMPTY],
-                [36, "Tony Parker",T_EMPTY]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM "Manu Ginobili" OVER like, teammate REVERSELY \
-            WHERE $$.player.age > 30 and $$.player.age < 40 \
-            YIELD DISTINCT $$.player.age, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [34, "Tiago Splitter"],
-                [36, "Tony Parker"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-
-    def test_reference_pipe_in_yieldandwhere(self):
-        stmt = '''GO FROM 'Tim Duncan', 'Chris Paul' OVER like \
-            YIELD $^.player.name AS name, like._dst AS id \
-            | GO FROM $-.id OVER like \
-            YIELD $-.name, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$-.name", "$^.player.name", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Manu Ginobili", "Tim Duncan"],
-                ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tony Parker", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker", "Tim Duncan"],
-                ["Chris Paul", "LeBron James", "Ray Allen"],
-                ["Chris Paul", "Carmelo Anthony", "Chris Paul"],
-                ["Chris Paul", "Carmelo Anthony", "LeBron James"],
-                ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"],
-                ["Chris Paul", "Dwyane Wade", "Chris Paul"],
-                ["Chris Paul", "Dwyane Wade", "LeBron James"],
-                ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Tim Duncan', 'Chris Paul' OVER like \
-            YIELD $^.player.name AS name, like._dst AS id \
-            | GO FROM $-.id OVER like \
-            WHERE $-.name != $$.player.name \
-            YIELD $-.name, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$-.name", "$^.player.name", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tony Parker", "Manu Ginobili"],
-                ["Chris Paul", "LeBron James", "Ray Allen"],
-                ["Chris Paul", "Carmelo Anthony", "LeBron James"],
-                ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"],
-                ["Chris Paul", "Dwyane Wade", "LeBron James"],
-                ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    @pytest.mark.skip(reason = '$-.* over * $var.* not implement')
-    def test_all_prop(self):
-        stmt = '''GO FROM 'Tim Duncan', 'Chris Paul' OVER like \
-            YIELD $^.player.name AS name, like._dst AS id \
-            | GO FROM $-.id OVER like \
-            YIELD $-.*, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$-.name", "$^.player.name", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", "Tim Duncan"],
-                ["Chris Paul", "LeBron James", "LeBron James", "Ray Allen"],
-                ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Chris Paul"],
-                ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "LeBron James"],
-                ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Dwyane Wade"],
-                ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Chris Paul"],
-                ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "LeBron James"],
-                ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Carmelo Anthony"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like \
-            YIELD $^.player.name AS name, like._dst AS id; \
-            GO FROM $var.id OVER like \
-            YIELD $var.*, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", "Tim Duncan"],
-                ["Chris Paul", "LeBron James", "LeBron James", "Ray Allen"],
-                ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Chris Paul"],
-                ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "LeBron James"],
-                ["Chris Paul", "Carmelo Anthony", "Carmelo Anthony", "Dwyane Wade"],
-                ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Chris Paul"],
-                ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "LeBron James"],
-                ["Chris Paul", "Dwyane Wade", "Dwyane Wade", "Carmelo Anthony"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-
-    def test_reference_variable_in_yieldandwhere(self):
-        stmt = '''$var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like \
-            YIELD $^.player.name AS name, like._dst AS id; \
-            GO FROM $var.id OVER like \
-            YIELD $var.name, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$var.name", "$^.player.name", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Manu Ginobili", "Tim Duncan"],
-                ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tony Parker", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker", "Tim Duncan"],
-                ["Chris Paul", "LeBron James", "Ray Allen"],
-                ["Chris Paul", "Carmelo Anthony", "Chris Paul"],
-                ["Chris Paul", "Carmelo Anthony", "LeBron James"],
-                ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"],
-                ["Chris Paul", "Dwyane Wade", "Chris Paul"],
-                ["Chris Paul", "Dwyane Wade", "LeBron James"],
-                ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like \
-            YIELD $^.player.name AS name, like._dst AS id; \
-            GO FROM $var.id OVER like \
-            WHERE $var.name != $$.player.name \
-            YIELD $var.name, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$var.name", "$^.player.name", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tony Parker", "Manu Ginobili"],
-                ["Chris Paul", "LeBron James", "Ray Allen"],
-                ["Chris Paul", "Carmelo Anthony", "LeBron James"],
-                ["Chris Paul", "Carmelo Anthony", "Dwyane Wade"],
-                ["Chris Paul", "Dwyane Wade", "LeBron James"],
-                ["Chris Paul", "Dwyane Wade", "Carmelo Anthony"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_no_existent_prop(self):
-        stmt = "GO FROM 'Tim Duncan' OVER serve YIELD $^.player.test"
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-        stmt = "GO FROM 'Tim Duncan' OVER serve yield $^.player.test"
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-        stmt = "GO FROM 'Tim Duncan' OVER serve YIELD serve.test"
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-    @pytest.mark.skip(reason="not support udf_is_in now!")
-    def test_is_incall(self):
-        stmt = '''GO FROM 'Boris Diaw' OVER serve \
-            WHERE udf_is_in($$.team.name, 'Hawks', 'Suns') \
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Boris Diaw", 2003, 2005, "Hawks"],
-                ["Boris Diaw", 2005, 2008, "Suns"],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id \
-            | GO FROM  $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123)'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Hornets"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id \
-            | GO FROM  $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) AND 1 == 1'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Hornets"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    @pytest.mark.skip(reason = 'return not implement')
-    def test_return_test(self):
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \
-            $rA = YIELD $A.* WHERE $A.dst == 123; \
-            RETURN $rA IF $rA IS NOT NULL; \
-            GO FROM $A.dst OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \
-            $rA = YIELD $A.* WHERE 1 == 1; \
-            RETURN $rA IF $rA IS NOT NULL; \
-            GO FROM $A.dst OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$A.dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dstA; \
-            $rA = YIELD $A.* WHERE $A.dstA == 123; \
-            RETURN $rA IF $rA IS NOT NULL; \
-            $B = GO FROM $A.dstA OVER like YIELD like._dst AS dstB; \
-            $rB = YIELD $B.* WHERE $B.dstB == 456; \
-            RETURN $rB IF $rB IS NOT NULL; \
-            GO FROM $B.dstB OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Trail Blazers"],
-                ["Spurs"],
-                ["Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \
-            $rA = YIELD $A.* WHERE $A.dst == 123; \
-            RETURN $rA IF $rA IS NOT NULL'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \
-            $rA = YIELD $A.* WHERE 1 == 1; \
-            RETURN $rA IF $rA IS NOT NULL'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$A.dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \
-            $rA = YIELD $A.* WHERE 1 == 1; \
-            RETURN $B IF $B IS NOT NULL'''
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-        stmt = '''$A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst; \
-            $rA = YIELD $A.* WHERE 1 == 1; \
-            RETURN $B IF $A IS NOT NULL'''
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-        # will return error
-        stmt = '''RETURN $rA IF $rA IS NOT NULL;'''
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-    def test_reversely_one_step(self):
-        stmt = "GO FROM 'Tim Duncan' OVER like REVERSELY YIELD like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Dejounte Murray"],
-                ["Shaquile O'Neal"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER like REVERSELY YIELD $$.player.name"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$$.player.name"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Dejounte Murray"],
-                ["Shaquile O'Neal"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Tim Duncan' OVER like REVERSELY \
-            WHERE $$.player.age < 35 \
-            YIELD $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$$.player.name"],
-            "rows": [
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Tiago Splitter"],
-                ["Dejounte Murray"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER * REVERSELY YIELD like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Dejounte Murray"],
-                ["Shaquile O'Neal"],
-                [T_EMPTY],
-                [T_EMPTY]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_only_id_n_steps(self):
-        stmt = "GO 2 STEPS FROM 'Tony Parker' OVER like YIELD like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["Tim Duncan"],
-                ["Tony Parker"],
-                ["Tony Parker"],
-                ["Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 3 STEPS FROM 'Tony Parker' OVER like YIELD like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Manu Ginobili"],
-                ["Tim Duncan"],
-                ["Tim Duncan"],
-                ["LaMarcus Aldridge"],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 1 STEPS FROM 'Tony Parker' OVER like YIELD like._dst AS id"\
-               " | GO 2 STEPS FROM $-.id OVER like YIELD like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["LaMarcus Aldridge"],
-                ["LaMarcus Aldridge"],
-                ["Manu Ginobili"],
-                ["Manu Ginobili"],
-                ["Tim Duncan"],
-                ["Tim Duncan"],
-                ["Tim Duncan"],
-                ["Manu Ginobili"],
-                ["Manu Ginobili"],
-                ["Tony Parker"],
-                ["Tony Parker"],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_reversely_two_steps(self):
-        stmt = "GO 2 STEPS FROM 'Kobe Bryant' OVER like REVERSELY YIELD $$.player.name"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$$.player.name"],
-            "rows": [
-                ["Marc Gasol"],
-                ["Vince Carter"],
-                ["Yao Ming"],
-                ["Grant Hill"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 2 STEPS FROM 'Kobe Bryant' OVER * REVERSELY YIELD $$.player.name"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$$.player.name"],
-            "rows": [
-                ["Marc Gasol"],
-                ["Vince Carter"],
-                ["Yao Ming"],
-                ["Grant Hill"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Manu Ginobili' OVER * REVERSELY YIELD like._dst AS id \
-            | GO FROM $-.id OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"],
-                ["Spurs"],
-                ["Hawks"],
-                ["76ers"],
-                ["Spurs"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_reversely_with_pipe(self):
-        stmt = '''GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id \
-            | GO FROM $-.id OVER serve REVERSELY YIELD $^.team.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.team.name", "$$.player.name"],
-            "rows": [
-                ["Cavaliers", "Danny Green"],
-                ["Cavaliers", "Danny Green"],
-                ["Cavaliers", "Dwyane Wade"],
-                ["Cavaliers", "Dwyane Wade"],
-                ["Cavaliers", "Kyrie Irving"],
-                ["Cavaliers", "Kyrie Irving"],
-                ["Cavaliers", "LeBron James"],
-                ["Cavaliers", "LeBron James"],
-                ["Cavaliers", "Shaquile O'Neal"],
-                ["Cavaliers", "Shaquile O'Neal"],
-                ["Cavaliers", "LeBron James"],
-                ["Cavaliers", "LeBron James"],
-
-                ["Heat", "Amar'e Stoudemire"],
-                ["Heat", "Dwyane Wade"],
-                ["Heat", "LeBron James"],
-                ["Heat", "Ray Allen"],
-                ["Heat", "Shaquile O'Neal"],
-                ["Heat", "Dwyane Wade"],
-                ["Lakers", "Dwight Howard"],
-                ["Lakers", "JaVale McGee"],
-                ["Lakers", "Kobe Bryant"],
-                ["Lakers", "LeBron James"],
-                ["Lakers", "Paul Gasol"],
-                ["Lakers", "Rajon Rondo"],
-                ["Lakers", "Shaquile O'Neal"],
-                ["Lakers", "Steve Nash"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id \
-            | GO FROM $-.id OVER serve REVERSELY WHERE $$.player.name != 'LeBron James' \
-            YIELD $^.team.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.team.name", "$$.player.name"],
-            "rows": [
-                ["Cavaliers", "Danny Green"],
-                ["Cavaliers", "Danny Green"],
-                ["Cavaliers", "Dwyane Wade"],
-                ["Cavaliers", "Dwyane Wade"],
-                ["Cavaliers", "Kyrie Irving"],
-                ["Cavaliers", "Kyrie Irving"],
-                ["Cavaliers", "Shaquile O'Neal"],
-                ["Cavaliers", "Shaquile O'Neal"],
-
-                ["Heat", "Amar'e Stoudemire"],
-
-                ["Heat", "Dwyane Wade"],
-                ["Heat", "Ray Allen"],
-                ["Heat", "Shaquile O'Neal"],
-                ["Heat", "Dwyane Wade"],
-
-                ["Lakers", "Dwight Howard"],
-                ["Lakers", "JaVale McGee"],
-                ["Lakers", "Kobe Bryant"],
-                ["Lakers", "Paul Gasol"],
-                ["Lakers", "Rajon Rondo"],
-                ["Lakers", "Shaquile O'Neal"],
-                ["Lakers", "Steve Nash"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Manu Ginobili' OVER like REVERSELY YIELD like._dst AS id \
-            | GO FROM $-.id OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Spurs"],
-                ["Spurs"],
-                ["Hornets"],
-                ["Spurs"],
-                ["Hawks"],
-                ["76ers"],
-                ["Spurs"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_bidirect(self):
-        stmt = "GO FROM 'Tim Duncan' OVER serve bidirect"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER like bidirect"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Dejounte Murray"],
-                ["Shaquile O'Neal"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER serve, like bidirect"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst"],
-            "rows": [
-                ["Spurs", T_EMPTY],
-                [T_EMPTY, "Tony Parker"],
-                [T_EMPTY, "Manu Ginobili"],
-                [T_EMPTY, "Tony Parker"],
-                [T_EMPTY, "Manu Ginobili"],
-                [T_EMPTY, "LaMarcus Aldridge"],
-                [T_EMPTY, "Marco Belinelli"],
-                [T_EMPTY, "Danny Green"],
-                [T_EMPTY, "Aron Baynes"],
-                [T_EMPTY, "Boris Diaw"],
-                [T_EMPTY, "Tiago Splitter"],
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "Shaquile O'Neal"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER serve bidirect YIELD $$.team.name"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$$.team.name"],
-            "rows": [
-                ["Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER like bidirect YIELD $$.player.name"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$$.player.name"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Dejounte Murray"],
-                ["Shaquile O'Neal"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Tim Duncan' OVER like bidirect WHERE like.likeness > 90 \
-            YIELD $^.player.name, like._dst, $$.player.name, like.likeness'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "like._dst", "$$.player.name", "like.likeness"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker", "Tony Parker", 95],
-                ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", 95],
-                ["Tim Duncan", "Tony Parker", "Tony Parker", 95],
-                ["Tim Duncan", "Dejounte Murray", "Dejounte Murray", 99]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_bidirect_over_all(self):
-        stmt = '''GO FROM 'Tim Duncan' OVER * bidirect \
-            YIELD $^.player.name, serve._dst, $$.team.name, like._dst, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve._dst", "$$.team.name", "like._dst", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Spurs", "Spurs", T_EMPTY, T_EMPTY],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Tony Parker", "Tony Parker"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Manu Ginobili", "Manu Ginobili"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Tony Parker", "Tony Parker"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Manu Ginobili", "Manu Ginobili"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "LaMarcus Aldridge", "LaMarcus Aldridge"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Marco Belinelli", "Marco Belinelli"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Danny Green", "Danny Green"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Aron Baynes", "Aron Baynes"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Boris Diaw", "Boris Diaw"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Tiago Splitter", "Tiago Splitter"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Dejounte Murray", "Dejounte Murray"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, "Shaquile O'Neal", "Shaquile O'Neal"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Tony Parker"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Manu Ginobili"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Danny Green"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "LaMarcus Aldridge"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Tony Parker"],
-                ["Tim Duncan", T_EMPTY, T_EMPTY, T_EMPTY, "Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO FROM 'Tim Duncan' OVER * bidirect"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst", "serve._dst", "teammate._dst"],
-            "rows": [
-                [T_EMPTY, "Spurs", T_EMPTY],
-                ["Tony Parker", T_EMPTY, T_EMPTY],
-                ["Manu Ginobili", T_EMPTY, T_EMPTY],
-                ["Tony Parker", T_EMPTY, T_EMPTY],
-                ["Manu Ginobili", T_EMPTY, T_EMPTY],
-                ["LaMarcus Aldridge", T_EMPTY, T_EMPTY],
-                ["Marco Belinelli", T_EMPTY, T_EMPTY],
-                ["Danny Green", T_EMPTY, T_EMPTY],
-                ["Aron Baynes", T_EMPTY, T_EMPTY],
-                ["Boris Diaw", T_EMPTY, T_EMPTY],
-                ["Tiago Splitter", T_EMPTY, T_EMPTY],
-                ["Dejounte Murray", T_EMPTY, T_EMPTY],
-                ["Shaquile O'Neal", T_EMPTY, T_EMPTY],
-                [T_EMPTY, T_EMPTY, "Tony Parker"],
-                [T_EMPTY, T_EMPTY, "Manu Ginobili"],
-                [T_EMPTY, T_EMPTY, "LaMarcus Aldridge"],
-                [T_EMPTY, T_EMPTY, "Danny Green"],
-                [T_EMPTY, T_EMPTY, "Tony Parker"],
-                [T_EMPTY, T_EMPTY, "Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_duplicate_column_name(self):
-        stmt = "GO FROM 'Tim Duncan' OVER serve YIELD serve._dst, serve._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "serve._dst"],
-            "rows": [
-                ["Spurs", "Spurs"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id, like.likeness AS id
-                  | GO FROM $-.id OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-        stmt = '''GO FROM 'Tim Duncan' OVER like, serve
-                  YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id
-                  | GO FROM $-.id OVER *'''
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-        stmt = '''$a = GO FROM 'Tim Duncan' OVER *
-                  YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id;
-                  | GO FROM $-.id OVER serve'''
-        resp = self.execute(stmt)
-        self.check_resp_failed(resp)
-
-    def test_contains(self):
-        """ the name_label is not a string any more, will be deprecated such a way of writing.
-        stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE $$.team.name CONTAINS Haw\
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Boris Diaw", 2003, 2005, "Hawks"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-        """
-
-        stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE $$.team.name CONTAINS \"Haw\"\
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Boris Diaw", 2003, 2005, "Hawks"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-
-        stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE (string)serve.start_year CONTAINS "05" \
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Boris Diaw", 2005, 2008, "Suns"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE $^.player.name CONTAINS "Boris" \
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$^.player.name", "serve.start_year", "serve.end_year", "$$.team.name"],
-            "rows": [
-                ["Boris Diaw", 2003, 2005, "Hawks"],
-                ["Boris Diaw", 2005, 2008, "Suns"],
-                ["Boris Diaw", 2008, 2012, "Hornets"],
-                ["Boris Diaw", 2012, 2016, "Spurs"],
-                ["Boris Diaw", 2016, 2017, "Jazz"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE !($^.player.name CONTAINS "Boris") \
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = '''GO FROM 'Boris Diaw' OVER serve WHERE "Leo" CONTAINS "Boris" \
-            YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-    # todo: add test for NOT_CONTAINS
-    # def test_not_contains(self):
-
-    def test_with_intermediate_data(self):
-        # zero to zero
-        stmt = "GO 0 TO 0 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        # simple
-        stmt = "GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Tim Duncan"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Tim Duncan"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like \
-            YIELD DISTINCT like._dst, like.likeness, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst", "like.likeness", "$$.player.name"],
-            "rows": [
-                ["Manu Ginobili", 95, "Manu Ginobili"],
-                ["LaMarcus Aldridge", 90, "LaMarcus Aldridge"],
-                ["Tim Duncan", 95, "Tim Duncan"],
-                ["Tony Parker", 95, "Tony Parker"],
-                ["Tony Parker", 75, "Tony Parker"],
-                ["Tim Duncan", 75, "Tim Duncan"],
-                ["Tim Duncan", 90, "Tim Duncan"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like \
-            YIELD DISTINCT like._dst, like.likeness, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst", "like.likeness", "$$.player.name"],
-            "rows": [
-                ["Manu Ginobili", 95, "Manu Ginobili"],
-                ["LaMarcus Aldridge", 90, "LaMarcus Aldridge"],
-                ["Tim Duncan", 95, "Tim Duncan"],
-                ["Tony Parker", 95, "Tony Parker"],
-                ["Tony Parker", 75, "Tony Parker"],
-                ["Tim Duncan", 75, "Tim Duncan"],
-                ["Tim Duncan", 90, "Tim Duncan"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 1 TO 3 STEPS FROM 'Tim Duncan' OVER serve"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Spurs"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 0 TO 3 STEPS FROM 'Tim Duncan' OVER serve"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                ["Spurs"]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 2 TO 3 STEPS FROM 'Tim Duncan' OVER serve"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        #reversely
-        stmt = "GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Boris Diaw"],
-                ["Dejounte Murray"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Tiago Splitter"],
-                ["Shaquile O'Neal"],
-                ["Rudy Gay"],
-                ["Damian Lillard"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Boris Diaw"],
-                ["Dejounte Murray"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Tiago Splitter"],
-                ["Shaquile O'Neal"],
-                ["Rudy Gay"],
-                ["Damian Lillard"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 2 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Boris Diaw"],
-                ["Dejounte Murray"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Tiago Splitter"],
-                ["Shaquile O'Neal"],
-                ["Rudy Gay"],
-                ["Damian Lillard"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # empty starts before last step
-        stmt = "GO 1 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Rudy Gay"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Kyle Anderson"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Cory Joseph"],
-                ["David West"],
-                ["Jonathon Simmons"],
-                ["Dejounte Murray"],
-                ["Tracy McGrady"],
-                ["Paul Gasol"],
-                ["Marco Belinelli"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 0 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["LaMarcus Aldridge"],
-                ["Rudy Gay"],
-                ["Marco Belinelli"],
-                ["Danny Green"],
-                ["Kyle Anderson"],
-                ["Aron Baynes"],
-                ["Boris Diaw"],
-                ["Tiago Splitter"],
-                ["Cory Joseph"],
-                ["David West"],
-                ["Jonathon Simmons"],
-                ["Dejounte Murray"],
-                ["Tracy McGrady"],
-                ["Paul Gasol"],
-                ["Marco Belinelli"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # bidirectionally
-        stmt = "GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Boris Diaw"],
-                ["Dejounte Murray"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Tiago Splitter"],
-                ["Shaquile O'Neal"],
-                ["Rudy Gay"],
-                ["Damian Lillard"],
-                ["LeBron James"],
-                ["Russell Westbrook"],
-                ["Chris Paul"],
-                ["Kyle Anderson"],
-                ["Kevin Durant"],
-                ["James Harden"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-
-        stmt = "GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["like._dst"],
-            "rows": [
-                ["Tim Duncan"],
-                ["LaMarcus Aldridge"],
-                ["Marco Belinelli"],
-                ["Boris Diaw"],
-                ["Dejounte Murray"],
-                ["Tony Parker"],
-                ["Manu Ginobili"],
-                ["Danny Green"],
-                ["Aron Baynes"],
-                ["Tiago Splitter"],
-                ["Shaquile O'Neal"],
-                ["Rudy Gay"],
-                ["Damian Lillard"],
-                ["LeBron James"],
-                ["Russell Westbrook"],
-                ["Chris Paul"],
-                ["Kyle Anderson"],
-                ["Kevin Durant"],
-                ["James Harden"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # over *
-        stmt = "GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst"],
-            "rows": [
-                ["Thunders", T_EMPTY],
-                [T_EMPTY, "Paul George"],
-                [T_EMPTY, "James Harden"],
-                ["Pacers", T_EMPTY],
-                ["Thunders", T_EMPTY],
-                [T_EMPTY, "Russell Westbrook"],
-                ["Thunders", T_EMPTY],
-                ["Rockets", T_EMPTY],
-                [T_EMPTY, "Russell Westbrook"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = "GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst"],
-            "rows": [
-                ["Thunders", T_EMPTY],
-                [T_EMPTY, "Paul George"],
-                [T_EMPTY, "James Harden"],
-                ["Pacers", T_EMPTY],
-                ["Thunders", T_EMPTY],
-                [T_EMPTY, "Russell Westbrook"],
-                ["Thunders", T_EMPTY],
-                ["Rockets", T_EMPTY],
-                [T_EMPTY, "Russell Westbrook"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # with properties
-        stmt = '''GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * \
-            YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst", "serve.start_year", "like.likeness", "$$.player.name"],
-            "rows": [
-                ["Thunders", T_EMPTY, 2008, T_EMPTY, T_EMPTY],
-                [T_EMPTY, "Paul George", T_EMPTY, 90, "Paul George"],
-                [T_EMPTY, "James Harden", T_EMPTY, 90, "James Harden"],
-                ["Pacers", T_EMPTY, 2010, T_EMPTY, T_EMPTY],
-                ["Thunders", T_EMPTY, 2017, T_EMPTY, T_EMPTY],
-                [T_EMPTY, "Russell Westbrook", T_EMPTY, 95, "Russell Westbrook"],
-                ["Thunders", T_EMPTY, 2009, T_EMPTY, T_EMPTY],
-                ["Rockets", T_EMPTY, 2012, T_EMPTY, T_EMPTY],
-                [T_EMPTY, "Russell Westbrook", T_EMPTY, 80, "Russell Westbrook"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * \
-            YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst", "serve.start_year", "like.likeness", "$$.player.name"],
-            "rows": [
-                ["Thunders", T_EMPTY, 2008, T_EMPTY, T_EMPTY],
-                [T_EMPTY, "Paul George", T_EMPTY, 90, "Paul George"],
-                [T_EMPTY, "James Harden", T_EMPTY, 90, "James Harden"],
-                ["Pacers", T_EMPTY, 2010, T_EMPTY, T_EMPTY],
-                ["Thunders", T_EMPTY, 2017, T_EMPTY, T_EMPTY],
-                [T_EMPTY, "Russell Westbrook", T_EMPTY, 95, "Russell Westbrook"],
-                ["Thunders", T_EMPTY, 2009, T_EMPTY, T_EMPTY],
-                ["Rockets", T_EMPTY, 2012, T_EMPTY, T_EMPTY],
-                [T_EMPTY, "Russell Westbrook", T_EMPTY, 80, "Russell Westbrook"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * \
-            REVERSELY YIELD serve._dst, like._dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst"],
-            "rows": [
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "James Harden"],
-                [T_EMPTY, "Paul George"],
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "Russell Westbrook"],
-                [T_EMPTY, "Luka Doncic"],
-                [T_EMPTY, "Russell Westbrook"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * \
-            REVERSELY YIELD serve._dst, like._dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["serve._dst", "like._dst"],
-            "rows": [
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "James Harden"],
-                [T_EMPTY, "Paul George"],
-                [T_EMPTY, "Dejounte Murray"],
-                [T_EMPTY, "Russell Westbrook"],
-                [T_EMPTY, "Luka Doncic"],
-                [T_EMPTY, "Russell Westbrook"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_error_massage(self):
-        stmt = "GO FROM 'Tim Duncan' OVER serve YIELD $$.player.name as name"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": [],
-            "rows": [
-                [T_EMPTY]
-            ]
-        }
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_zero_step(self):
-        stmt = "GO 0 STEPS FROM 'Tim Duncan' OVER serve BIDIRECT"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = "GO 0 STEPS FROM 'Tim Duncan' OVER serve"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-        stmt = "GO 0 STEPS FROM 'Tim Duncan' OVER like YIELD like._dst as id \
-                | GO FROM $-.id OVER serve"
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        self.check_empty_result(resp)
-
-    def test_go_cover_input(self):
-        stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst \
-            | GO FROM $-.src OVER like \
-            YIELD $-.src as src, like._dst as dst, $^.player.name, $$.player.name'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["src", "dst", "$^.player.name", "$$.player.name"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker", "Tim Duncan", "Tony Parker"],
-                ["Tim Duncan", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker", "Tim Duncan", "Tony Parker"],
-                ["Tim Duncan", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$a = GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst; \
-            GO FROM $a.src OVER like YIELD $a.src as src, like._dst as dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["src", "dst"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker"],
-                ["Tim Duncan", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker"],
-                ["Tim Duncan", "Manu Ginobili"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # with intermidate data pipe
-        stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst \
-            | GO 1 TO 2 STEPS FROM $-.src OVER like YIELD $-.src as src, like._dst as dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["src", "dst"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker"],
-                ["Tim Duncan", "Manu Ginobili"],
-                ["Tim Duncan", "Tony Parker"],
-                ["Tim Duncan", "Manu Ginobili"],
-
-                ["Tim Duncan", "Tim Duncan"],
-                ["Tim Duncan", "Tim Duncan"],
-                ["Tim Duncan", "Manu Ginobili"],
-                ["Tim Duncan", "Manu Ginobili"],
-                ["Tim Duncan", "LaMarcus Aldridge"],
-                ["Tim Duncan", "LaMarcus Aldridge"],
-                ["Tim Duncan", "Tim Duncan"],
-                ["Tim Duncan", "Tim Duncan"],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # var with properties
-        stmt = '''GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst \
-            | GO 1 TO 2 STEPS FROM $-.src OVER like \
-            YIELD $-.src as src, $-.dst, like._dst as dst, like.likeness'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["src", "$-.dst", "dst", "like.likeness"],
-            "rows": [
-                ["Tim Duncan", "Tony Parker", "Tony Parker", 95],
-                ["Tim Duncan", "Tony Parker", "Manu Ginobili", 95],
-                ["Tim Duncan", "Manu Ginobili", "Tony Parker", 95],
-                ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", 95],
-
-                ["Tim Duncan", "Tony Parker", "Tim Duncan", 95],
-                ["Tim Duncan", "Tony Parker", "Manu Ginobili", 95],
-                ["Tim Duncan", "Tony Parker", "LaMarcus Aldridge", 90],
-                ["Tim Duncan", "Tony Parker", "Tim Duncan", 90],
-                ["Tim Duncan", "Manu Ginobili", "Tim Duncan", 95],
-                ["Tim Duncan", "Manu Ginobili", "Manu Ginobili", 95],
-                ["Tim Duncan", "Manu Ginobili", "LaMarcus Aldridge", 90],
-                ["Tim Duncan", "Manu Ginobili", "Tim Duncan", 90],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # partial neighbors input
-        stmt = '''GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst \
-            | GO FROM $-.dst OVER teammate YIELD $-.src AS src, $-.dst, teammate._dst AS dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["src", "$-.dst", "dst"],
-            "rows": [
-                ["Danny Green", "Tim Duncan", "Tony Parker"],
-                ["Danny Green", "Tim Duncan", "Manu Ginobili"],
-                ["Danny Green", "Tim Duncan", "LaMarcus Aldridge"],
-                ["Danny Green", "Tim Duncan", "Danny Green"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        # var
-        stmt = '''$a = GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst; \
-            GO FROM $a.dst OVER teammate YIELD $a.src AS src, $a.dst, teammate._dst AS dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["src", "$a.dst", "dst"],
-            "rows": [
-                ["Danny Green", "Tim Duncan", "Tony Parker"],
-                ["Danny Green", "Tim Duncan", "Manu Ginobili"],
-                ["Danny Green", "Tim Duncan", "LaMarcus Aldridge"],
-                ["Danny Green", "Tim Duncan", "Danny Green"]
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-    def test_backtrack_overlap(self):
-        stmt = '''GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst \
-            | GO 2 STEPS FROM $-.src OVER like YIELD $-.src, $-.dst, like._src, like._dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$-.src", "$-.dst", "like._src", "like._dst"],
-            "rows": [
-                ["Tony Parker", "Tim Duncan", "Tim Duncan", "Manu Ginobili"],
-                ["Tony Parker", "Tim Duncan", "Tim Duncan", "Tony Parker"],
-                ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tony Parker"],
-                ["Tony Parker", "Tim Duncan", "Manu Ginobili", "Tim Duncan"],
-                ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tim Duncan"],
-                ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"],
-                ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Tony Parker"],
-                ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tony Parker"],
-                ["Tony Parker", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"],
-                ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tim Duncan"],
-                ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Manu Ginobili"],
-                ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Tony Parker"],
-                ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tony Parker"],
-                ["Tony Parker", "LaMarcus Aldridge", "Manu Ginobili", "Tim Duncan"],
-                ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tim Duncan"],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
-
-        stmt = '''$a = GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst; \
-            GO 2 STEPS FROM $a.src OVER like YIELD $a.src, $a.dst, like._src, like._dst'''
-        resp = self.execute(stmt)
-        self.check_resp_succeeded(resp)
-        expected_data = {
-            "column_names": ["$a.src", "$a.dst", "like._src", "like._dst"],
-            "rows": [
-                ["Tony Parker", "Tim Duncan", "Tim Duncan", "Manu Ginobili"],
-                ["Tony Parker", "Tim Duncan", "Tim Duncan", "Tony Parker"],
-                ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tony Parker"],
-                ["Tony Parker", "Tim Duncan", "Manu Ginobili", "Tim Duncan"],
-                ["Tony Parker", "Tim Duncan", "LaMarcus Aldridge", "Tim Duncan"],
-                ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Manu Ginobili"],
-                ["Tony Parker", "Manu Ginobili", "Tim Duncan", "Tony Parker"],
-                ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tony Parker"],
-                ["Tony Parker", "Manu Ginobili", "Manu Ginobili", "Tim Duncan"],
-                ["Tony Parker", "Manu Ginobili", "LaMarcus Aldridge", "Tim Duncan"],
-                ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Manu Ginobili"],
-                ["Tony Parker", "LaMarcus Aldridge", "Tim Duncan", "Tony Parker"],
-                ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tony Parker"],
-                ["Tony Parker", "LaMarcus Aldridge", "Manu Ginobili", "Tim Duncan"],
-                ["Tony Parker", "LaMarcus Aldridge", "LaMarcus Aldridge", "Tim Duncan"],
-            ]
-        }
-        self.check_column_names(resp, expected_data["column_names"])
-        self.check_out_of_order_result(resp, expected_data["rows"])
diff --git a/tests/tck/conftest.py b/tests/tck/conftest.py
index ebb9fc26f131157d822444d56ed100db15ea43dd..22575c5ab78946e337fb611253690037a9b35b43 100644
--- a/tests/tck/conftest.py
+++ b/tests/tck/conftest.py
@@ -151,13 +151,14 @@ def execution_should_be_succ(graph_spaces):
     assert rs is not None, "Please execute a query at first"
     assert rs.is_succeeded(), f"Response failed: {rs.error_msg()}"
 
-
-@then(rparse(r"a (?P<err_type>\w+) should be raised at (?P<time>.*):(?P<msg>.*)"))
+@then(
+    rparse("a (?P<err_type>\w+) should be raised at (?P<time>runtime|compile time):(?P<msg>.*)")
+)
 def raised_type_error(err_type, time, msg, graph_spaces):
     res = graph_spaces["result_set"]
     assert not res.is_succeeded(), "Response should be failed"
     err_type = err_type.strip()
-    msg = msg.strip().replace('$', r'\$')
+    msg = msg.strip().replace('$', r'\$').replace('^', r"\^")
     res_msg = res.error_msg()
     if res.error_code() == ErrorCode.E_EXECUTION_ERROR:
         assert err_type == "ExecutionError"
diff --git a/tests/tck/features/go/go.feature b/tests/tck/features/go/go.feature
new file mode 100644
index 0000000000000000000000000000000000000000..269b1b8851ac2137dc7b9301d854d559d3c1f6ad
--- /dev/null
+++ b/tests/tck/features/go/go.feature
@@ -0,0 +1,1581 @@
+Feature: Go Sentence
+
+  Background: Prepare space
+    Given a graph with space named "nba"
+
+  Scenario: one step
+    When executing query:
+      """
+      GO FROM "Tim Duncan" OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+    When executing query:
+      """
+      GO FROM "Tim Duncan", "Tim Duncan" OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+      | "Spurs"    |
+    When executing query:
+      """
+      YIELD "Tim Duncan" as vid | GO FROM $-.vid OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+    When executing query:
+      """
+      GO FROM "Boris Diaw" OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+      | "Boris Diaw"   | 2008             | 2012           | "Hornets"    |
+      | "Boris Diaw"   | 2012             | 2016           | "Spurs"      |
+      | "Boris Diaw"   | 2016             | 2017           | "Jazz"       |
+    When executing query:
+      """
+      GO FROM "Rajon Rondo" OVER serve WHERE serve.start_year >= 2013 AND serve.end_year <= 2018
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Rajon Rondo"  | 2014             | 2015           | "Mavericks"  |
+      | "Rajon Rondo"  | 2015             | 2016           | "Kings"      |
+      | "Rajon Rondo"  | 2016             | 2017           | "Bulls"      |
+      | "Rajon Rondo"  | 2017             | 2018           | "Pelicans"   |
+    When executing query:
+      """
+      GO FROM "Boris Diaw" OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Hornets"       |
+      | "Trail Blazers" |
+    When executing query:
+      """
+      GO FROM 'Thunders' OVER serve REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst          |
+      | "Russell Westbrook" |
+      | "Kevin Durant"      |
+      | "James Harden"      |
+      | "Carmelo Anthony"   |
+      | "Paul George"       |
+      | "Ray Allen"         |
+    When executing query:
+      """
+      GO FROM "Boris Diaw" OVER like YIELD like._dst as id
+      |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Hornets"       |
+      | "Trail Blazers" |
+    When executing query:
+      """
+      GO FROM "No Exist Vertex Id" OVER like YIELD like._dst as id
+      |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO FROM "Boris Diaw" OVER like, serve YIELD like._dst as id
+      |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Hornets"       |
+      | "Trail Blazers" |
+
+  Scenario: assignment simple
+    When executing query:
+      """
+      $var = GO FROM "Tracy McGrady" OVER like YIELD like._dst as id; GO FROM $var.id OVER like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tracy McGrady"     |
+      | "LaMarcus Aldridge" |
+
+  Scenario: assignment pipe
+    When executing query:
+      """
+      $var = (GO FROM "Tracy McGrady" OVER like YIELD like._dst as id | GO FROM $-.id OVER like YIELD like._dst as id);
+      GO FROM $var.id OVER like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst     |
+      | "Kobe Bryant" |
+      | "Grant Hill"  |
+      | "Rudy Gay"    |
+      | "Tony Parker" |
+      | "Tim Duncan"  |
+
+  Scenario: pipe only yield input prop
+    When executing query:
+      """
+      GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD $-.vid as id
+      """
+    Then the result should be, in any order, with relax comparison:
+      | id            |
+      | "Kobe Bryant" |
+      | "Grant Hill"  |
+      | "Rudy Gay"    |
+
+  Scenario: pipe only yield constant
+    When executing query:
+      """
+      GO FROM "Tracy McGrady" OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD 3
+      """
+    Then the result should be, in any order, with relax comparison:
+      | 3 |
+      | 3 |
+      | 3 |
+      | 3 |
+
+  Scenario: assignment empty result
+    When executing query:
+      """
+      $var = GO FROM "-1" OVER like YIELD like._dst as id; GO FROM $var.id OVER like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst |
+
+  Scenario: variable undefined
+    When executing query:
+      """
+      GO FROM $var OVER like
+      """
+    Then a SyntaxError should be raised at runtime: syntax error near `OVER'
+
+  Scenario: distinct
+    When executing query:
+      """
+      GO FROM "Nobody" OVER serve YIELD DISTINCT $^.player.name as name, $$.team.name as name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | name | name |
+    When executing query:
+      """
+      GO FROM "Boris Diaw" OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER serve
+      YIELD DISTINCT serve._dst, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      | $$.team.name    |
+      | "Spurs"         | "Spurs"         |
+      | "Hornets"       | "Hornets"       |
+      | "Trail Blazers" | "Trail Blazers" |
+    When executing query:
+      """
+      GO 2 STEPS FROM "Tony Parker" OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst       |
+      | "Tim Duncan"    |
+      | "Tony Parker"   |
+      | "Manu Ginobili" |
+
+  Scenario: vertex noexist
+    When executing query:
+      """
+      GO FROM "NON EXIST VERTEX ID" OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO FROM "NON EXIST VERTEX ID" OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+    When executing query:
+      """
+      GO FROM "NON EXIST VERTEX ID" OVER serve YIELD DISTINCT $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+
+  Scenario: empty input
+    When executing query:
+      """
+      GO FROM "NON EXIST VERTEX ID" OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO FROM "NON EXIST VERTEX ID" OVER serve YIELD serve._dst as id, serve.start_year as start
+      | YIELD $-.id as id WHERE $-.start > 20000
+      | Go FROM $-.id over serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+
+  Scenario: multi edges over all
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst         |
+      | EMPTY      | "James Harden"    |
+      | EMPTY      | "Dejounte Murray" |
+      | EMPTY      | "Paul George"     |
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER * REVERSELY YIELD serve._src, like._src
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._src | like._src           |
+      | EMPTY      | "Russell Westbrook" |
+      | EMPTY      | "Russell Westbrook" |
+      | EMPTY      | "Russell Westbrook" |
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER * REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst         | serve._dst | teammate._dst |
+      | "James Harden"    | EMPTY      | EMPTY         |
+      | "Dejounte Murray" | EMPTY      | EMPTY         |
+      | "Paul George"     | EMPTY      | EMPTY         |
+    When executing query:
+      """
+      GO FROM "Dirk Nowitzki" OVER * YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst  | like._dst     |
+      | "Mavericks" | EMPTY         |
+      | EMPTY       | "Steve Nash"  |
+      | EMPTY       | "Jason Kidd"  |
+      | EMPTY       | "Dwyane Wade" |
+    When executing query:
+      """
+      GO FROM "Paul Gasol" OVER *
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst     | serve._dst  | teammate._dst |
+      | EMPTY         | "Grizzlies" | EMPTY         |
+      | EMPTY         | "Lakers"    | EMPTY         |
+      | EMPTY         | "Bulls"     | EMPTY         |
+      | EMPTY         | "Spurs"     | EMPTY         |
+      | EMPTY         | "Bucks"     | EMPTY         |
+      | "Kobe Bryant" | EMPTY       | EMPTY         |
+      | "Marc Gasol"  | EMPTY       | EMPTY         |
+    When executing query:
+      """
+      GO FROM "Manu Ginobili" OVER * REVERSELY YIELD like.likeness, teammate.start_year, serve.start_year, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like.likeness | teammate.start_year | serve.start_year | $$.player.name    |
+      | 95            | EMPTY               | EMPTY            | "Tim Duncan"      |
+      | 95            | EMPTY               | EMPTY            | "Tony Parker"     |
+      | 90            | EMPTY               | EMPTY            | "Tiago Splitter"  |
+      | 99            | EMPTY               | EMPTY            | "Dejounte Murray" |
+      | EMPTY         | 2002                | EMPTY            | "Tim Duncan"      |
+      | EMPTY         | 2002                | EMPTY            | "Tony Parker"     |
+    When executing query:
+      """
+      GO FROM "LaMarcus Aldridge" OVER * YIELD $$.team.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.team.name    | $$.player.name |
+      | "Trail Blazers" | EMPTY          |
+      | EMPTY           | "Tim Duncan"   |
+      | EMPTY           | "Tony Parker"  |
+      | "Spurs"         | EMPTY          |
+    When executing query:
+      """
+      GO FROM "Boris Diaw" OVER * YIELD like._dst as id
+      | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Hornets"       |
+      | "Trail Blazers" |
+
+  @skip
+  Scenario: edge type
+    When executing query:
+      """
+      YIELD serve.start_year, like.likeness, serve._type, like._type
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve.start_year | like.likeness | serve._type | like._type |
+      | 2008             | EMPTY         | 6           | EMPTY      |
+      | EMPTY            | 90            | EMPTY       | 5          |
+      | EMPTY            | 90            | EMPTY       | 5          |
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER serve, like REVERSELY
+      YIELD serve._dst, like._dst, serve._type, like._type
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst         | serve._type | like._type |
+      | EMPTY      | "James Harden"    | EMPTY       | -5         |
+      | EMPTY      | "Dejounte Murray" | EMPTY       | -5         |
+      | EMPTY      | "Paul George"     | EMPTY       | -5         |
+
+  Scenario: multi edges
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER serve, like  YIELD serve.start_year, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve.start_year | like.likeness |
+      | 2008             | EMPTY         |
+      | EMPTY            | 90            |
+      | EMPTY            | 90            |
+    When executing query:
+      """
+      GO FROM "Shaquile O\'Neal" OVER serve, like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst  | like._dst      |
+      | "Magic"     | EMPTY          |
+      | "Lakers"    | EMPTY          |
+      | "Heat"      | EMPTY          |
+      | "Suns"      | EMPTY          |
+      | "Cavaliers" | EMPTY          |
+      | "Celtics"   | EMPTY          |
+      | EMPTY       | "JaVale McGee" |
+      | EMPTY       | "Tim Duncan"   |
+    When executing query:
+      """
+      GO FROM 'Russell Westbrook' OVER serve, like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst      |
+      | "Thunders" | EMPTY          |
+      | EMPTY      | "Paul George"  |
+      | EMPTY      | "James Harden" |
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER serve, like REVERSELY
+      YIELD serve._dst, like._dst, serve.start_year, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst         | serve.start_year | like.likeness |
+      | EMPTY      | "James Harden"    | EMPTY            | 80            |
+      | EMPTY      | "Dejounte Murray" | EMPTY            | 99            |
+      | EMPTY      | "Paul George"     | EMPTY            | 95            |
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER serve, like REVERSELY YIELD serve._src, like._src
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._src | like._src           |
+      | EMPTY      | "Russell Westbrook" |
+      | EMPTY      | "Russell Westbrook" |
+      | EMPTY      | "Russell Westbrook" |
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER serve, like REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst         |
+      | EMPTY      | "James Harden"    |
+      | EMPTY      | "Dejounte Murray" |
+      | EMPTY      | "Paul George"     |
+    When executing query:
+      """
+      GO FROM "Manu Ginobili" OVER like, teammate REVERSELY YIELD like.likeness, teammate.start_year, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like.likeness | teammate.start_year | $$.player.name    |
+      | 95            | EMPTY               | "Tim Duncan"      |
+      | 95            | EMPTY               | "Tony Parker"     |
+      | 90            | EMPTY               | "Tiago Splitter"  |
+      | 99            | EMPTY               | "Dejounte Murray" |
+      | EMPTY         | 2002                | "Tim Duncan"      |
+      | EMPTY         | 2002                | "Tony Parker"     |
+
+  Scenario: multi edges with filter
+    When executing query:
+      """
+      GO FROM "Russell Westbrook" OVER serve, like WHERE serve.start_year > 2000
+      YIELD serve.start_year, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve.start_year | like.likeness |
+      | 2008             | EMPTY         |
+    When executing query:
+      """
+      GO FROM "Manu Ginobili" OVER like, teammate REVERSELY WHERE like.likeness > 90
+      YIELD like.likeness, teammate.start_year, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like.likeness | teammate.start_year | $$.player.name    |
+      | 95            | EMPTY               | "Tim Duncan"      |
+      | 95            | EMPTY               | "Tony Parker"     |
+      | 99            | EMPTY               | "Dejounte Murray" |
+    When executing query:
+      """
+      GO FROM "Manu Ginobili" OVER * WHERE $$.player.age > 30 or $$.team.name not starts with "Rockets"
+      YIELD DISTINCT $$.player.age, $$.player.name, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.age | $$.player.name | $$.team.name |
+      | EMPTY         | EMPTY          | "Spurs"      |
+      | 42            | "Tim Duncan"   | EMPTY        |
+      | 36            | "Tony Parker"  | EMPTY        |
+    When executing query:
+      """
+      GO FROM "Manu Ginobili" OVER like, teammate REVERSELY WHERE $$.player.age > 30 and $$.player.age < 40
+      YIELD DISTINCT $$.player.age, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.age | $$.player.name   |
+      | 34            | "Tiago Splitter" |
+      | 36            | "Tony Parker"    |
+
+  Scenario: reference pipe in yield and where
+    When executing query:
+      """
+      GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id
+      | GO FROM $-.id OVER like YIELD $-.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.name      | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id
+      | GO FROM $-.id OVER like WHERE $-.name != $$.player.name YIELD $-.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.name      | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+
+  @skip
+  Scenario: all prop(reson = $-.* over * $var.* not implement)
+    When executing query:
+      """
+      GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id
+      | GO FROM $-.id OVER like YIELD $-.*, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.*         | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+    When executing query:
+      """
+      $var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id;
+      GO FROM $var.id OVER like YIELD $var.*, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $var.*       | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+
+  Scenario: reference variable in yield and where
+    When executing query:
+      """
+      $var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id;
+      GO FROM $var.id OVER like YIELD $var.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $var.name    | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+    When executing query:
+      """
+      $var = GO FROM 'Tim Duncan', 'Chris Paul' OVER like YIELD $^.player.name AS name, like._dst AS id;
+      GO FROM $var.id OVER like  WHERE $var.name != $$.player.name YIELD $var.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $var.name    | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+
+  Scenario: no exist prop
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve YIELD $^.player.test
+      """
+    Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'.
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve yield $^.player.test
+      """
+    Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'.
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve YIELD serve.test
+      """
+    Then a SemanticError should be raised at runtime: `serve.test', not found the property `test'.
+
+  @skip
+  Scenario: udf call (reason = "not support udf_is_in now")
+    When executing query:
+      """
+      GO FROM 'Boris Diaw' OVER serve WHERE udf_is_in($$.team.name, 'Hawks', 'Suns')
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id
+      | GO FROM  $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+      | "Hornets"  |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id
+      | GO FROM  $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) AND 1 == 1
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+      | "Hornets"  |
+
+  @skip
+  Scenario: return test (reason = "return not implement")
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE $A.dst == 123;
+      RETURN $rA IF $rA IS NOT NULL;
+      GO FROM $A.dst OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+      | "Spurs"    |
+      | "Hornets"  |
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE 1 == 1;
+      RETURN $rA IF $rA IS NOT NULL;
+      GO FROM $A.dst OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Tony Parker"   |
+      | "Manu Ginobili" |
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dstA;
+      $rA = YIELD $A.* WHERE $A.dstA == 123;
+      RETURN $rA IF $rA IS NOT NULL;
+      $B = GO FROM $A.dstA OVER like YIELD like._dst AS dstB;
+      $rB = YIELD $B.* WHERE $B.dstB == 456;
+      RETURN $rB IF $rB IS NOT NULL;
+      GO FROM $B.dstB OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Spurs"         |
+      | "Spurs"         |
+      | "Trail Blazers" |
+      | "Spurs"         |
+      | "Spurs"         |
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE $A.dst == 123;
+      RETURN $rA IF $rA IS NOT NULL;
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE 1 == 1;
+      RETURN $rA IF $rA IS NOT NULL;
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | "Tony Parker"   |
+      | "Manu Ginobili" |
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst;
+       $rA = YIELD $A.* WHERE 1 == 1;
+        RETURN $B IF $B IS NOT NULL
+      """
+    Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a'
+    When executing query:
+      """
+      $A = GO FROM 'Tim Duncan' OVER like YIELD like._dst AS dst;
+       $rA = YIELD $A.* WHERE 1 == 1;
+        RETURN $B IF $A IS NOT NULL
+      """
+    Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a'
+    When executing query:
+      """
+      RETURN $rA IF $rA IS NOT NULL;
+      """
+    Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a'
+
+  Scenario: reverse one step
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like REVERSELY YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like REVERSELY YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name      |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like REVERSELY WHERE $$.player.age < 35 YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name      |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER * REVERSELY YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+      | EMPTY               |
+      | EMPTY               |
+
+  Scenario: only id n steps
+    When executing query:
+      """
+      GO 2 STEPS FROM 'Tony Parker' OVER like YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst       |
+      | "Tim Duncan"    |
+      | "Tim Duncan"    |
+      | "Tony Parker"   |
+      | "Tony Parker"   |
+      | "Manu Ginobili" |
+    When executing query:
+      """
+      GO 3 STEPS FROM 'Tony Parker' OVER like YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Manu Ginobili"     |
+      | "Tim Duncan"        |
+      | "Tim Duncan"        |
+      | "LaMarcus Aldridge" |
+    When executing query:
+      """
+      GO 1 STEPS FROM 'Tony Parker' OVER like YIELD like._dst AS id
+      | GO 2 STEPS FROM $-.id OVER like YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "LaMarcus Aldridge" |
+      | "LaMarcus Aldridge" |
+      | "Manu Ginobili"     |
+      | "Manu Ginobili"     |
+      | "Tim Duncan"        |
+      | "Tim Duncan"        |
+      | "Tim Duncan"        |
+      | "Manu Ginobili"     |
+      | "Manu Ginobili"     |
+      | "Tony Parker"       |
+      | "Tony Parker"       |
+
+  Scenario: reverse two steps
+    When executing query:
+      """
+      GO 2 STEPS FROM 'Kobe Bryant' OVER like REVERSELY YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name |
+      | "Marc Gasol"   |
+      | "Vince Carter" |
+      | "Yao Ming"     |
+      | "Grant Hill"   |
+    When executing query:
+      """
+      GO FROM 'Manu Ginobili' OVER * REVERSELY YIELD like._dst AS id
+      | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+      | "Spurs"    |
+      | "Hornets"  |
+      | "Spurs"    |
+      | "Hawks"    |
+      | "76ers"    |
+      | "Spurs"    |
+
+  Scenario: reverse with pipe
+    When executing query:
+      """
+      GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id
+      | GO FROM $-.id OVER serve REVERSELY YIELD $^.team.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.team.name | $$.player.name      |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Heat"       | "Amar'e Stoudemire" |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Heat"       | "LeBron James"      |
+      | "Heat"       | "Ray Allen"         |
+      | "Heat"       | "Shaquile O'Neal"   |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Lakers"     | "Dwight Howard"     |
+      | "Lakers"     | "JaVale McGee"      |
+      | "Lakers"     | "Kobe Bryant"       |
+      | "Lakers"     | "LeBron James"      |
+      | "Lakers"     | "Paul Gasol"        |
+      | "Lakers"     | "Rajon Rondo"       |
+      | "Lakers"     | "Shaquile O'Neal"   |
+      | "Lakers"     | "Steve Nash"        |
+    When executing query:
+      """
+      GO FROM 'LeBron James' OVER serve YIELD serve._dst AS id
+      | GO FROM $-.id OVER serve REVERSELY WHERE $$.player.name != 'LeBron James'
+      YIELD $^.team.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.team.name | $$.player.name      |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Heat"       | "Amar'e Stoudemire" |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Heat"       | "Ray Allen"         |
+      | "Heat"       | "Shaquile O'Neal"   |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Lakers"     | "Dwight Howard"     |
+      | "Lakers"     | "JaVale McGee"      |
+      | "Lakers"     | "Kobe Bryant"       |
+      | "Lakers"     | "Paul Gasol"        |
+      | "Lakers"     | "Rajon Rondo"       |
+      | "Lakers"     | "Shaquile O'Neal"   |
+      | "Lakers"     | "Steve Nash"        |
+    When executing query:
+      """
+      GO FROM 'Manu Ginobili' OVER like REVERSELY YIELD like._dst AS id
+      | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+      | "Spurs"    |
+      | "Spurs"    |
+      | "Spurs"    |
+      | "Hornets"  |
+      | "Hawks"    |
+      | "76ers"    |
+
+  Scenario: bidirect
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve, like bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           |
+      | "Spurs"    | EMPTY               |
+      | EMPTY      | "Tony Parker"       |
+      | EMPTY      | "Manu Ginobili"     |
+      | EMPTY      | "Tony Parker"       |
+      | EMPTY      | "Manu Ginobili"     |
+      | EMPTY      | "LaMarcus Aldridge" |
+      | EMPTY      | "Marco Belinelli"   |
+      | EMPTY      | "Danny Green"       |
+      | EMPTY      | "Aron Baynes"       |
+      | EMPTY      | "Boris Diaw"        |
+      | EMPTY      | "Tiago Splitter"    |
+      | EMPTY      | "Dejounte Murray"   |
+      | EMPTY      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve bidirect YIELD $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.team.name |
+      | "Spurs"      |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like bidirect YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name      |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like bidirect WHERE like.likeness > 90
+      YIELD $^.player.name, like._dst, $$.player.name, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | like._dst         | $$.player.name    | like.likeness |
+      | "Tim Duncan"   | "Tony Parker"     | "Tony Parker"     | 95            |
+      | "Tim Duncan"   | "Manu Ginobili"   | "Manu Ginobili"   | 95            |
+      | "Tim Duncan"   | "Tony Parker"     | "Tony Parker"     | 95            |
+      | "Tim Duncan"   | "Dejounte Murray" | "Dejounte Murray" | 99            |
+
+  Scenario: bidirect_over_all
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER * bidirect YIELD $^.player.name, serve._dst, $$.team.name, like._dst, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve._dst | $$.team.name | like._dst           | $$.player.name      |
+      | "Tim Duncan"   | "Spurs"    | "Spurs"      | EMPTY               | EMPTY               |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Tony Parker"       | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Manu Ginobili"     | "Manu Ginobili"     |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Tony Parker"       | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Manu Ginobili"     | "Manu Ginobili"     |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "LaMarcus Aldridge" | "LaMarcus Aldridge" |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Marco Belinelli"   | "Marco Belinelli"   |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Danny Green"       | "Danny Green"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Aron Baynes"       | "Aron Baynes"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Boris Diaw"        | "Boris Diaw"        |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Tiago Splitter"    | "Tiago Splitter"    |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Dejounte Murray"   | "Dejounte Murray"   |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | "Shaquile O'Neal"   | "Shaquile O'Neal"   |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | EMPTY               | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | EMPTY               | "Manu Ginobili"     |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | EMPTY               | "Danny Green"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | EMPTY               | "LaMarcus Aldridge" |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | EMPTY               | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY      | EMPTY        | EMPTY               | "Manu Ginobili"     |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER * bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           | serve._dst | teammate._dst       |
+      | EMPTY               | "Spurs"    | EMPTY               |
+      | "Tony Parker"       | EMPTY      | EMPTY               |
+      | "Manu Ginobili"     | EMPTY      | EMPTY               |
+      | "Tony Parker"       | EMPTY      | EMPTY               |
+      | "Manu Ginobili"     | EMPTY      | EMPTY               |
+      | "LaMarcus Aldridge" | EMPTY      | EMPTY               |
+      | "Marco Belinelli"   | EMPTY      | EMPTY               |
+      | "Danny Green"       | EMPTY      | EMPTY               |
+      | "Aron Baynes"       | EMPTY      | EMPTY               |
+      | "Boris Diaw"        | EMPTY      | EMPTY               |
+      | "Tiago Splitter"    | EMPTY      | EMPTY               |
+      | "Dejounte Murray"   | EMPTY      | EMPTY               |
+      | "Shaquile O'Neal"   | EMPTY      | EMPTY               |
+      | EMPTY               | EMPTY      | "Tony Parker"       |
+      | EMPTY               | EMPTY      | "Manu Ginobili"     |
+      | EMPTY               | EMPTY      | "LaMarcus Aldridge" |
+      | EMPTY               | EMPTY      | "Danny Green"       |
+      | EMPTY               | EMPTY      | "Tony Parker"       |
+      | EMPTY               | EMPTY      | "Manu Ginobili"     |
+
+  Scenario: duplicate column name
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve YIELD serve._dst, serve._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | serve._dst |
+      | "Spurs"    | "Spurs"    |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like YIELD like._dst AS id, like.likeness AS id
+      | GO FROM $-.id OVER serve
+      """
+    Then a SemanticError should be raised at runtime: Duplicate Column Name : `id'
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like, serve YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id
+      | GO FROM $-.id OVER *
+      """
+    Then a SemanticError should be raised at runtime: Duplicate Column Name : `year'
+    When executing query:
+      """
+      $a = GO FROM 'Tim Duncan' OVER *
+      YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id;
+      | GO FROM $-.id OVER serve
+      """
+    Then a SyntaxError should be raised at runtime: syntax error near `| GO FRO'
+
+  Scenario: contain
+    When executing query:
+      """
+      GO FROM 'Boris Diaw' OVER serve WHERE $$.team.name CONTAINS "Haw"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+    When executing query:
+      """
+      GO FROM 'Boris Diaw' OVER serve WHERE (string)serve.start_year CONTAINS "05"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+    When executing query:
+      """
+      GO FROM 'Boris Diaw' OVER serve WHERE $^.player.name CONTAINS "Boris"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+      | "Boris Diaw"   | 2008             | 2012           | "Hornets"    |
+      | "Boris Diaw"   | 2012             | 2016           | "Spurs"      |
+      | "Boris Diaw"   | 2016             | 2017           | "Jazz"       |
+    When executing query:
+      """
+      GO FROM 'Boris Diaw' OVER serve WHERE !($^.player.name CONTAINS "Boris")
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+    When executing query:
+      """
+      GO FROM 'Boris Diaw' OVER serve WHERE "Leo" CONTAINS "Boris"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+
+  Scenario: [0] intermediate data
+    When executing query:
+      """
+      GO 0 TO 0 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Tim Duncan"        |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Tim Duncan"        |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           | like.likeness | $$.player.name      |
+      | "Manu Ginobili"     | 95            | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" | 90            | "LaMarcus Aldridge" |
+      | "Tim Duncan"        | 95            | "Tim Duncan"        |
+      | "Tony Parker"       | 95            | "Tony Parker"       |
+      | "Tony Parker"       | 75            | "Tony Parker"       |
+      | "Tim Duncan"        | 75            | "Tim Duncan"        |
+      | "Tim Duncan"        | 90            | "Tim Duncan"        |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           | like.likeness | $$.player.name      |
+      | "Manu Ginobili"     | 95            | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" | 90            | "LaMarcus Aldridge" |
+      | "Tim Duncan"        | 95            | "Tim Duncan"        |
+      | "Tony Parker"       | 95            | "Tony Parker"       |
+      | "Tony Parker"       | 75            | "Tony Parker"       |
+      | "Tim Duncan"        | 75            | "Tim Duncan"        |
+      | "Tim Duncan"        | 90            | "Tim Duncan"        |
+    When executing query:
+      """
+      GO 0 TO 3 STEPS FROM 'Tim Duncan' OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+      | "Spurs"    |
+    When executing query:
+      """
+      GO 2 TO 3 STEPS FROM 'Tim Duncan' OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tim Duncan"        |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Boris Diaw"        |
+      | "Dejounte Murray"   |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Shaquile O'Neal"   |
+      | "Rudy Gay"          |
+      | "Damian Lillard"    |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tim Duncan"        |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Boris Diaw"        |
+      | "Dejounte Murray"   |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Shaquile O'Neal"   |
+      | "Rudy Gay"          |
+      | "Damian Lillard"    |
+    When executing query:
+      """
+      GO 2 TO 2 STEPS FROM 'Tony Parker' OVER like REVERSELY YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Boris Diaw"        |
+      | "Dejounte Murray"   |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Shaquile O'Neal"   |
+      | "Rudy Gay"          |
+      | "Damian Lillard"    |
+    When executing query:
+      """
+      GO 1 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst          |
+      | "Tim Duncan"        |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Rudy Gay"          |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Kyle Anderson"     |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Cory Joseph"       |
+      | "David West"        |
+      | "Jonathon Simmons"  |
+      | "Dejounte Murray"   |
+      | "Tracy McGrady"     |
+      | "Paul Gasol"        |
+      | "Marco Belinelli"   |
+    When executing query:
+      """
+      GO 0 TO 3 STEPS FROM 'Spurs' OVER serve REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst          |
+      | "Tim Duncan"        |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Rudy Gay"          |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Kyle Anderson"     |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Cory Joseph"       |
+      | "David West"        |
+      | "Jonathon Simmons"  |
+      | "Dejounte Murray"   |
+      | "Tracy McGrady"     |
+      | "Paul Gasol"        |
+      | "Marco Belinelli"   |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tim Duncan"        |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Boris Diaw"        |
+      | "Dejounte Murray"   |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Shaquile O'Neal"   |
+      | "Rudy Gay"          |
+      | "Damian Lillard"    |
+      | "LeBron James"      |
+      | "Russell Westbrook" |
+      | "Chris Paul"        |
+      | "Kyle Anderson"     |
+      | "Kevin Durant"      |
+      | "James Harden"      |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Tony Parker' OVER like BIDIRECT YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | "Tim Duncan"        |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Boris Diaw"        |
+      | "Dejounte Murray"   |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Shaquile O'Neal"   |
+      | "Rudy Gay"          |
+      | "Damian Lillard"    |
+      | "LeBron James"      |
+      | "Russell Westbrook" |
+      | "Chris Paul"        |
+      | "Kyle Anderson"     |
+      | "Kevin Durant"      |
+      | "James Harden"      |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           |
+      | "Thunders" | EMPTY               |
+      | EMPTY      | "Paul George"       |
+      | EMPTY      | "James Harden"      |
+      | "Pacers"   | EMPTY               |
+      | "Thunders" | EMPTY               |
+      | EMPTY      | "Russell Westbrook" |
+      | "Thunders" | EMPTY               |
+      | "Rockets"  | EMPTY               |
+      | EMPTY      | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           |
+      | "Thunders" | EMPTY               |
+      | EMPTY      | "Paul George"       |
+      | EMPTY      | "James Harden"      |
+      | "Pacers"   | EMPTY               |
+      | "Thunders" | EMPTY               |
+      | EMPTY      | "Russell Westbrook" |
+      | "Thunders" | EMPTY               |
+      | "Rockets"  | EMPTY               |
+      | EMPTY      | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER *
+      YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           | serve.start_year | like.likeness | $$.player.name      |
+      | "Thunders" | EMPTY               | 2008             | EMPTY         | EMPTY               |
+      | EMPTY      | "Paul George"       | EMPTY            | 90            | "Paul George"       |
+      | EMPTY      | "James Harden"      | EMPTY            | 90            | "James Harden"      |
+      | "Pacers"   | EMPTY               | 2010             | EMPTY         | EMPTY               |
+      | "Thunders" | EMPTY               | 2017             | EMPTY         | EMPTY               |
+      | EMPTY      | "Russell Westbrook" | EMPTY            | 95            | "Russell Westbrook" |
+      | "Thunders" | EMPTY               | 2009             | EMPTY         | EMPTY               |
+      | "Rockets"  | EMPTY               | 2012             | EMPTY         | EMPTY               |
+      | EMPTY      | "Russell Westbrook" | EMPTY            | 80            | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER *
+      YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           | serve.start_year | like.likeness | $$.player.name      |
+      | "Thunders" | EMPTY               | 2008             | EMPTY         | EMPTY               |
+      | EMPTY      | "Paul George"       | EMPTY            | 90            | "Paul George"       |
+      | EMPTY      | "James Harden"      | EMPTY            | 90            | "James Harden"      |
+      | "Pacers"   | EMPTY               | 2010             | EMPTY         | EMPTY               |
+      | "Thunders" | EMPTY               | 2017             | EMPTY         | EMPTY               |
+      | EMPTY      | "Russell Westbrook" | EMPTY            | 95            | "Russell Westbrook" |
+      | "Thunders" | EMPTY               | 2009             | EMPTY         | EMPTY               |
+      | "Rockets"  | EMPTY               | 2012             | EMPTY         | EMPTY               |
+      | EMPTY      | "Russell Westbrook" | EMPTY            | 80            | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM 'Russell Westbrook' OVER * REVERSELY YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           |
+      | EMPTY      | "Dejounte Murray"   |
+      | EMPTY      | "James Harden"      |
+      | EMPTY      | "Paul George"       |
+      | EMPTY      | "Dejounte Murray"   |
+      | EMPTY      | "Russell Westbrook" |
+      | EMPTY      | "Luka Doncic"       |
+      | EMPTY      | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM 'Russell Westbrook' OVER * REVERSELY YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst           |
+      | EMPTY      | "Dejounte Murray"   |
+      | EMPTY      | "James Harden"      |
+      | EMPTY      | "Paul George"       |
+      | EMPTY      | "Dejounte Murray"   |
+      | EMPTY      | "Russell Westbrook" |
+      | EMPTY      | "Luka Doncic"       |
+      | EMPTY      | "Russell Westbrook" |
+
+  Scenario: error message
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER serve YIELD $$.player.name as name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | name  |
+      | EMPTY |
+
+  Scenario: zero step
+    When executing query:
+      """
+      GO 0 STEPS FROM 'Tim Duncan' OVER serve BIDIRECT
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO 0 STEPS FROM 'Tim Duncan' OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO 0 STEPS FROM 'Tim Duncan' OVER like YIELD like._dst as id | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+
+  Scenario: go cover input
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst | GO FROM $-.src OVER like
+      YIELD $-.src as src, like._dst as dst, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src          | dst             | $^.player.name | $$.player.name  |
+      | "Tim Duncan" | "Tony Parker"   | "Tim Duncan"   | "Tony Parker"   |
+      | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan"   | "Manu Ginobili" |
+      | "Tim Duncan" | "Tony Parker"   | "Tim Duncan"   | "Tony Parker"   |
+      | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan"   | "Manu Ginobili" |
+    When executing query:
+      """
+      $a = GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst;
+      GO FROM $a.src OVER like YIELD $a.src as src, like._dst as dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src          | dst             |
+      | "Tim Duncan" | "Tony Parker"   |
+      | "Tim Duncan" | "Manu Ginobili" |
+      | "Tim Duncan" | "Tony Parker"   |
+      | "Tim Duncan" | "Manu Ginobili" |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst
+      | GO 1 TO 2 STEPS FROM $-.src OVER like YIELD $-.src as src, like._dst as dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src          | dst                 |
+      | "Tim Duncan" | "Tony Parker"       |
+      | "Tim Duncan" | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"       |
+      | "Tim Duncan" | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tim Duncan"        |
+      | "Tim Duncan" | "Tim Duncan"        |
+      | "Tim Duncan" | "Manu Ginobili"     |
+      | "Tim Duncan" | "Manu Ginobili"     |
+      | "Tim Duncan" | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tim Duncan"        |
+      | "Tim Duncan" | "Tim Duncan"        |
+    When executing query:
+      """
+      GO FROM 'Tim Duncan' OVER like YIELD like._src as src, like._dst as dst
+      | GO 1 TO 2 STEPS FROM $-.src OVER like
+      YIELD $-.src as src, $-.dst, like._dst as dst, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src          | $-.dst          | dst                 | like.likeness |
+      | "Tim Duncan" | "Tony Parker"   | "Tony Parker"       | 95            |
+      | "Tim Duncan" | "Tony Parker"   | "Manu Ginobili"     | 95            |
+      | "Tim Duncan" | "Manu Ginobili" | "Tony Parker"       | 95            |
+      | "Tim Duncan" | "Manu Ginobili" | "Manu Ginobili"     | 95            |
+      | "Tim Duncan" | "Tony Parker"   | "Tim Duncan"        | 95            |
+      | "Tim Duncan" | "Tony Parker"   | "Manu Ginobili"     | 95            |
+      | "Tim Duncan" | "Tony Parker"   | "LaMarcus Aldridge" | 90            |
+      | "Tim Duncan" | "Tony Parker"   | "Tim Duncan"        | 90            |
+      | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan"        | 95            |
+      | "Tim Duncan" | "Manu Ginobili" | "Manu Ginobili"     | 95            |
+      | "Tim Duncan" | "Manu Ginobili" | "LaMarcus Aldridge" | 90            |
+      | "Tim Duncan" | "Manu Ginobili" | "Tim Duncan"        | 90            |
+    When executing query:
+      """
+      GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst
+      | GO FROM $-.dst OVER teammate YIELD $-.src AS src, $-.dst, teammate._dst AS dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src           | $-.dst       | dst                 |
+      | "Danny Green" | "Tim Duncan" | "Tony Parker"       |
+      | "Danny Green" | "Tim Duncan" | "Manu Ginobili"     |
+      | "Danny Green" | "Tim Duncan" | "LaMarcus Aldridge" |
+      | "Danny Green" | "Tim Duncan" | "Danny Green"       |
+    When executing query:
+      """
+      $a = GO FROM 'Danny Green' OVER like YIELD like._src AS src, like._dst AS dst;
+      GO FROM $a.dst OVER teammate YIELD $a.src AS src, $a.dst, teammate._dst AS dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src           | $a.dst       | dst                 |
+      | "Danny Green" | "Tim Duncan" | "Tony Parker"       |
+      | "Danny Green" | "Tim Duncan" | "Manu Ginobili"     |
+      | "Danny Green" | "Tim Duncan" | "LaMarcus Aldridge" |
+      | "Danny Green" | "Tim Duncan" | "Danny Green"       |
+
+  Scenario: backtrack overlap
+    When executing query:
+      """
+      GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst
+      | GO 2 STEPS FROM $-.src OVER like YIELD $-.src, $-.dst, like._src, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.src        | $-.dst              | like._src           | like._dst       |
+      | "Tony Parker" | "Tim Duncan"        | "Tim Duncan"        | "Manu Ginobili" |
+      | "Tony Parker" | "Tim Duncan"        | "Tim Duncan"        | "Tony Parker"   |
+      | "Tony Parker" | "Tim Duncan"        | "LaMarcus Aldridge" | "Tony Parker"   |
+      | "Tony Parker" | "Tim Duncan"        | "Manu Ginobili"     | "Tim Duncan"    |
+      | "Tony Parker" | "Tim Duncan"        | "LaMarcus Aldridge" | "Tim Duncan"    |
+      | "Tony Parker" | "Manu Ginobili"     | "Tim Duncan"        | "Manu Ginobili" |
+      | "Tony Parker" | "Manu Ginobili"     | "Tim Duncan"        | "Tony Parker"   |
+      | "Tony Parker" | "Manu Ginobili"     | "LaMarcus Aldridge" | "Tony Parker"   |
+      | "Tony Parker" | "Manu Ginobili"     | "Manu Ginobili"     | "Tim Duncan"    |
+      | "Tony Parker" | "Manu Ginobili"     | "LaMarcus Aldridge" | "Tim Duncan"    |
+      | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan"        | "Manu Ginobili" |
+      | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan"        | "Tony Parker"   |
+      | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tony Parker"   |
+      | "Tony Parker" | "LaMarcus Aldridge" | "Manu Ginobili"     | "Tim Duncan"    |
+      | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tim Duncan"    |
+    When executing query:
+      """
+      $a = GO FROM 'Tony Parker' OVER like YIELD like._src as src, like._dst as dst;
+      GO 2 STEPS FROM $a.src OVER like YIELD $a.src, $a.dst, like._src, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $a.src        | $a.dst              | like._src           | like._dst       |
+      | "Tony Parker" | "Tim Duncan"        | "Tim Duncan"        | "Manu Ginobili" |
+      | "Tony Parker" | "Tim Duncan"        | "Tim Duncan"        | "Tony Parker"   |
+      | "Tony Parker" | "Tim Duncan"        | "LaMarcus Aldridge" | "Tony Parker"   |
+      | "Tony Parker" | "Tim Duncan"        | "Manu Ginobili"     | "Tim Duncan"    |
+      | "Tony Parker" | "Tim Duncan"        | "LaMarcus Aldridge" | "Tim Duncan"    |
+      | "Tony Parker" | "Manu Ginobili"     | "Tim Duncan"        | "Manu Ginobili" |
+      | "Tony Parker" | "Manu Ginobili"     | "Tim Duncan"        | "Tony Parker"   |
+      | "Tony Parker" | "Manu Ginobili"     | "LaMarcus Aldridge" | "Tony Parker"   |
+      | "Tony Parker" | "Manu Ginobili"     | "Manu Ginobili"     | "Tim Duncan"    |
+      | "Tony Parker" | "Manu Ginobili"     | "LaMarcus Aldridge" | "Tim Duncan"    |
+      | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan"        | "Manu Ginobili" |
+      | "Tony Parker" | "LaMarcus Aldridge" | "Tim Duncan"        | "Tony Parker"   |
+      | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tony Parker"   |
+      | "Tony Parker" | "LaMarcus Aldridge" | "Manu Ginobili"     | "Tim Duncan"    |
+      | "Tony Parker" | "LaMarcus Aldridge" | "LaMarcus Aldridge" | "Tim Duncan"    |
diff --git a/tests/tck/features/go/go.intVid.feature b/tests/tck/features/go/go.intVid.feature
new file mode 100644
index 0000000000000000000000000000000000000000..e4aa5d48e2fabd1762d978543bfd3e7ee1d28c0a
--- /dev/null
+++ b/tests/tck/features/go/go.intVid.feature
@@ -0,0 +1,1582 @@
+@skip
+Feature: IntegerVid Go  Sentence
+
+  Background: Prepare space
+    Given a graph with space named "nba_int_vid"
+
+  Scenario: Integer Vid one step
+    When executing query:
+      """
+      GO FROM hash("Tim Duncan") OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    |
+      | hash("Spurs") |
+    When executing query:
+      """
+      GO FROM hash("Tim Duncan"), hash("Tim Duncan") OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    |
+      | hash("Spurs") |
+      | hash("Spurs") |
+    When executing query:
+      """
+      YIELD hash("Tim Duncan") as vid | GO FROM $-.vid OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    |
+      | hash("Spurs") |
+    When executing query:
+      """
+      GO FROM hash("Boris Diaw") OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+      | "Boris Diaw"   | 2008             | 2012           | "Hornets"    |
+      | "Boris Diaw"   | 2012             | 2016           | "Spurs"      |
+      | "Boris Diaw"   | 2016             | 2017           | "Jazz"       |
+    When executing query:
+      """
+      GO FROM hash("Rajon Rondo") OVER serve WHERE serve.start_year >= 2013 AND serve.end_year <= 2018
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Rajon Rondo"  | 2014             | 2015           | "Mavericks"  |
+      | "Rajon Rondo"  | 2015             | 2016           | "Kings"      |
+      | "Rajon Rondo"  | 2016             | 2017           | "Bulls"      |
+      | "Rajon Rondo"  | 2017             | 2018           | "Pelicans"   |
+    When executing query:
+      """
+      GO FROM hash("Boris Diaw") OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Hornets")       |
+      | hash("Trail Blazers") |
+    When executing query:
+      """
+      GO FROM hash('Thunders') OVER serve REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst                |
+      | hash("Russell Westbrook") |
+      | hash("Kevin Durant")      |
+      | hash("James Harden")      |
+      | hash("Carmelo Anthony")   |
+      | hash("Paul George")       |
+      | hash("Ray Allen")         |
+    When executing query:
+      """
+      GO FROM hash("Boris Diaw") OVER like YIELD like._dst as id
+      |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Hornets")       |
+      | hash("Trail Blazers") |
+    When executing query:
+      """
+      GO FROM hash("No Exist Vertex Id") OVER like YIELD like._dst as id
+      |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO FROM hash("Boris Diaw") OVER like, serve YIELD like._dst as id
+      |(GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Hornets")       |
+      | hash("Trail Blazers") |
+
+  Scenario: Integer Vid assignment simple
+    When executing query:
+      """
+      $var = GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as id; GO FROM $var.id OVER like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tracy McGrady")     |
+      | hash("LaMarcus Aldridge") |
+
+  Scenario: Integer Vid assignment pipe
+    When executing query:
+      """
+      $var = (GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as id | GO FROM $-.id OVER like YIELD like._dst as id);
+      GO FROM $var.id OVER like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           |
+      | hash("Kobe Bryant") |
+      | hash("Grant Hill")  |
+      | hash("Rudy Gay")    |
+      | hash("Tony Parker") |
+      | hash("Tim Duncan")  |
+
+  Scenario: Integer Vid pipe only yield input prop
+    When executing query:
+      """
+      GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD $-.vid as id
+      """
+    Then the result should be, in any order, with relax comparison:
+      | id                  |
+      | hash("Kobe Bryant") |
+      | hash("Grant Hill")  |
+      | hash("Rudy Gay")    |
+
+  Scenario: Integer Vid pipe only yield constant
+    When executing query:
+      """
+      GO FROM hash("Tracy McGrady") OVER like YIELD like._dst as vid | GO FROM $-.vid OVER like YIELD 3
+      """
+    Then the result should be, in any order, with relax comparison:
+      | 3 |
+      | 3 |
+      | 3 |
+      | 3 |
+
+  Scenario: Integer Vid assignment empty result
+    When executing query:
+      """
+      $var = GO FROM -1 OVER like YIELD like._dst as id; GO FROM $var.id OVER like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst |
+
+  Scenario: Integer Vid variable undefined
+    When executing query:
+      """
+      GO FROM $var OVER like
+      """
+    Then a SyntaxError should be raised at runtime: syntax error near `OVER'
+
+  Scenario: Integer Vid distinct
+    When executing query:
+      """
+      GO FROM hash("Nobody") OVER serve YIELD DISTINCT $^.player.name as name, $$.team.name as name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | name | name |
+    When executing query:
+      """
+      GO FROM hash("Boris Diaw") OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER serve
+      YIELD DISTINCT serve._dst, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            | $$.team.name    |
+      | hash("Spurs")         | "Spurs"         |
+      | hash("Hornets")       | "Hornets"       |
+      | hash("Trail Blazers") | "Trail Blazers" |
+    When executing query:
+      """
+      GO 2 STEPS FROM hash("Tony Parker") OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst             |
+      | hash("Tim Duncan")    |
+      | hash("Tony Parker")   |
+      | hash("Manu Ginobili") |
+
+  Scenario: Integer Vid vertex noexist
+    When executing query:
+      """
+      GO FROM hash("NON EXIST VERTEX ID") OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO FROM hash("NON EXIST VERTEX ID") OVER serve YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+    When executing query:
+      """
+      GO FROM hash("NON EXIST VERTEX ID") OVER serve YIELD DISTINCT $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+
+  Scenario: Integer Vid empty input
+    When executing query:
+      """
+      GO FROM hash("NON EXIST VERTEX ID") OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER like YIELD like._dst as id
+      | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO FROM hash("NON EXIST VERTEX ID") OVER serve YIELD serve._dst as id, serve.start_year as start
+      | YIELD $-.id as id WHERE $-.start > 20000
+      | Go FROM $-.id over serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+
+  Scenario: Integer Vid multi edges over all
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER * REVERSELY YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst               |
+      | EMPTY      | hash("James Harden")    |
+      | EMPTY      | hash("Dejounte Murray") |
+      | EMPTY      | hash("Paul George")     |
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER * REVERSELY YIELD serve._src, like._src
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._src | like._src                 |
+      | EMPTY      | hash("Russell Westbrook") |
+      | EMPTY      | hash("Russell Westbrook") |
+      | EMPTY      | hash("Russell Westbrook") |
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER * REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst               | serve._dst | teammate._dst |
+      | hash("James Harden")    | EMPTY      | EMPTY         |
+      | hash("Dejounte Murray") | EMPTY      | EMPTY         |
+      | hash("Paul George")     | EMPTY      | EMPTY         |
+    When executing query:
+      """
+      GO FROM hash("Dirk Nowitzki") OVER * YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst        | like._dst           |
+      | hash("Mavericks") | EMPTY               |
+      | EMPTY             | hash("Steve Nash")  |
+      | EMPTY             | hash("Jason Kidd")  |
+      | EMPTY             | hash("Dwyane Wade") |
+    When executing query:
+      """
+      GO FROM hash("Paul Gasol") OVER *
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst           | serve._dst        | teammate._dst |
+      | EMPTY               | hash("Grizzlies") | EMPTY         |
+      | EMPTY               | hash("Lakers")    | EMPTY         |
+      | EMPTY               | hash("Bulls")     | EMPTY         |
+      | EMPTY               | hash("Spurs")     | EMPTY         |
+      | EMPTY               | hash("Bucks")     | EMPTY         |
+      | hash("Kobe Bryant") | EMPTY             | EMPTY         |
+      | hash("Marc Gasol")  | EMPTY             | EMPTY         |
+    When executing query:
+      """
+      GO FROM hash("Manu Ginobili") OVER * REVERSELY YIELD like.likeness, teammate.start_year, serve.start_year, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like.likeness | teammate.start_year | serve.start_year | $$.player.name    |
+      | 95            | EMPTY               | EMPTY            | "Tim Duncan"      |
+      | 95            | EMPTY               | EMPTY            | "Tony Parker"     |
+      | 90            | EMPTY               | EMPTY            | "Tiago Splitter"  |
+      | 99            | EMPTY               | EMPTY            | "Dejounte Murray" |
+      | EMPTY         | 2002                | EMPTY            | "Tim Duncan"      |
+      | EMPTY         | 2002                | EMPTY            | "Tony Parker"     |
+    When executing query:
+      """
+      GO FROM hash("LaMarcus Aldridge") OVER * YIELD $$.team.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.team.name    | $$.player.name |
+      | "Trail Blazers" | EMPTY          |
+      | EMPTY           | "Tim Duncan"   |
+      | EMPTY           | "Tony Parker"  |
+      | "Spurs"         | EMPTY          |
+    When executing query:
+      """
+      GO FROM hash("Boris Diaw") OVER * YIELD like._dst as id
+      | ( GO FROM $-.id OVER like YIELD like._dst as id | GO FROM $-.id OVER serve )
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Hornets")       |
+      | hash("Trail Blazers") |
+
+  @skip
+  Scenario: Integer Vid edge type
+    When executing query:
+      """
+      YIELD serve.start_year, like.likeness, serve._type, like._type
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve.start_year | like.likeness | serve._type | like._type |
+      | 2008             | EMPTY         | 6           | EMPTY      |
+      | EMPTY            | 90            | EMPTY       | 5          |
+      | EMPTY            | 90            | EMPTY       | 5          |
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY
+      YIELD serve._dst, like._dst, serve._type, like._type
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst               | serve._type | like._type |
+      | EMPTY      | hash("James Harden")    | EMPTY       | -5         |
+      | EMPTY      | hash("Dejounte Murray") | EMPTY       | -5         |
+      | EMPTY      | hash("Paul George")     | EMPTY       | -5         |
+
+  Scenario: Integer Vid multi edges
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER serve, like  YIELD serve.start_year, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve.start_year | like.likeness |
+      | 2008             | EMPTY         |
+      | EMPTY            | 90            |
+      | EMPTY            | 90            |
+    When executing query:
+      """
+      GO FROM hash("Shaquile O\'Neal") OVER serve, like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst        | like._dst            |
+      | hash("Magic")     | EMPTY                |
+      | hash("Lakers")    | EMPTY                |
+      | hash("Heat")      | EMPTY                |
+      | hash("Suns")      | EMPTY                |
+      | hash("Cavaliers") | EMPTY                |
+      | hash("Celtics")   | EMPTY                |
+      | EMPTY             | hash("JaVale McGee") |
+      | EMPTY             | hash("Tim Duncan")   |
+    When executing query:
+      """
+      GO FROM hash('Russell Westbrook') OVER serve, like
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst       | like._dst            |
+      | hash("Thunders") | EMPTY                |
+      | EMPTY            | hash("Paul George")  |
+      | EMPTY            | hash("James Harden") |
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY
+      YIELD serve._dst, like._dst, serve.start_year, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst               | serve.start_year | like.likeness |
+      | EMPTY      | hash("James Harden")    | EMPTY            | 80            |
+      | EMPTY      | hash("Dejounte Murray") | EMPTY            | 99            |
+      | EMPTY      | hash("Paul George")     | EMPTY            | 95            |
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY YIELD serve._src, like._src
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._src | like._src                 |
+      | EMPTY      | hash("Russell Westbrook") |
+      | EMPTY      | hash("Russell Westbrook") |
+      | EMPTY      | hash("Russell Westbrook") |
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER serve, like REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst               |
+      | EMPTY      | hash("James Harden")    |
+      | EMPTY      | hash("Dejounte Murray") |
+      | EMPTY      | hash("Paul George")     |
+    When executing query:
+      """
+      GO FROM hash("Manu Ginobili") OVER like, teammate REVERSELY YIELD like.likeness, teammate.start_year, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like.likeness | teammate.start_year | $$.player.name    |
+      | 95            | EMPTY               | "Tim Duncan"      |
+      | 95            | EMPTY               | "Tony Parker"     |
+      | 90            | EMPTY               | "Tiago Splitter"  |
+      | 99            | EMPTY               | "Dejounte Murray" |
+      | EMPTY         | 2002                | "Tim Duncan"      |
+      | EMPTY         | 2002                | "Tony Parker"     |
+
+  Scenario: Integer Vid multi edges with filter
+    When executing query:
+      """
+      GO FROM hash("Russell Westbrook") OVER serve, like WHERE serve.start_year > 2000
+      YIELD serve.start_year, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve.start_year | like.likeness |
+      | 2008             | EMPTY         |
+    When executing query:
+      """
+      GO FROM hash("Manu Ginobili") OVER like, teammate REVERSELY WHERE like.likeness > 90
+      YIELD like.likeness, teammate.start_year, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like.likeness | teammate.start_year | $$.player.name    |
+      | 95            | EMPTY               | "Tim Duncan"      |
+      | 95            | EMPTY               | "Tony Parker"     |
+      | 99            | EMPTY               | "Dejounte Murray" |
+    When executing query:
+      """
+      GO FROM hash("Manu Ginobili") OVER * WHERE $$.player.age > 30 or $$.team.name not starts with "Rockets"
+      YIELD DISTINCT $$.player.age, $$.player.name, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.age | $$.player.name | $$.team.name |
+      | EMPTY         | EMPTY          | "Spurs"      |
+      | 42            | "Tim Duncan"   | EMPTY        |
+      | 36            | "Tony Parker"  | EMPTY        |
+    When executing query:
+      """
+      GO FROM hash("Manu Ginobili") OVER like, teammate REVERSELY WHERE $$.player.age > 30 and $$.player.age < 40
+      YIELD DISTINCT $$.player.age, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.age | $$.player.name   |
+      | 34            | "Tiago Splitter" |
+      | 36            | "Tony Parker"    |
+
+  Scenario: Integer Vid reference pipe in yield and where
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id
+      | GO FROM $-.id OVER like YIELD $-.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.name      | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id
+      | GO FROM $-.id OVER like WHERE $-.name != $$.player.name YIELD $-.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.name      | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+
+  @skip
+  Scenario: Integer Vid all prop(reson = $-.* over * $var.* not implement)
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id
+      | GO FROM $-.id OVER like YIELD $-.*, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.*         | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+    When executing query:
+      """
+      $var = GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id;
+      GO FROM $var.id OVER like YIELD $var.*, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $var.*       | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+
+  Scenario: Integer Vid reference variable in yield and where
+    When executing query:
+      """
+      $var = GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id;
+      GO FROM $var.id OVER like YIELD $var.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $var.name    | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Manu Ginobili"   | "Tim Duncan"        |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Tim Duncan" | "Tony Parker"     | "Tim Duncan"        |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "Chris Paul"        |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "Chris Paul"        |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+    When executing query:
+      """
+      $var = GO FROM hash('Tim Duncan'), hash('Chris Paul') OVER like YIELD $^.player.name AS name, like._dst AS id;
+      GO FROM $var.id OVER like  WHERE $var.name != $$.player.name YIELD $var.name, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $var.name    | $^.player.name    | $$.player.name      |
+      | "Tim Duncan" | "Tony Parker"     | "LaMarcus Aldridge" |
+      | "Tim Duncan" | "Tony Parker"     | "Manu Ginobili"     |
+      | "Chris Paul" | "LeBron James"    | "Ray Allen"         |
+      | "Chris Paul" | "Carmelo Anthony" | "LeBron James"      |
+      | "Chris Paul" | "Carmelo Anthony" | "Dwyane Wade"       |
+      | "Chris Paul" | "Dwyane Wade"     | "LeBron James"      |
+      | "Chris Paul" | "Dwyane Wade"     | "Carmelo Anthony"   |
+
+  Scenario: Integer Vid no exist prop
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve YIELD $^.player.test
+      """
+    Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'.
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve yield $^.player.test
+      """
+    Then a SemanticError should be raised at runtime: `$^.player.test', not found the property `test'.
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve YIELD serve.test
+      """
+    Then a SemanticError should be raised at runtime: `serve.test', not found the property `test'.
+
+  @skip
+  Scenario: Integer Vid udf call (reason = "not support udf_is_in now")
+    When executing query:
+      """
+      GO FROM hash('Boris Diaw') OVER serve WHERE udf_is_in($$.team.name, 'Hawks', 'Suns')
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS id
+      | GO FROM  $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123)
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | hash("Spurs")   |
+      | hash("Hornets") |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS id
+      | GO FROM  $-.id OVER serve WHERE udf_is_in($-.id, 'Tony Parker', 123) AND 1 == 1
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | hash("Spurs")   |
+      | hash("Hornets") |
+
+  @skip
+  Scenario: Integer Vid return test (reason = "return not implement")
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE $A.dst == 123;
+      RETURN $rA IF $rA IS NOT NULL;
+      GO FROM $A.dst OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | hash("Spurs")   |
+      | hash("Spurs")   |
+      | hash("Hornets") |
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE 1 == 1;
+      RETURN $rA IF $rA IS NOT NULL;
+      GO FROM $A.dst OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Tony Parker")   |
+      | hash("Manu Ginobili") |
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dstA;
+      $rA = YIELD $A.* WHERE $A.dstA == 123;
+      RETURN $rA IF $rA IS NOT NULL;
+      $B = GO FROM $A.dstA OVER like YIELD like._dst AS dstB;
+      $rB = YIELD $B.* WHERE $B.dstB == 456;
+      RETURN $rB IF $rB IS NOT NULL;
+      GO FROM $B.dstB OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+      | hash("Trail Blazers") |
+      | hash("Spurs")         |
+      | hash("Spurs")         |
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE $A.dst == 123;
+      RETURN $rA IF $rA IS NOT NULL;
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst;
+      $rA = YIELD $A.* WHERE 1 == 1;
+      RETURN $rA IF $rA IS NOT NULL;
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst            |
+      | hash("Tony Parker")   |
+      | hash("Manu Ginobili") |
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst;
+       $rA = YIELD $A.* WHERE 1 == 1;
+        RETURN $B IF $B IS NOT NULL
+      """
+    Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a'
+    When executing query:
+      """
+      $A = GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS dst;
+       $rA = YIELD $A.* WHERE 1 == 1;
+        RETURN $B IF $A IS NOT NULL
+      """
+    Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a'
+    When executing query:
+      """
+      RETURN $rA IF $rA IS NOT NULL;
+      """
+    Then a SemanticError should be raised at runtime: `$a.id', not exist variable `a'
+
+  Scenario: Integer Vid reverse one step
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like REVERSELY YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Boris Diaw")        |
+      | hash("Tiago Splitter")    |
+      | hash("Dejounte Murray")   |
+      | hash("Shaquile O'Neal")   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like REVERSELY YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name      |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like REVERSELY WHERE $$.player.age < 35 YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name      |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER * REVERSELY YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Boris Diaw")        |
+      | hash(("Tiago Splitter")   |
+      | hash("Dejounte Murray")   |
+      | hash("Shaquile O'Neal")   |
+      | EMPTY                     |
+      | EMPTY                     |
+
+  Scenario: Integer Vid only id n steps
+    When executing query:
+      """
+      GO 2 STEPS FROM hash('Tony Parker') OVER like YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst             |
+      | hash("Tim Duncan")    |
+      | hash("Tim Duncan")    |
+      | hash("Tony Parker")   |
+      | hash("Tony Parker")   |
+      | hash("Manu Ginobili") |
+    When executing query:
+      """
+      GO 3 STEPS FROM hash('Tony Parker') OVER like YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Manu Ginobili")     |
+      | hash("Tim Duncan")        |
+      | hash("Tim Duncan")        |
+      | hash("LaMarcus Aldridge") |
+    When executing query:
+      """
+      GO 1 STEPS FROM hash('Tony Parker') OVER like YIELD like._dst AS id
+      | GO 2 STEPS FROM $-.id OVER like YIELD like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("LaMarcus Aldridge") |
+      | hash("LaMarcus Aldridge") |
+      | hash("Manu Ginobili")     |
+      | hash("Manu Ginobili")     |
+      | hash("Tim Duncan")        |
+      | hash("Tim Duncan")        |
+      | hash("Tim Duncan")        |
+      | hash("Manu Ginobili")     |
+      | hash("Manu Ginobili")     |
+      | hash("Tony Parker")       |
+      | hash("Tony Parker")       |
+
+  Scenario: Integer Vid reverse two steps
+    When executing query:
+      """
+      GO 2 STEPS FROM hash('Kobe Bryant') OVER like REVERSELY YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name |
+      | "Marc Gasol"   |
+      | "Vince Carter" |
+      | "Yao Ming"     |
+      | "Grant Hill"   |
+    When executing query:
+      """
+      GO FROM hash('Manu Ginobili') OVER * REVERSELY YIELD like._dst AS id
+      | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | hash("Spurs")   |
+      | hash("Spurs")   |
+      | hash("Hornets") |
+      | hash("Spurs")   |
+      | hash("Hawks")   |
+      | hash("76ers")   |
+      | hash("Spurs")   |
+
+  Scenario: Integer Vid reverse with pipe
+    When executing query:
+      """
+      GO FROM hash('LeBron James') OVER serve YIELD serve._dst AS id
+      | GO FROM $-.id OVER serve REVERSELY YIELD $^.team.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.team.name | $$.player.name      |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Cavaliers"  | "LeBron James"      |
+      | "Heat"       | "Amar'e Stoudemire" |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Heat"       | "LeBron James"      |
+      | "Heat"       | "Ray Allen"         |
+      | "Heat"       | "Shaquile O'Neal"   |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Lakers"     | "Dwight Howard"     |
+      | "Lakers"     | "JaVale McGee"      |
+      | "Lakers"     | "Kobe Bryant"       |
+      | "Lakers"     | "LeBron James"      |
+      | "Lakers"     | "Paul Gasol"        |
+      | "Lakers"     | "Rajon Rondo"       |
+      | "Lakers"     | "Shaquile O'Neal"   |
+      | "Lakers"     | "Steve Nash"        |
+    When executing query:
+      """
+      GO FROM hash('LeBron James') OVER serve YIELD serve._dst AS id
+      | GO FROM $-.id OVER serve REVERSELY WHERE $$.player.name != 'LeBron James'
+      YIELD $^.team.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.team.name | $$.player.name      |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Danny Green"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Dwyane Wade"       |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "Kyrie Irving"      |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Cavaliers"  | "Shaquile O'Neal"   |
+      | "Heat"       | "Amar'e Stoudemire" |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Heat"       | "Ray Allen"         |
+      | "Heat"       | "Shaquile O'Neal"   |
+      | "Heat"       | "Dwyane Wade"       |
+      | "Lakers"     | "Dwight Howard"     |
+      | "Lakers"     | "JaVale McGee"      |
+      | "Lakers"     | "Kobe Bryant"       |
+      | "Lakers"     | "Paul Gasol"        |
+      | "Lakers"     | "Rajon Rondo"       |
+      | "Lakers"     | "Shaquile O'Neal"   |
+      | "Lakers"     | "Steve Nash"        |
+    When executing query:
+      """
+      GO FROM hash('Manu Ginobili') OVER like REVERSELY YIELD like._dst AS id
+      | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst      |
+      | hash("Spurs")   |
+      | hash("Spurs")   |
+      | hash("Spurs")   |
+      | hash("Spurs")   |
+      | hash("Hornets") |
+      | hash("Hawks")   |
+      | hash("76ers")   |
+
+  Scenario: Integer Vid bidirect
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    |
+      | hash("Spurs") |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Boris Diaw")        |
+      | hash("Tiago Splitter")    |
+      | hash("Dejounte Murray")   |
+      | hash("Shaquile O'Neal")   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve, like bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    | like._dst                 |
+      | hash("Spurs") | EMPTY                     |
+      | EMPTY         | hash("Tony Parker")       |
+      | EMPTY         | hash("Manu Ginobili")     |
+      | EMPTY         | hash("Tony Parker")       |
+      | EMPTY         | hash("Manu Ginobili")     |
+      | EMPTY         | hash("LaMarcus Aldridge") |
+      | EMPTY         | hash("Marco Belinelli")   |
+      | EMPTY         | hash("Danny Green")       |
+      | EMPTY         | hash("Aron Baynes")       |
+      | EMPTY         | hash("Boris Diaw")        |
+      | EMPTY         | hash("Tiago Splitter")    |
+      | EMPTY         | hash("Dejounte Murray")   |
+      | EMPTY         | hash("Shaquile O'Neal")   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve bidirect YIELD $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.team.name |
+      | "Spurs"      |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like bidirect YIELD $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $$.player.name      |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "Tony Parker"       |
+      | "Manu Ginobili"     |
+      | "LaMarcus Aldridge" |
+      | "Marco Belinelli"   |
+      | "Danny Green"       |
+      | "Aron Baynes"       |
+      | "Boris Diaw"        |
+      | "Tiago Splitter"    |
+      | "Dejounte Murray"   |
+      | "Shaquile O'Neal"   |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like bidirect WHERE like.likeness > 90
+      YIELD $^.player.name, like._dst, $$.player.name, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | like._dst               | $$.player.name    | like.likeness |
+      | "Tim Duncan"   | hash("Tony Parker")     | "Tony Parker"     | 95            |
+      | "Tim Duncan"   | hash("Manu Ginobili")   | "Manu Ginobili"   | 95            |
+      | "Tim Duncan"   | hash("Tony Parker")     | "Tony Parker"     | 95            |
+      | "Tim Duncan"   | hash("Dejounte Murray") | "Dejounte Murray" | 99            |
+
+  Scenario: Integer Vid bidirect_over_all
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER * bidirect YIELD $^.player.name, serve._dst, $$.team.name, like._dst, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve._dst    | $$.team.name | like._dst                 | $$.player.name      |
+      | "Tim Duncan"   | hash("Spurs") | "Spurs"      | EMPTY                     | EMPTY               |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Tony Parker")       | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Manu Ginobili")     | "Manu Ginobili"     |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Tony Parker")       | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Manu Ginobili")     | "Manu Ginobili"     |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("LaMarcus Aldridge") | "LaMarcus Aldridge" |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Marco Belinelli")   | "Marco Belinelli"   |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Danny Green")       | "Danny Green"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Aron Baynes")       | "Aron Baynes"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Boris Diaw")        | "Boris Diaw"        |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Tiago Splitter")    | "Tiago Splitter"    |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Dejounte Murray")   | "Dejounte Murray"   |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | hash("Shaquile O'Neal")   | "Shaquile O'Neal"   |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | EMPTY                     | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | EMPTY                     | "Manu Ginobili"     |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | EMPTY                     | "Danny Green"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | EMPTY                     | "LaMarcus Aldridge" |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | EMPTY                     | "Tony Parker"       |
+      | "Tim Duncan"   | EMPTY         | EMPTY        | EMPTY                     | "Manu Ginobili"     |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER * bidirect
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 | serve._dst    | teammate._dst             |
+      | EMPTY                     | hash("Spurs") | EMPTY                     |
+      | hash("Tony Parker")       | EMPTY         | EMPTY                     |
+      | hash("Manu Ginobili")     | EMPTY         | EMPTY                     |
+      | hash("Tony Parker")       | EMPTY         | EMPTY                     |
+      | hash("Manu Ginobili")     | EMPTY         | EMPTY                     |
+      | hash("LaMarcus Aldridge") | EMPTY         | EMPTY                     |
+      | hash("Marco Belinelli")   | EMPTY         | EMPTY                     |
+      | hash("Danny Green")       | EMPTY         | EMPTY                     |
+      | hash("Aron Baynes")       | EMPTY         | EMPTY                     |
+      | hash("Boris Diaw")        | EMPTY         | EMPTY                     |
+      | hash("Tiago Splitter")    | EMPTY         | EMPTY                     |
+      | hash("Dejounte Murray")   | EMPTY         | EMPTY                     |
+      | hash("Shaquile O'Neal")   | EMPTY         | EMPTY                     |
+      | EMPTY                     | EMPTY         | hash("Tony Parker")       |
+      | EMPTY                     | EMPTY         | hash("Manu Ginobili")     |
+      | EMPTY                     | EMPTY         | hash("LaMarcus Aldridge") |
+      | EMPTY                     | EMPTY         | hash("Danny Green")       |
+      | EMPTY                     | EMPTY         | hash("Tony Parker")       |
+      | EMPTY                     | EMPTY         | hash("Manu Ginobili")     |
+
+  Scenario: Integer Vid duplicate column name
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve YIELD serve._dst, serve._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    | serve._dst    |
+      | hash("Spurs") | hash("Spurs") |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like YIELD like._dst AS id, like.likeness AS id
+      | GO FROM $-.id OVER serve
+      """
+    Then a SemanticError should be raised at runtime: Duplicate Column Name : `id'
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like, serve YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id
+      | GO FROM $-.id OVER *
+      """
+    Then a SemanticError should be raised at runtime: Duplicate Column Name : `year'
+    When executing query:
+      """
+      $a = GO FROM hash('Tim Duncan') OVER *
+      YIELD serve.start_year AS year, serve.end_year AS year, serve._dst AS id;
+      | GO FROM $-.id OVER serve
+      """
+    Then a SyntaxError should be raised at runtime: syntax error near `| GO FRO'
+
+  Scenario: Integer Vid contain
+    When executing query:
+      """
+      GO FROM hash('Boris Diaw') OVER serve WHERE $$.team.name CONTAINS "Haw"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+    When executing query:
+      """
+      GO FROM hash('Boris Diaw') OVER serve WHERE (string)serve.start_year CONTAINS "05"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+    When executing query:
+      """
+      GO FROM hash('Boris Diaw') OVER serve WHERE $^.player.name CONTAINS "Boris"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+      | "Boris Diaw"   | 2003             | 2005           | "Hawks"      |
+      | "Boris Diaw"   | 2005             | 2008           | "Suns"       |
+      | "Boris Diaw"   | 2008             | 2012           | "Hornets"    |
+      | "Boris Diaw"   | 2012             | 2016           | "Spurs"      |
+      | "Boris Diaw"   | 2016             | 2017           | "Jazz"       |
+    When executing query:
+      """
+      GO FROM hash('Boris Diaw') OVER serve WHERE !($^.player.name CONTAINS "Boris")
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+    When executing query:
+      """
+      GO FROM hash('Boris Diaw') OVER serve WHERE "Leo" CONTAINS "Boris"
+      YIELD $^.player.name, serve.start_year, serve.end_year, $$.team.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $^.player.name | serve.start_year | serve.end_year | $$.team.name |
+
+  Scenario: Integer Vid intermediate data
+    When executing query:
+      """
+      GO 0 TO 0 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Tim Duncan")        |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Tim Duncan")        |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 | like.likeness | $$.player.name      |
+      | hash("Manu Ginobili")     | 95            | "Manu Ginobili"     |
+      | hash("LaMarcus Aldridge") | 90            | "LaMarcus Aldridge" |
+      | hash("Tim Duncan")        | 95            | "Tim Duncan"        |
+      | hash("Tony Parker")       | 95            | "Tony Parker"       |
+      | hash("Tony Parker")       | 75            | "Tony Parker"       |
+      | hash("Tim Duncan")        | 75            | "Tim Duncan"        |
+      | hash("Tim Duncan")        | 90            | "Tim Duncan"        |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like YIELD DISTINCT like._dst, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 | like.likeness | $$.player.name      |
+      | hash("Manu Ginobili")     | 95            | "Manu Ginobili"     |
+      | hash("LaMarcus Aldridge") | 90            | "LaMarcus Aldridge" |
+      | hash("Tim Duncan")        | 95            | "Tim Duncan"        |
+      | hash("Tony Parker")       | 95            | "Tony Parker"       |
+      | hash("Tony Parker")       | 75            | "Tony Parker"       |
+      | hash("Tim Duncan")        | 75            | "Tim Duncan"        |
+      | hash("Tim Duncan")        | 90            | "Tim Duncan"        |
+    When executing query:
+      """
+      GO 0 TO 3 STEPS FROM hash('Tim Duncan') OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst    |
+      | hash("Spurs") |
+    When executing query:
+      """
+      GO 2 TO 3 STEPS FROM hash('Tim Duncan') OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like REVERSELY YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tim Duncan")        |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Boris Diaw")        |
+      | hash("Dejounte Murray")   |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Tiago Splitter")    |
+      | hash("Shaquile O'Neal")   |
+      | hash("Rudy Gay")          |
+      | hash("Damian Lillard")    |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like REVERSELY YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tim Duncan")        |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Boris Diaw")        |
+      | hash("Dejounte Murray")   |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Tiago Splitter")    |
+      | hash("Shaquile O'Neal")   |
+      | hash("Rudy Gay")          |
+      | hash("Damian Lillard")    |
+    When executing query:
+      """
+      GO 2 TO 2 STEPS FROM hash('Tony Parker') OVER like REVERSELY YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Boris Diaw")        |
+      | hash("Dejounte Murray")   |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Tiago Splitter")    |
+      | hash("Shaquile O'Neal")   |
+      | hash("Rudy Gay")          |
+      | hash("Damian Lillard")    |
+    When executing query:
+      """
+      GO 1 TO 3 STEPS FROM hash('Spurs') OVER serve REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst                |
+      | hash("Tim Duncan")        |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Rudy Gay")          |
+      | hash("Marco Belinelli")   |
+      | hash("Danny Green")       |
+      | hash("Kyle Anderson")     |
+      | hash("Aron Baynes")       |
+      | hash("Boris Diaw")        |
+      | hash("Tiago Splitter")    |
+      | hash("Cory Joseph")       |
+      | hash("David West")        |
+      | hash("Jonathon Simmons")  |
+      | hash("Dejounte Murray")   |
+      | hash("Tracy McGrady")     |
+      | hash("Paul Gasol")        |
+      | hash("Marco Belinelli")   |
+    When executing query:
+      """
+      GO 0 TO 3 STEPS FROM hash('Spurs') OVER serve REVERSELY
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst                |
+      | hash("Tim Duncan")        |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("LaMarcus Aldridge") |
+      | hash("Rudy Gay")          |
+      | hash("Marco Belinelli")   |
+      | hash("Danny Green")       |
+      | hash("Kyle Anderson")     |
+      | hash("Aron Baynes")       |
+      | hash("Boris Diaw")        |
+      | hash("Tiago Splitter")    |
+      | hash("Cory Joseph")       |
+      | hash("David West")        |
+      | hash("Jonathon Simmons")  |
+      | hash("Dejounte Murray")   |
+      | hash("Tracy McGrady")     |
+      | hash("Paul Gasol")        |
+      | hash("Marco Belinelli")   |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Tony Parker') OVER like BIDIRECT YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tim Duncan")        |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Boris Diaw")        |
+      | hash("Dejounte Murray")   |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Tiago Splitter")    |
+      | hash("Shaquile O'Neal")   |
+      | hash("Rudy Gay")          |
+      | hash("Damian Lillard")    |
+      | hash("LeBron James")      |
+      | hash("Russell Westbrook") |
+      | hash("Chris Paul")        |
+      | hash("Kyle Anderson")     |
+      | hash("Kevin Durant")      |
+      | hash("James Harden")      |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Tony Parker') OVER like BIDIRECT YIELD DISTINCT like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | like._dst                 |
+      | hash("Tim Duncan")        |
+      | hash("LaMarcus Aldridge") |
+      | hash("Marco Belinelli")   |
+      | hash("Boris Diaw")        |
+      | hash("Dejounte Murray")   |
+      | hash("Tony Parker")       |
+      | hash("Manu Ginobili")     |
+      | hash("Danny Green")       |
+      | hash("Aron Baynes")       |
+      | hash("Tiago Splitter")    |
+      | hash("Shaquile O'Neal")   |
+      | hash("Rudy Gay")          |
+      | hash("Damian Lillard")    |
+      | hash("LeBron James")      |
+      | hash("Russell Westbrook") |
+      | hash("Chris Paul")        |
+      | hash("Kyle Anderson")     |
+      | hash("Kevin Durant")      |
+      | hash("James Harden")      |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Russell Westbrook') OVER * YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst       | like._dst                 |
+      | hash("Thunders") | EMPTY                     |
+      | EMPTY            | hash("Paul George")       |
+      | EMPTY            | hash("James Harden")      |
+      | hash("Pacers")   | EMPTY                     |
+      | hash("Thunders") | EMPTY                     |
+      | EMPTY            | hash("Russell Westbrook") |
+      | hash("Thunders") | EMPTY                     |
+      | hash("Rockets")  | EMPTY                     |
+      | EMPTY            | hash("Russell Westbrook") |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Russell Westbrook') OVER * YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst       | like._dst                 |
+      | hash("Thunders") | EMPTY                     |
+      | EMPTY            | hash("Paul George")       |
+      | EMPTY            | hash("James Harden")      |
+      | hash("Pacers")   | EMPTY                     |
+      | hash("Thunders") | EMPTY                     |
+      | EMPTY            | hash("Russell Westbrook") |
+      | hash("Thunders") | EMPTY                     |
+      | hash("Rockets")  | EMPTY                     |
+      | EMPTY            | hash("Russell Westbrook") |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Russell Westbrook') OVER *
+      YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst       | like._dst                 | serve.start_year | like.likeness | $$.player.name      |
+      | hash("Thunders") | EMPTY                     | 2008             | EMPTY         | EMPTY               |
+      | EMPTY            | hash("Paul George")       | EMPTY            | 90            | "Paul George"       |
+      | EMPTY            | hash("James Harden")      | EMPTY            | 90            | "James Harden"      |
+      | hash("Pacers")   | EMPTY                     | 2010             | EMPTY         | EMPTY               |
+      | hash("Thunders") | EMPTY                     | 2017             | EMPTY         | EMPTY               |
+      | EMPTY            | hash("Russell Westbrook") | EMPTY            | 95            | "Russell Westbrook" |
+      | hash("Thunders") | EMPTY                     | 2009             | EMPTY         | EMPTY               |
+      | hash("Rockets")  | EMPTY                     | 2012             | EMPTY         | EMPTY               |
+      | EMPTY            | hash("Russell Westbrook") | EMPTY            | 80            | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Russell Westbrook') OVER *
+      YIELD serve._dst, like._dst, serve.start_year, like.likeness, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst       | like._dst                 | serve.start_year | like.likeness | $$.player.name      |
+      | hash("Thunders") | EMPTY                     | 2008             | EMPTY         | EMPTY               |
+      | EMPTY            | hash("Paul George")       | EMPTY            | 90            | "Paul George"       |
+      | EMPTY            | hash("James Harden")      | EMPTY            | 90            | "James Harden"      |
+      | hash("Pacers")   | EMPTY                     | 2010             | EMPTY         | EMPTY               |
+      | hash("Thunders") | EMPTY                     | 2017             | EMPTY         | EMPTY               |
+      | EMPTY            | hash("Russell Westbrook") | EMPTY            | 95            | "Russell Westbrook" |
+      | hash("Thunders") | EMPTY                     | 2009             | EMPTY         | EMPTY               |
+      | hash("Rockets")  | EMPTY                     | 2012             | EMPTY         | EMPTY               |
+      | EMPTY            | hash("Russell Westbrook") | EMPTY            | 80            | "Russell Westbrook" |
+    When executing query:
+      """
+      GO 1 TO 2 STEPS FROM hash('Russell Westbrook') OVER * REVERSELY YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst                 |
+      | EMPTY      | hash("Dejounte Murray")   |
+      | EMPTY      | hash("James Harden")      |
+      | EMPTY      | hash("Paul George")       |
+      | EMPTY      | hash("Dejounte Murray")   |
+      | EMPTY      | hash("Russell Westbrook") |
+      | EMPTY      | hash("Luka Doncic")       |
+      | EMPTY      | hash("Russell Westbrook") |
+    When executing query:
+      """
+      GO 0 TO 2 STEPS FROM hash('Russell Westbrook') OVER * REVERSELY YIELD serve._dst, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst | like._dst                 |
+      | EMPTY      | hash("Dejounte Murray")   |
+      | EMPTY      | hash("James Harden")      |
+      | EMPTY      | hash("Paul George")       |
+      | EMPTY      | hash("Dejounte Murray")   |
+      | EMPTY      | hash("Russell Westbrook") |
+      | EMPTY      | hash("Luka Doncic")       |
+      | EMPTY      | hash("Russell Westbrook") |
+
+  Scenario: Integer Vid error message
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER serve YIELD $$.player.name as name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | name  |
+      | EMPTY |
+
+  Scenario: Integer Vid zero step
+    When executing query:
+      """
+      GO 0 STEPS FROM hash('Tim Duncan') OVER serve BIDIRECT
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO 0 STEPS FROM hash('Tim Duncan') OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+    When executing query:
+      """
+      GO 0 STEPS FROM hash('Tim Duncan') OVER like YIELD like._dst as id | GO FROM $-.id OVER serve
+      """
+    Then the result should be, in any order, with relax comparison:
+      | serve._dst |
+
+  Scenario: Integer Vid go cover input
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst | GO FROM $-.src OVER like
+      YIELD $-.src as src, like._dst as dst, $^.player.name, $$.player.name
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src                | dst                   | $^.player.name | $$.player.name  |
+      | hash("Tim Duncan") | hash("Tony Parker")   | "Tim Duncan"   | "Tony Parker"   |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | "Tim Duncan"   | "Manu Ginobili" |
+      | hash("Tim Duncan") | hash("Tony Parker")   | "Tim Duncan"   | "Tony Parker"   |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | "Tim Duncan"   | "Manu Ginobili" |
+    When executing query:
+      """
+      $a = GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst;
+      GO FROM $a.src OVER like YIELD $a.src as src, like._dst as dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src                | dst                   |
+      | hash("Tim Duncan") | hash("Tony Parker")   |
+      | hash("Tim Duncan") | hash("Manu Ginobili") |
+      | hash("Tim Duncan") | hash("Tony Parker")   |
+      | hash("Tim Duncan") | hash("Manu Ginobili") |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst
+      | GO 1 TO 2 STEPS FROM $-.src OVER like YIELD $-.src as src, like._dst as dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src                | dst                       |
+      | hash("Tim Duncan") | hash("Tony Parker")       |
+      | hash("Tim Duncan") | hash("Manu Ginobili")     |
+      | hash("Tim Duncan") | hash("Tony Parker")       |
+      | hash("Tim Duncan") | hash("Manu Ginobili")     |
+      | hash("Tim Duncan") | hash("Tim Duncan")        |
+      | hash("Tim Duncan") | hash("Tim Duncan")        |
+      | hash("Tim Duncan") | hash("Manu Ginobili")     |
+      | hash("Tim Duncan") | hash("Manu Ginobili")     |
+      | hash("Tim Duncan") | hash("LaMarcus Aldridge") |
+      | hash("Tim Duncan") | hash("LaMarcus Aldridge") |
+      | hash("Tim Duncan") | hash("Tim Duncan")        |
+      | hash("Tim Duncan") | hash("Tim Duncan")        |
+    When executing query:
+      """
+      GO FROM hash('Tim Duncan') OVER like YIELD like._src as src, like._dst as dst
+      | GO 1 TO 2 STEPS FROM $-.src OVER like
+      YIELD $-.src as src, $-.dst, like._dst as dst, like.likeness
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src                | $-.dst                | dst                       | like.likeness |
+      | hash("Tim Duncan") | hash("Tony Parker")   | hash("Tony Parker")       | 95            |
+      | hash("Tim Duncan") | hash("Tony Parker")   | hash("Manu Ginobili")     | 95            |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Tony Parker")       | 95            |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Manu Ginobili")     | 95            |
+      | hash("Tim Duncan") | hash("Tony Parker")   | hash("Tim Duncan")        | 95            |
+      | hash("Tim Duncan") | hash("Tony Parker")   | hash("Manu Ginobili")     | 95            |
+      | hash("Tim Duncan") | hash("Tony Parker")   | hash("LaMarcus Aldridge") | 90            |
+      | hash("Tim Duncan") | hash("Tony Parker")   | hash("Tim Duncan")        | 90            |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Tim Duncan")        | 95            |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Manu Ginobili")     | 95            |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | hash("LaMarcus Aldridge") | 90            |
+      | hash("Tim Duncan") | hash("Manu Ginobili") | hash("Tim Duncan")        | 90            |
+    When executing query:
+      """
+      GO FROM hash('Danny Green') OVER like YIELD like._src AS src, like._dst AS dst
+      | GO FROM $-.dst OVER teammate YIELD $-.src AS src, $-.dst, teammate._dst AS dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src                 | $-.dst             | dst                       |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("Tony Parker")       |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("Manu Ginobili")     |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("LaMarcus Aldridge") |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("Danny Green")       |
+    When executing query:
+      """
+      $a = GO FROM hash('Danny Green') OVER like YIELD like._src AS src, like._dst AS dst;
+      GO FROM $a.dst OVER teammate YIELD $a.src AS src, $a.dst, teammate._dst AS dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | src                 | $a.dst             | dst                       |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("Tony Parker")       |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("Manu Ginobili")     |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("LaMarcus Aldridge") |
+      | hash("Danny Green") | hash("Tim Duncan") | hash("Danny Green")       |
+
+  Scenario: Integer Vid backtrack overlap
+    When executing query:
+      """
+      GO FROM hash('Tony Parker') OVER like YIELD like._src as src, like._dst as dst
+      | GO 2 STEPS FROM $-.src OVER like YIELD $-.src, $-.dst, like._src, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $-.src              | $-.dst                     | like._src                  | like._dst              |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("Tim Duncan" )        | hash("Manu Ginobili")  |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("Tim Duncan" )        | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("LaMarcus Aldridge" ) | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("Manu Ginobili")      | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("Tim Duncan" )        | hash("Manu Ginobili" ) |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("Tim Duncan" )        | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("LaMarcus Aldridge" ) | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("Manu Ginobili" )     | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )        | hash("Manu Ginobili" ) |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )        | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Manu Ginobili" )     | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )    |
+    When executing query:
+      """
+      $a = GO FROM hash('Tony Parker') OVER like YIELD like._src as src, like._dst as dst;
+      GO 2 STEPS FROM $a.src OVER like YIELD $a.src, $a.dst, like._src, like._dst
+      """
+    Then the result should be, in any order, with relax comparison:
+      | $a.src              | $a.dst                     | like._src                  | like._dst              |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("Tim Duncan" )        | hash("Manu Ginobili")  |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("Tim Duncan" )        | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("LaMarcus Aldridge" ) | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("Manu Ginobili")      | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("Tim Duncan" )        | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("Tim Duncan" )        | hash("Manu Ginobili" ) |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("Tim Duncan" )        | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("LaMarcus Aldridge" ) | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("Manu Ginobili" )     | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("Manu Ginobili" )     | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )        | hash("Manu Ginobili" ) |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )        | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tony Parker")    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("Manu Ginobili" )     | hash("Tim Duncan" )    |
+      | hash("Tony Parker") | hash("LaMarcus Aldridge" ) | hash("LaMarcus Aldridge" ) | hash("Tim Duncan" )    |