This is an automated email from the ASF dual-hosted git repository.

ming pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-hugegraph-toolchain.git


The following commit(s) were added to refs/heads/master by this push:
     new 0e1caa07 refact(client): update tests for new OLTP traverser APIs 
(#550)
0e1caa07 is described below

commit 0e1caa07d2c078e619a3deaa6679ac34c7202b39
Author: Wu Chencan <[email protected]>
AuthorDate: Tue Dec 12 12:43:40 2023 +0800

    refact(client): update tests for new OLTP traverser APIs (#550)
    
    * update tests with new traverser apis
    
    * remove print
    
    * license header fixed
    
    * pick from https://github.com/apache/incubator-hugegraph-toolchain/pull/542
    
    * update paths
    
    * ignore test in client
    
    * ignore test in client
    
    * update commit id
    
    * fix names & tests
    
    * remote plugin from pom
    
    * fix token & ignore testCountWithProperties first
    
    * feat(tool):hg client support new metric api
    
    * update commit id
    
    * Update client-go-ci.yml
    
    ---------
    
    Co-authored-by: imbajin <[email protected]>
    Co-authored-by: 1289220708 <[email protected]>
    Co-authored-by: Simon Cheung <[email protected]>
---
 .github/workflows/client-ci.yml                    |   3 +-
 .github/workflows/client-go-ci.yml                 |   9 +-
 .github/workflows/hubble-ci.yml                    |   4 +-
 .github/workflows/loader-ci.yml                    |   3 +-
 .github/workflows/tools-ci.yml                     |   2 +-
 .../travis/install-hugegraph-from-source.sh        |   5 +-
 .../apache/hugegraph/api/metrics/MetricsAPI.java   |  30 +++++
 .../api/traverser/JaccardSimilarityAPI.java        |   5 +-
 .../api/traverser/SingleSourceShortestPathAPI.java |   3 +-
 .../api/traverser/WeightedShortestPathAPI.java     |   3 +-
 .../apache/hugegraph/driver/MetricsManager.java    |  12 ++
 .../apache/hugegraph/driver/TraverserManager.java  |  42 ++++---
 .../hugegraph/structure/constant/Traverser.java    |   2 +
 .../{WeightedPaths.java => ApiMeasure.java}        |  29 ++---
 .../structure/traverser/CrosspointsRequest.java    |  13 +-
 .../structure/traverser/CustomizedCrosspoints.java |  13 ++
 .../traverser/CustomizedPathsRequest.java          |  12 +-
 .../structure/traverser/FusiformSimilarity.java    |   6 +
 .../{Kout.java => JaccardSimilarity.java}          |  37 +++---
 .../hugegraph/structure/traverser/Kneighbor.java   |  13 ++
 .../structure/traverser/KneighborRequest.java      |  36 +++---
 .../apache/hugegraph/structure/traverser/Kout.java |  13 ++
 .../hugegraph/structure/traverser/KoutRequest.java |  43 ++++---
 .../traverser/MultiNodeShortestPathRequest.java    |  12 +-
 .../structure/traverser/PathsRequest.java          |  11 +-
 .../structure/traverser/PathsWithVertices.java     |  13 ++
 .../structure/traverser/TemplatePathsRequest.java  |  23 ++--
 .../hugegraph/structure/traverser/VEStep.java      |  75 ++++++++++++
 .../hugegraph/structure/traverser/VESteps.java     | 136 +++++++++++++++++++++
 .../structure/traverser/WeightedPath.java          |  13 ++
 .../structure/traverser/WeightedPaths.java         |  13 ++
 .../apache/hugegraph/api/auth/TokenApiTest.java    |   8 +-
 .../api/traverser/CommonTraverserApiTest.java      |   6 +-
 .../hugegraph/api/traverser/CountApiTest.java      |  24 ++--
 .../api/traverser/CustomizedPathsApiTest.java      |  14 +--
 .../api/traverser/FusiformSimilarityApiTest.java   |  98 +++------------
 .../api/traverser/JaccardSimilarityApiTest.java    |  24 ++--
 .../hugegraph/api/traverser/KneighborApiTest.java  |  89 ++++++++------
 .../hugegraph/api/traverser/KoutApiTest.java       | 102 ++++++++++------
 .../traverser/MultiNodeShortestPathApiTest.java    |  26 ++--
 .../hugegraph/api/traverser/PathsApiTest.java      |  11 +-
 .../traverser/SingleSourceShortestPathApiTest.java |  28 ++---
 .../api/traverser/TemplatePathsApiTest.java        |  11 +-
 .../api/traverser/WeightedShortestPathApiTest.java |  40 +++---
 .../hugegraph/functional/MetricsManagerTest.java   |  12 ++
 .../assembly/travis/download-hugegraph.sh          |   5 +-
 .../travis/install-hugegraph-from-source.sh        |   5 +-
 .../travis/install-hugegraph-from-source.sh        |   5 +-
 48 files changed, 787 insertions(+), 355 deletions(-)

diff --git a/.github/workflows/client-ci.yml b/.github/workflows/client-ci.yml
index f9e2dbe7..ee5e9562 100644
--- a/.github/workflows/client-ci.yml
+++ b/.github/workflows/client-ci.yml
@@ -24,8 +24,7 @@ jobs:
     env:
       USE_STAGE: 'true' # Whether to include the stage repository.
       TRAVIS_DIR: hugegraph-client/assembly/travis
-      # TODO: replace it with the (latest - n) commit id (n >= 15)
-      COMMIT_ID: be6ee386b9939dc6bd6fcbdf2274b8acc3a0a314
+      COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
     strategy:
       fail-fast: false
       matrix:
diff --git a/.github/workflows/client-go-ci.yml 
b/.github/workflows/client-go-ci.yml
index bb97bf73..2a941a0d 100644
--- a/.github/workflows/client-go-ci.yml
+++ b/.github/workflows/client-go-ci.yml
@@ -21,8 +21,9 @@ jobs:
   client-go-ci:
     runs-on: ubuntu-latest
     env:
+      USE_STAGE: 'true' # Whether to include the stage repository.
       TRAVIS_DIR: hugegraph-client/assembly/travis
-      COMMIT_ID: be6ee386b9939dc6bd6fcbdf2274b8acc3a0a314
+      COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
     strategy:
       fail-fast: false
       matrix:
@@ -46,6 +47,12 @@ jobs:
         with:
           fetch-depth: 2
 
+      - name: Use staged maven repo
+        if: ${{ env.USE_STAGE == 'true' }}
+        run: |
+          cp $HOME/.m2/settings.xml /tmp/settings.xml
+          mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
+
       - name: Prepare env and service
         run: |
           $TRAVIS_DIR/install-hugegraph-from-source.sh $COMMIT_ID
diff --git a/.github/workflows/hubble-ci.yml b/.github/workflows/hubble-ci.yml
index 0451f0ce..d88c6509 100644
--- a/.github/workflows/hubble-ci.yml
+++ b/.github/workflows/hubble-ci.yml
@@ -23,8 +23,8 @@ on:
 
 env:
   TRAVIS_DIR: hugegraph-hubble/hubble-dist/assembly/travis
-  # TODO: replace it with the (latest - n) commit id (n >= 15)
-  COMMIT_ID: be6ee386b9939dc6bd6fcbdf2274b8acc3a0a314
+  # TODO: need update it later (eed6103359fe40d2f1476fb8c56d9388c3111a99)
+  COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
 
 jobs:
   hubble-ci:
diff --git a/.github/workflows/loader-ci.yml b/.github/workflows/loader-ci.yml
index 267994ed..70849b52 100644
--- a/.github/workflows/loader-ci.yml
+++ b/.github/workflows/loader-ci.yml
@@ -26,8 +26,7 @@ jobs:
       USE_STAGE: 'true' # Whether to include the stage repository.
       TRAVIS_DIR: hugegraph-loader/assembly/travis
       STATIC_DIR: hugegraph-loader/assembly/static
-      # TODO: replace it with the (latest - n) commit id (n >= 15)
-      COMMIT_ID: be6ee386b9939dc6bd6fcbdf2274b8acc3a0a314
+      COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
       DB_USER: root
       DB_PASS: root
       DB_DATABASE: load_test
diff --git a/.github/workflows/tools-ci.yml b/.github/workflows/tools-ci.yml
index 9c64b9e7..ea4756d7 100644
--- a/.github/workflows/tools-ci.yml
+++ b/.github/workflows/tools-ci.yml
@@ -25,7 +25,7 @@ jobs:
       USE_STAGE: 'true' # Whether to include the stage repository.
       TRAVIS_DIR: hugegraph-tools/assembly/travis
       # TODO: could we use one param to unify it? or use a action template 
(could use one ci file)
-      COMMIT_ID: be6ee386b9939dc6bd6fcbdf2274b8acc3a0a314
+      COMMIT_ID: bfe9fae150446857412db23ada0dae9d05035837
     steps:
       - name: Install JDK 11
         uses: actions/setup-java@v3
diff --git a/hugegraph-client/assembly/travis/install-hugegraph-from-source.sh 
b/hugegraph-client/assembly/travis/install-hugegraph-from-source.sh
index 2c9ea319..3dc3dcdf 100755
--- a/hugegraph-client/assembly/travis/install-hugegraph-from-source.sh
+++ b/hugegraph-client/assembly/travis/install-hugegraph-from-source.sh
@@ -32,9 +32,10 @@ git checkout "${COMMIT_ID}"
 mvn package -DskipTests -Dmaven.javadoc.skip=true -ntp
 
 # TODO: lack incubator after apache package release (update it later)
+cd hugegraph-server
 TAR=$(echo apache-hugegraph-*.tar.gz)
-tar zxf "${TAR}" -C ../
-cd ../
+tar zxf "${TAR}" -C ../../
+cd ../../
 rm -rf "${GIT_DIR}"
 # TODO: lack incubator after apache package release (update it later)
 HTTP_SERVER_DIR=$(echo apache-hugegraph-*.*)
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
index a4fd226d..fec52283 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
@@ -17,6 +17,7 @@
 
 package org.apache.hugegraph.api.metrics;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.hugegraph.util.CommonUtil;
@@ -27,6 +28,8 @@ import org.apache.hugegraph.structure.constant.HugeType;
 
 public class MetricsAPI extends API {
 
+    public static final String STATISTICS_PATH = "/statistics";
+
     public MetricsAPI(RestClient client) {
         super(client);
         this.path(this.type());
@@ -65,12 +68,39 @@ public class MetricsAPI extends API {
 
     @SuppressWarnings("unchecked")
     public Map<String, Map<String, Object>> all() {
+        Map<String,Object> params = new HashMap<>();
+        params.put("type", "json");
+        RestResult result = this.client.get(this.path(), params);
+        Map<?, ?> map = result.readObject(Map.class);
+        CommonUtil.checkMapClass(map, String.class, Map.class);
+        for (Object mapValue : map.values()) {
+            CommonUtil.checkMapClass(mapValue, String.class, Object.class);
+        }
+        return (Map<String, Map<String, Object>>) map;
+    }
+
+    @SuppressWarnings("unchecked")
+    public String allWithPromFormat() {
         RestResult result = this.client.get(this.path());
+        return result.content();
+    }
+
+    public Map<String, Map<String, Object>> statistics() {
+        Map<String,Object> params = new HashMap<>();
+        params.put("type", "json");
+        RestResult result = this.client.get(this.path() + STATISTICS_PATH, 
params);
         Map<?, ?> map = result.readObject(Map.class);
         CommonUtil.checkMapClass(map, String.class, Map.class);
         for (Object mapValue : map.values()) {
             CommonUtil.checkMapClass(mapValue, String.class, Object.class);
         }
+
         return (Map<String, Map<String, Object>>) map;
     }
+
+    @SuppressWarnings("unchecked")
+    public String statisticsWithPromFormat() {
+        RestResult result = this.client.get(this.path() + STATISTICS_PATH);
+        return result.content();
+    }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/JaccardSimilarityAPI.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/JaccardSimilarityAPI.java
index 80fe8b48..f87958bb 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/JaccardSimilarityAPI.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/JaccardSimilarityAPI.java
@@ -26,6 +26,7 @@ import org.apache.hugegraph.client.RestClient;
 import org.apache.hugegraph.rest.RestResult;
 
 import org.apache.hugegraph.structure.constant.Direction;
+import org.apache.hugegraph.structure.traverser.JaccardSimilarity;
 import 
org.apache.hugegraph.structure.traverser.SingleSourceJaccardSimilarityRequest;
 
 import org.apache.hugegraph.util.E;
@@ -64,9 +65,9 @@ public class JaccardSimilarityAPI extends TraversersAPI {
     }
 
     @SuppressWarnings("unchecked")
-    public Map<Object, Double> post(SingleSourceJaccardSimilarityRequest 
request) {
+    public JaccardSimilarity post(SingleSourceJaccardSimilarityRequest 
request) {
         this.client.checkApiVersion("0.58", "jaccard similar");
         RestResult result = this.client.post(this.path(), request);
-        return result.readObject(Map.class);
+        return result.readObject(JaccardSimilarity.class);
     }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathAPI.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathAPI.java
index a1930fc3..31ee2dbd 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathAPI.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathAPI.java
@@ -40,7 +40,7 @@ public class SingleSourceShortestPathAPI extends 
TraversersAPI {
 
     public WeightedPaths get(Object sourceId, Direction direction, String 
label,
                              String weight, long degree, long skipDegree,
-                             long capacity, int limit, boolean withVertex) {
+                             long capacity, int limit, boolean withVertex, 
boolean withEdge) {
         this.client.checkApiVersion("0.51", "single source shortest path");
         String source = GraphAPI.formatVertexId(sourceId, false);
 
@@ -60,6 +60,7 @@ public class SingleSourceShortestPathAPI extends 
TraversersAPI {
         params.put("capacity", capacity);
         params.put("limit", limit);
         params.put("with_vertex", withVertex);
+        params.put("with_edge", withEdge);
         RestResult result = this.client.get(this.path(), params);
         return result.readObject(WeightedPaths.class);
     }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/WeightedShortestPathAPI.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/WeightedShortestPathAPI.java
index 7cf2a3b2..aaf043f9 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/WeightedShortestPathAPI.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/api/traverser/WeightedShortestPathAPI.java
@@ -41,7 +41,7 @@ public class WeightedShortestPathAPI extends TraversersAPI {
     public WeightedPath get(Object sourceId, Object targetId,
                             Direction direction, String label,
                             String weight, long degree, long skipDegree,
-                            long capacity, boolean withVertex) {
+                            long capacity, boolean withVertex, boolean 
withEdge) {
         this.client.checkApiVersion("0.51", "weighted shortest path");
         String source = GraphAPI.formatVertexId(sourceId, false);
         String target = GraphAPI.formatVertexId(targetId, false);
@@ -61,6 +61,7 @@ public class WeightedShortestPathAPI extends TraversersAPI {
         params.put("skip_degree", skipDegree);
         params.put("capacity", capacity);
         params.put("with_vertex", withVertex);
+        params.put("with_edge", withEdge);
         RestResult result = this.client.get(this.path(), params);
         return result.readObject(WeightedPath.class);
     }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/MetricsManager.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/MetricsManager.java
index df6facb1..b3ff5c08 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/MetricsManager.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/MetricsManager.java
@@ -48,4 +48,16 @@ public class MetricsManager {
     public Map<String, Map<String, Object>> all() {
         return this.metricsAPI.all();
     }
+
+    public String allWithPromFormat() {
+        return this.metricsAPI.allWithPromFormat();
+    }
+
+    public Map<String, Map<String, Object>> statistics() {
+        return this.metricsAPI.statistics();
+    }
+
+    public String statisticsWithPromFormat() {
+        return this.metricsAPI.statisticsWithPromFormat();
+    }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
index 735046a7..3d9d1208 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/driver/TraverserManager.java
@@ -19,10 +19,7 @@ package org.apache.hugegraph.driver;
 
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
-import org.apache.hugegraph.structure.constant.Direction;
-import org.apache.hugegraph.structure.constant.Traverser;
 import org.apache.hugegraph.api.traverser.AllShortestPathsAPI;
 import org.apache.hugegraph.api.traverser.CountAPI;
 import org.apache.hugegraph.api.traverser.CrosspointsAPI;
@@ -46,6 +43,8 @@ import org.apache.hugegraph.api.traverser.TemplatePathsAPI;
 import org.apache.hugegraph.api.traverser.VerticesAPI;
 import org.apache.hugegraph.api.traverser.WeightedShortestPathAPI;
 import org.apache.hugegraph.client.RestClient;
+import org.apache.hugegraph.structure.constant.Direction;
+import org.apache.hugegraph.structure.constant.Traverser;
 import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Edges;
 import org.apache.hugegraph.structure.graph.GraphIterator;
@@ -56,18 +55,19 @@ import org.apache.hugegraph.structure.graph.Vertices;
 import org.apache.hugegraph.structure.traverser.CountRequest;
 import org.apache.hugegraph.structure.traverser.CrosspointsRequest;
 import org.apache.hugegraph.structure.traverser.CustomizedCrosspoints;
-import org.apache.hugegraph.structure.traverser.MultiNodeShortestPathRequest;
-import org.apache.hugegraph.structure.traverser.PathsWithVertices;
+import org.apache.hugegraph.structure.traverser.CustomizedPathsRequest;
 import org.apache.hugegraph.structure.traverser.FusiformSimilarity;
 import org.apache.hugegraph.structure.traverser.FusiformSimilarityRequest;
-import 
org.apache.hugegraph.structure.traverser.SingleSourceJaccardSimilarityRequest;
+import org.apache.hugegraph.structure.traverser.JaccardSimilarity;
 import org.apache.hugegraph.structure.traverser.Kneighbor;
 import org.apache.hugegraph.structure.traverser.KneighborRequest;
 import org.apache.hugegraph.structure.traverser.Kout;
 import org.apache.hugegraph.structure.traverser.KoutRequest;
-import org.apache.hugegraph.structure.traverser.CustomizedPathsRequest;
+import org.apache.hugegraph.structure.traverser.MultiNodeShortestPathRequest;
 import org.apache.hugegraph.structure.traverser.PathsRequest;
+import org.apache.hugegraph.structure.traverser.PathsWithVertices;
 import org.apache.hugegraph.structure.traverser.Ranks;
+import 
org.apache.hugegraph.structure.traverser.SingleSourceJaccardSimilarityRequest;
 import org.apache.hugegraph.structure.traverser.TemplatePathsRequest;
 import org.apache.hugegraph.structure.traverser.WeightedPath;
 import org.apache.hugegraph.structure.traverser.WeightedPaths;
@@ -143,7 +143,7 @@ public class TraverserManager {
                                              label, degree);
     }
 
-    public Map<Object, Double> 
jaccardSimilarity(SingleSourceJaccardSimilarityRequest request) {
+    public JaccardSimilarity 
jaccardSimilarity(SingleSourceJaccardSimilarityRequest request) {
         return this.jaccardSimilarityAPI.post(request);
     }
 
@@ -241,19 +241,20 @@ public class TraverserManager {
 
     public WeightedPaths singleSourceShortestPath(Object sourceId,
                                                   String weight,
-                                                  boolean withVertex) {
+                                                  boolean withVertex,
+                                                  boolean withEdge) {
         return this.singleSourceShortestPath(sourceId, Direction.BOTH, null,
-                                             weight, withVertex);
+                                             weight, withVertex, withEdge);
     }
 
     public WeightedPaths singleSourceShortestPath(Object sourceId,
                                                   Direction direction,
                                                   String label, String weight,
-                                                  boolean withVertex) {
+                                                  boolean withVertex, boolean 
withEdge) {
         return this.singleSourceShortestPath(sourceId, direction, label, 
weight,
                                              Traverser.DEFAULT_MAX_DEGREE, 0L,
                                              Traverser.DEFAULT_CAPACITY,
-                                             Traverser.DEFAULT_PATHS_LIMIT, 
withVertex);
+                                             Traverser.DEFAULT_PATHS_LIMIT, 
withVertex, withEdge);
     }
 
     public WeightedPaths singleSourceShortestPath(Object sourceId,
@@ -261,35 +262,36 @@ public class TraverserManager {
                                                   String label, String weight,
                                                   long degree, long skipDegree,
                                                   long capacity, int limit,
-                                                  boolean withVertex) {
+                                                  boolean withVertex, boolean 
withEdge) {
         return this.singleSourceShortestPathAPI.get(sourceId, direction, label,
                                                     weight, degree, skipDegree,
                                                     capacity, limit,
-                                                    withVertex);
+                                                    withVertex, withEdge);
     }
 
     public WeightedPath weightedShortestPath(Object sourceId, Object targetId,
-                                             String weight, boolean 
withVertex) {
+                                             String weight, boolean 
withVertex, boolean withEdge) {
         return this.weightedShortestPath(sourceId, targetId, Direction.BOTH,
-                                         null, weight, withVertex);
+                                         null, weight, withVertex, withEdge);
     }
 
     public WeightedPath weightedShortestPath(Object sourceId, Object targetId,
                                              Direction direction, String label,
                                              String weight,
-                                             boolean withVertex) {
+                                             boolean withVertex,
+                                             boolean withEdge) {
         return this.weightedShortestPath(sourceId, targetId, direction, label,
                                          weight, Traverser.DEFAULT_MAX_DEGREE, 
0L,
-                                         Traverser.DEFAULT_CAPACITY, 
withVertex);
+                                         Traverser.DEFAULT_CAPACITY, 
withVertex, withEdge);
     }
 
     public WeightedPath weightedShortestPath(Object sourceId, Object targetId,
                                              Direction direction,
                                              String label, String weight,
                                              long degree, long skipDegree,
-                                             long capacity, boolean 
withVertex) {
+                                             long capacity, boolean 
withVertex, boolean withEdge) {
         return this.weightedShortestPathAPI.get(sourceId, targetId, direction, 
label, weight,
-                                                degree, skipDegree, capacity, 
withVertex);
+                                                degree, skipDegree, capacity, 
withVertex, withEdge);
     }
 
     public PathsWithVertices 
multiNodeShortestPath(MultiNodeShortestPathRequest request) {
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/constant/Traverser.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/constant/Traverser.java
index 3b1aaea8..cc2398d9 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/constant/Traverser.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/constant/Traverser.java
@@ -33,4 +33,6 @@ public class Traverser {
     public static final double DEFAULT_ALPHA = 0.9;
     public static final int DEFAULT_MAX_TOP = 1000;
     public static final int DEFAULT_MAX_DEPTH = 5000;
+    public static final String TRAVERSE_MODE_BFS = "breadth_first_search";
+    public static final String TRAVERSE_MODE_DFS = "depth_first_search";
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/ApiMeasure.java
similarity index 69%
copy from 
hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
copy to 
hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/ApiMeasure.java
index 1870de51..c5037b55 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/ApiMeasure.java
@@ -17,25 +17,26 @@
 
 package org.apache.hugegraph.structure.traverser;
 
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.hugegraph.structure.graph.Vertex;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class WeightedPaths {
+public class ApiMeasure {
 
-    @JsonProperty
-    private Map<Object, WeightedPath.Path> paths;
-    @JsonProperty
-    private Set<Vertex> vertices;
+    @JsonProperty("edge_iterations")
+    private Long edgeIters;
+    @JsonProperty("vertice_iterations")
+    private Long verticeIters;
+    @JsonProperty("cost(ns)")
+    private Long totalTime;
+
+    public Long edgeIters() {
+        return this.edgeIters;
+    }
 
-    public Map<Object, WeightedPath.Path> paths() {
-        return this.paths;
+    public Long verticeIters() {
+        return this.verticeIters;
     }
 
-    public Set<Vertex> vertices() {
-        return this.vertices;
+    public Long totalTime() {
+        return this.totalTime;
     }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CrosspointsRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CrosspointsRequest.java
index 7a39fe55..7371e95b 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CrosspointsRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CrosspointsRequest.java
@@ -43,6 +43,8 @@ public class CrosspointsRequest {
     private boolean withPath;
     @JsonProperty("with_vertex")
     private boolean withVertex;
+    @JsonProperty("with_edge")
+    private boolean withEdge;
 
     private CrosspointsRequest() {
         this.sources = null;
@@ -51,6 +53,7 @@ public class CrosspointsRequest {
         this.limit = Traverser.DEFAULT_CROSSPOINT_LIMIT;
         this.withPath = false;
         this.withVertex = false;
+        this.withEdge = false;
     }
 
     public static Builder builder() {
@@ -61,9 +64,10 @@ public class CrosspointsRequest {
     public String toString() {
         return String.format("CrosspointsRequest{sourceVertex=%s," +
                              "pathPatterns=%s,capacity=%s,limit=%s," +
-                             "withPath=%s,withVertex=%s}",
+                             "withPath=%s,withVertex=%s,withEdge=%s}",
                              this.sources, this.pathPatterns, this.capacity,
-                             this.limit, this.withPath, this.withVertex);
+                             this.limit, this.withPath, this.withVertex,
+                             this.withEdge);
     }
 
     public static class Builder {
@@ -110,6 +114,11 @@ public class CrosspointsRequest {
             return this;
         }
 
+        public Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public CrosspointsRequest build() {
             this.request.sources = this.sourcesBuilder.build();
             for (PathPattern.Builder builder : this.pathPatternBuilders) {
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedCrosspoints.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedCrosspoints.java
index 80d4d1a2..568d5983 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedCrosspoints.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedCrosspoints.java
@@ -20,6 +20,7 @@ package org.apache.hugegraph.structure.traverser;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Path;
 import org.apache.hugegraph.structure.graph.Vertex;
 
@@ -33,6 +34,10 @@ public class CustomizedCrosspoints {
     private List<Path> paths;
     @JsonProperty
     private Set<Vertex> vertices;
+    @JsonProperty
+    private Set<Edge> edges;
+    @JsonProperty
+    private ApiMeasure measure;
 
     public List<Object> crosspoints() {
         return this.crosspoints;
@@ -45,4 +50,12 @@ public class CustomizedCrosspoints {
     public Set<Vertex> vertices() {
         return this.vertices;
     }
+
+    public Set<Edge> edges() {
+        return this.edges;
+    }
+
+    public ApiMeasure measure() {
+        return this.measure;
+    }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedPathsRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedPathsRequest.java
index de41abab..b238286e 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedPathsRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/CustomizedPathsRequest.java
@@ -45,6 +45,8 @@ public class CustomizedPathsRequest {
     private int limit;
     @JsonProperty("with_vertex")
     private boolean withVertex;
+    @JsonProperty("with_edge")
+    private boolean withEdge;
 
     private CustomizedPathsRequest() {
         this.sources = null;
@@ -53,6 +55,7 @@ public class CustomizedPathsRequest {
         this.capacity = Traverser.DEFAULT_CAPACITY;
         this.limit = Traverser.DEFAULT_PATHS_LIMIT;
         this.withVertex = false;
+        this.withEdge = false;
     }
 
     public static Builder builder() {
@@ -63,9 +66,9 @@ public class CustomizedPathsRequest {
     public String toString() {
         return 
String.format("CustomizedPathsRequest{sourceVertex=%s,steps=%s," +
                              "sortBy=%s,capacity=%s,limit=%s," +
-                             "withVertex=%s}", this.sources, this.steps,
+                             "withVertex=%s,withEdge=%s}", this.sources, 
this.steps,
                              this.sortBy, this.capacity, this.limit,
-                             this.withVertex);
+                             this.withVertex, this.withEdge);
     }
 
     public static class Builder {
@@ -112,6 +115,11 @@ public class CustomizedPathsRequest {
             return this;
         }
 
+        public Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public CustomizedPathsRequest build() {
             this.request.sources = this.sourcesBuilder.build();
             for (Step.Builder builder : this.stepBuilders) {
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/FusiformSimilarity.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/FusiformSimilarity.java
index d0b0925d..f354ff1d 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/FusiformSimilarity.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/FusiformSimilarity.java
@@ -30,6 +30,8 @@ public class FusiformSimilarity {
     private Map<Object, Set<Similar>> similarsMap;
     @JsonProperty("vertices")
     private Set<Vertex> vertices;
+    @JsonProperty("measure")
+    private ApiMeasure measure;
 
     public Map<Object, Set<Similar>> similarsMap() {
         return this.similarsMap;
@@ -39,6 +41,10 @@ public class FusiformSimilarity {
         return this.vertices;
     }
 
+    public ApiMeasure measure() {
+        return this.measure;
+    }
+
     public int size() {
         return this.similarsMap.size();
     }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/JaccardSimilarity.java
similarity index 65%
copy from 
hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
copy to 
hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/JaccardSimilarity.java
index 966c4d6b..428598cc 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/JaccardSimilarity.java
@@ -17,38 +17,35 @@
 
 package org.apache.hugegraph.structure.traverser;
 
-import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
-import org.apache.hugegraph.structure.graph.Path;
-import org.apache.hugegraph.structure.graph.Vertex;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-public class Kout {
+public class JaccardSimilarity {
 
+    @JsonProperty("jaccard_similarity")
+    private Map<Object, Double> similarsMap;
     @JsonProperty
-    private int size;
-    @JsonProperty("kout")
-    private Set<Object> ids;
-    @JsonProperty
-    private List<Path> paths;
-    @JsonProperty
-    private Set<Vertex> vertices;
+    private ApiMeasure measure;
 
-    public int size() {
-        return this.size;
+    public Map<Object, Double> similarsMap() {
+        return this.similarsMap;
     }
 
-    public Set<Object> ids() {
-        return this.ids;
+    public ApiMeasure measure() {
+        return this.measure;
+    }
+
+    public int size() {
+        return this.similarsMap.size();
     }
 
-    public List<Path> paths() {
-        return this.paths;
+    public Set<Object> keySet() {
+        return this.similarsMap.keySet();
     }
 
-    public Set<Vertex> vertices() {
-        return this.vertices;
+    public Double get(Object key) {
+        return this.similarsMap.get(key);
     }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kneighbor.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kneighbor.java
index 7244eacd..df132b1f 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kneighbor.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kneighbor.java
@@ -20,6 +20,7 @@ package org.apache.hugegraph.structure.traverser;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Path;
 import org.apache.hugegraph.structure.graph.Vertex;
 
@@ -35,6 +36,10 @@ public class Kneighbor {
     private List<Path> paths;
     @JsonProperty
     private Set<Vertex> vertices;
+    @JsonProperty
+    private Set<Edge> edges;
+    @JsonProperty
+    private ApiMeasure measure;
 
     public int size() {
         return this.size;
@@ -51,4 +56,12 @@ public class Kneighbor {
     public Set<Vertex> vertices() {
         return this.vertices;
     }
+
+    public Set<Edge> edges() {
+        return this.edges;
+    }
+
+    public ApiMeasure measure() {
+        return this.measure;
+    }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KneighborRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KneighborRequest.java
index ea03fc8e..4c9bd580 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KneighborRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KneighborRequest.java
@@ -27,8 +27,8 @@ public class KneighborRequest {
 
     @JsonProperty("source")
     private Object source;
-    @JsonProperty("step")
-    public EdgeStep step;
+    @JsonProperty("steps")
+    public VESteps steps;
     @JsonProperty("max_depth")
     public int maxDepth;
     @JsonProperty("count_only")
@@ -39,15 +39,18 @@ public class KneighborRequest {
     public boolean withVertex;
     @JsonProperty("with_path")
     public boolean withPath;
+    @JsonProperty("with_edge")
+    public boolean withEdge;
 
     private KneighborRequest() {
         this.source = null;
-        this.step = null;
+        this.steps = null;
         this.maxDepth = Traverser.DEFAULT_MAX_DEPTH;
         this.countOnly = false;
         this.limit = Traverser.DEFAULT_PATHS_LIMIT;
         this.withVertex = false;
         this.withPath = false;
+        this.withEdge = false;
     }
 
     public static Builder builder() {
@@ -56,21 +59,21 @@ public class KneighborRequest {
 
     @Override
     public String toString() {
-        return String.format("KneighborRequest{source=%s,step=%s,maxDepth=%s" +
-                             
"countOnly=%s,limit=%s,withVertex=%s,withPath=%s}",
-                             this.source, this.step, this.maxDepth,
-                             this.countOnly, this.limit,
-                             this.withVertex, this.withPath);
+        return String.format("KneighborRequest{source=%s,steps=%s,maxDepth=%s" 
+
+                             
"countOnly=%s,limit=%s,withVertex=%s,withPath=%s,withEdge=%s}",
+                             this.source, this.steps, this.maxDepth,
+                             this.countOnly, this.limit, this.withVertex,
+                             this.withPath, this.withEdge);
     }
 
     public static class Builder {
 
         private KneighborRequest request;
-        private EdgeStep.Builder stepBuilder;
+        private VESteps.Builder stepBuilder;
 
         private Builder() {
             this.request = new KneighborRequest();
-            this.stepBuilder = EdgeStep.builder();
+            this.stepBuilder = VESteps.builder();
         }
 
         public Builder source(Object source) {
@@ -79,8 +82,8 @@ public class KneighborRequest {
             return this;
         }
 
-        public EdgeStep.Builder step() {
-            EdgeStep.Builder builder = EdgeStep.builder();
+        public VESteps.Builder steps() {
+            VESteps.Builder builder = VESteps.builder();
             this.stepBuilder = builder;
             return builder;
         }
@@ -107,6 +110,11 @@ public class KneighborRequest {
             return this;
         }
 
+        public Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public Builder withPath(boolean withPath) {
             this.request.withPath = withPath;
             return this;
@@ -114,8 +122,8 @@ public class KneighborRequest {
 
         public KneighborRequest build() {
             E.checkNotNull(this.request.source, "The source can't be null");
-            this.request.step = this.stepBuilder.build();
-            E.checkNotNull(this.request.step, "step");
+            this.request.steps = this.stepBuilder.build();
+            E.checkNotNull(this.request.steps, "steps");
             TraversersAPI.checkPositive(this.request.maxDepth, "max depth");
             TraversersAPI.checkLimit(this.request.limit);
             if (this.request.countOnly) {
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
index 966c4d6b..7e19b9b4 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/Kout.java
@@ -20,6 +20,7 @@ package org.apache.hugegraph.structure.traverser;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Path;
 import org.apache.hugegraph.structure.graph.Vertex;
 
@@ -35,6 +36,10 @@ public class Kout {
     private List<Path> paths;
     @JsonProperty
     private Set<Vertex> vertices;
+    @JsonProperty
+    private Set<Edge> edges;
+    @JsonProperty
+    private ApiMeasure measure;
 
     public int size() {
         return this.size;
@@ -51,4 +56,12 @@ public class Kout {
     public Set<Vertex> vertices() {
         return this.vertices;
     }
+
+    public Set<Edge> edges() {
+        return this.edges;
+    }
+
+    public ApiMeasure measure() {
+        return this.measure;
+    }
 }
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KoutRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KoutRequest.java
index b5c859d9..97795193 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KoutRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/KoutRequest.java
@@ -27,8 +27,8 @@ public class KoutRequest {
 
     @JsonProperty("source")
     private Object source;
-    @JsonProperty("step")
-    public EdgeStep step;
+    @JsonProperty("steps")
+    public VESteps steps;
     @JsonProperty("max_depth")
     public int maxDepth;
     @JsonProperty("nearest")
@@ -43,10 +43,14 @@ public class KoutRequest {
     public boolean withVertex;
     @JsonProperty("with_path")
     public boolean withPath;
+    @JsonProperty("with_edge")
+    public boolean withEdge;
+    @JsonProperty("traverse_mode")
+    public String traverseMode;
 
     private KoutRequest() {
         this.source = null;
-        this.step = null;
+        this.steps = null;
         this.maxDepth = Traverser.DEFAULT_MAX_DEPTH;
         this.nearest = true;
         this.countOnly = false;
@@ -54,6 +58,8 @@ public class KoutRequest {
         this.limit = Traverser.DEFAULT_PATHS_LIMIT;
         this.withVertex = false;
         this.withPath = false;
+        this.withEdge = false;
+        this.traverseMode = Traverser.TRAVERSE_MODE_BFS;
     }
 
     public static Builder builder() {
@@ -62,22 +68,24 @@ public class KoutRequest {
 
     @Override
     public String toString() {
-        return String.format("KoutRequest{source=%s,step=%s,maxDepth=%s" +
+        return String.format("KoutRequest{source=%s,steps=%s,maxDepth=%s" +
                              "nearest=%s,countOnly=%s,capacity=%s," +
-                             "limit=%s,withVertex=%s,withPath=%s}",
-                             this.source, this.step, this.maxDepth,
+                             "limit=%s,withVertex=%s,withPath=%s," +
+                             "withEdge=%s,traverseMode=%s}",
+                             this.source, this.steps, this.maxDepth,
                              this.nearest, this.countOnly, this.capacity,
-                             this.limit, this.withVertex, this.withPath);
+                             this.limit, this.withVertex, this.withPath,
+                             this.withEdge, this.traverseMode);
     }
 
     public static class Builder {
 
         private final KoutRequest request;
-        private EdgeStep.Builder stepBuilder;
+        private VESteps.Builder stepBuilder;
 
         private Builder() {
             this.request = new KoutRequest();
-            this.stepBuilder = EdgeStep.builder();
+            this.stepBuilder = VESteps.builder();
         }
 
         public Builder source(Object source) {
@@ -86,8 +94,8 @@ public class KoutRequest {
             return this;
         }
 
-        public EdgeStep.Builder step() {
-            EdgeStep.Builder builder = EdgeStep.builder();
+        public VESteps.Builder steps() {
+            VESteps.Builder builder = VESteps.builder();
             this.stepBuilder = builder;
             return builder;
         }
@@ -130,17 +138,22 @@ public class KoutRequest {
             return this;
         }
 
+        public Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public KoutRequest build() {
             E.checkNotNull(this.request.source, "The source can't be null");
-            this.request.step = this.stepBuilder.build();
-            E.checkNotNull(this.request.step, "step");
+            this.request.steps = this.stepBuilder.build();
+            E.checkNotNull(this.request.steps, "step");
             TraversersAPI.checkPositive(this.request.maxDepth, "max depth");
             TraversersAPI.checkCapacity(this.request.capacity);
             TraversersAPI.checkLimit(this.request.limit);
             if (this.request.countOnly) {
                 E.checkArgument(!this.request.withVertex &&
-                                !this.request.withPath,
-                                "Can't return vertex or path " +
+                                !this.request.withPath && 
!this.request.withEdge,
+                                "Can't return vertex or path or edge " +
                                 "when count only is true");
             }
             return this.request;
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/MultiNodeShortestPathRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/MultiNodeShortestPathRequest.java
index 4053d528..915d5b0d 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/MultiNodeShortestPathRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/MultiNodeShortestPathRequest.java
@@ -35,6 +35,8 @@ public class MultiNodeShortestPathRequest {
     public long capacity;
     @JsonProperty("with_vertex")
     public boolean withVertex;
+    @JsonProperty("with_edge")
+    public boolean withEdge;
 
     private MultiNodeShortestPathRequest() {
         this.vertices = null;
@@ -42,6 +44,7 @@ public class MultiNodeShortestPathRequest {
         this.maxDepth = Traverser.DEFAULT_MAX_DEPTH;
         this.capacity = Traverser.DEFAULT_CAPACITY;
         this.withVertex = false;
+        this.withEdge = false;
     }
 
     public static Builder builder() {
@@ -51,9 +54,9 @@ public class MultiNodeShortestPathRequest {
     @Override
     public String toString() {
         return String.format("MultiNodeShortestPathRequest{vertices=%s," +
-                             "step=%s,maxDepth=%s,capacity=%s,withVertex=%s}",
+                             
"step=%s,maxDepth=%s,capacity=%s,withVertex=%s,withEdge=%s}",
                              this.vertices, this.step, this.maxDepth,
-                             this.capacity, this.withVertex);
+                             this.capacity, this.withVertex, this.withEdge);
     }
 
     public static class Builder {
@@ -95,6 +98,11 @@ public class MultiNodeShortestPathRequest {
             return this;
         }
 
+        public Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public MultiNodeShortestPathRequest build() {
             this.request.vertices = this.verticesBuilder.build();
             E.checkArgument(this.request.vertices != null,
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsRequest.java
index 24b70f68..11e36104 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsRequest.java
@@ -41,6 +41,8 @@ public class PathsRequest {
     public int limit = Traverser.DEFAULT_LIMIT;
     @JsonProperty("with_vertex")
     public boolean withVertex = false;
+    @JsonProperty("with_edge")
+    public boolean withEdge = false;
 
     public static Builder builder() {
         return new Builder();
@@ -50,10 +52,10 @@ public class PathsRequest {
     public String toString() {
         return String.format("PathRequest{sources=%s,targets=%s,step=%s," +
                              "maxDepth=%s,nearest=%s,capacity=%s," +
-                             "limit=%s,withVertex=%s}",
+                             "limit=%s,withVertex=%s,withEdge=%s}",
                              this.sources, this.targets, this.step, this.depth,
                              this.nearest, this.capacity,
-                             this.limit, this.withVertex);
+                             this.limit, this.withVertex, this.withEdge);
     }
 
     public static class Builder {
@@ -112,6 +114,11 @@ public class PathsRequest {
             return this;
         }
 
+        public PathsRequest.Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public PathsRequest build() {
             this.request.sources = this.sourcesBuilder.build();
             E.checkArgument(this.request.sources != null,
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsWithVertices.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsWithVertices.java
index d1800f7a..5ff3a928 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsWithVertices.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/PathsWithVertices.java
@@ -20,6 +20,7 @@ package org.apache.hugegraph.structure.traverser;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Vertex;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -30,6 +31,10 @@ public class PathsWithVertices {
     private List<Paths> paths;
     @JsonProperty
     private Set<Vertex> vertices;
+    @JsonProperty
+    private Set<Edge> edges;
+    @JsonProperty
+    private ApiMeasure measure;
 
     public List<Paths> paths() {
         return this.paths;
@@ -39,6 +44,14 @@ public class PathsWithVertices {
         return this.vertices;
     }
 
+    public Set<Edge> edges() {
+        return this.edges;
+    }
+
+    public ApiMeasure measure() {
+        return this.measure;
+    }
+
     public static class Paths {
 
         @JsonProperty
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/TemplatePathsRequest.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/TemplatePathsRequest.java
index 77b50902..fad2d309 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/TemplatePathsRequest.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/TemplatePathsRequest.java
@@ -28,10 +28,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class TemplatePathsRequest {
 
-    @JsonProperty("sources")
-    private VerticesArgs sources;
-    @JsonProperty("targets")
-    private VerticesArgs targets;
     @JsonProperty("steps")
     public List<RepeatEdgeStep> steps;
     @JsonProperty("with_ring")
@@ -42,6 +38,12 @@ public class TemplatePathsRequest {
     public int limit;
     @JsonProperty("with_vertex")
     public boolean withVertex;
+    @JsonProperty("with_edge")
+    public boolean withEdge;
+    @JsonProperty("sources")
+    private VerticesArgs sources;
+    @JsonProperty("targets")
+    private VerticesArgs targets;
 
     private TemplatePathsRequest() {
         this.sources = null;
@@ -51,6 +53,7 @@ public class TemplatePathsRequest {
         this.capacity = Traverser.DEFAULT_CAPACITY;
         this.limit = Traverser.DEFAULT_PATHS_LIMIT;
         this.withVertex = false;
+        this.withEdge = false;
     }
 
     public static Builder builder() {
@@ -61,9 +64,10 @@ public class TemplatePathsRequest {
     public String toString() {
         return String.format("TemplatePathsRequest{sources=%s,targets=%s," +
                              "steps=%s,withRing=%s,capacity=%s,limit=%s," +
-                             "withVertex=%s}", this.sources, this.targets,
-                             this.steps, this.withRing, this.capacity,
-                             this.limit, this.withVertex);
+                             "withVertex=%s,withEdge=%s}",
+                             this.sources, this.targets, this.steps,
+                             this.withRing, this.capacity, this.limit,
+                             this.withVertex, this.withEdge);
     }
 
     public static class Builder {
@@ -116,6 +120,11 @@ public class TemplatePathsRequest {
             return this;
         }
 
+        public Builder withEdge(boolean withEdge) {
+            this.request.withEdge = withEdge;
+            return this;
+        }
+
         public TemplatePathsRequest build() {
             this.request.sources = this.sourcesBuilder.build();
             E.checkArgument(this.request.sources != null,
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/VEStep.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/VEStep.java
new file mode 100644
index 00000000..65c1baf2
--- /dev/null
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/VEStep.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hugegraph.structure.traverser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class VEStep {
+
+    @JsonProperty("label")
+    public String label;
+
+    @JsonProperty("properties")
+    public Map<String, Object> properties;
+
+    protected VEStep() {
+        this.properties = new HashMap<>();
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public String toString() {
+        return String.format("VEStepEntity{label=%s,properties=%s}",
+                             this.label, this.properties);
+    }
+
+    public static class Builder {
+
+        protected VEStep veStep;
+
+        private Builder() {
+            this.veStep = new VEStep();
+        }
+
+        public VEStep.Builder label(String label) {
+            this.veStep.label = label;
+            return this;
+        }
+
+        public VEStep.Builder properties(Map<String, Object> properties) {
+            this.veStep.properties = properties;
+            return this;
+        }
+
+        public VEStep.Builder properties(String key, Object value) {
+            this.veStep.properties.put(key, value);
+            return this;
+        }
+
+        public VEStep build() {
+            return this.veStep;
+        }
+
+    }
+}
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/VESteps.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/VESteps.java
new file mode 100644
index 00000000..bd13c5b7
--- /dev/null
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/VESteps.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hugegraph.structure.traverser;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.hugegraph.api.API;
+import org.apache.hugegraph.api.traverser.TraversersAPI;
+import org.apache.hugegraph.structure.constant.Direction;
+import org.apache.hugegraph.structure.constant.Traverser;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class VESteps {
+
+    @JsonProperty("direction")
+    public Direction direction;
+    @JsonAlias("degree")
+    @JsonProperty("max_degree")
+    public long maxDegree;
+    @JsonProperty("skip_degree")
+    public long skipDegree;
+    @JsonProperty("vertex_steps")
+    public List<VEStep> vSteps;
+    @JsonProperty("edge_steps")
+    public List<VEStep> eSteps;
+
+    protected VESteps() {
+        this.direction = Direction.BOTH;
+        this.maxDegree = Traverser.DEFAULT_MAX_DEGREE;
+        this.skipDegree = Traverser.DEFAULT_SKIP_DEGREE;
+        this.vSteps = new ArrayList<>();
+        this.eSteps = new ArrayList<>();
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public String toString() {
+        return String.format("Steps{direction=%s,maxDegree=%s," +
+                             "skipDegree=%s,vSteps=%s,eSteps=%s}",
+                             this.direction, this.maxDegree,
+                             this.skipDegree, this.vSteps, this.eSteps);
+    }
+
+    public static class Builder {
+
+        protected VESteps steps;
+
+        private Builder() {
+            this.steps = new VESteps();
+        }
+
+        public VESteps.Builder direction(Direction direction) {
+            this.steps.direction = direction;
+            return this;
+        }
+
+        public VESteps.Builder vSteps(List<VEStep> vSteps) {
+            this.steps.vSteps = vSteps;
+            return this;
+        }
+
+        public VESteps.Builder addVStep(String label, Map<String, Object> 
properties) {
+            VEStep vStep = VEStep.builder()
+                                 .label(label)
+                                 .properties(properties)
+                                 .build();
+            this.steps.vSteps.add(vStep);
+            return this;
+        }
+
+        public VESteps.Builder addVStep(String label) {
+            return this.addVStep(label, Collections.emptyMap());
+        }
+
+        public VESteps.Builder eSteps(List<VEStep> eSteps) {
+            this.steps.eSteps = eSteps;
+            return this;
+        }
+
+        public VESteps.Builder addEStep(String label, Map<String, Object> 
properties) {
+            VEStep eStep = VEStep.builder()
+                                 .label(label)
+                                 .properties(properties)
+                                 .build();
+            this.steps.eSteps.add(eStep);
+            return this;
+        }
+
+        public VESteps.Builder addEStep(String label) {
+            return this.addEStep(label, Collections.emptyMap());
+        }
+
+        public VESteps.Builder degree(long degree) {
+            TraversersAPI.checkDegree(degree);
+            this.steps.maxDegree = degree;
+            return this;
+        }
+
+        public VESteps.Builder skipDegree(long skipDegree) {
+            TraversersAPI.checkSkipDegree(skipDegree, this.steps.maxDegree,
+                                          API.NO_LIMIT);
+            this.steps.skipDegree = skipDegree;
+            return this;
+        }
+
+        public VESteps build() {
+            TraversersAPI.checkDegree(this.steps.maxDegree);
+            TraversersAPI.checkSkipDegree(this.steps.skipDegree,
+                                          this.steps.maxDegree, API.NO_LIMIT);
+            return this.steps;
+        }
+    }
+}
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPath.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPath.java
index d1686211..a6fd28b0 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPath.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPath.java
@@ -20,6 +20,7 @@ package org.apache.hugegraph.structure.traverser;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Vertex;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -30,6 +31,10 @@ public class WeightedPath {
     private Path path;
     @JsonProperty
     private Set<Vertex> vertices;
+    @JsonProperty
+    private Set<Edge> edges;
+    @JsonProperty
+    private ApiMeasure measure;
 
     public Path path() {
         return this.path;
@@ -39,6 +44,14 @@ public class WeightedPath {
         return this.vertices;
     }
 
+    public Set<Edge> edges() {
+        return this.edges;
+    }
+
+    public ApiMeasure measure() {
+        return this.measure;
+    }
+
     public static class Path {
 
         @JsonProperty
diff --git 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
index 1870de51..29ae2c36 100644
--- 
a/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
+++ 
b/hugegraph-client/src/main/java/org/apache/hugegraph/structure/traverser/WeightedPaths.java
@@ -20,6 +20,7 @@ package org.apache.hugegraph.structure.traverser;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.hugegraph.structure.graph.Edge;
 import org.apache.hugegraph.structure.graph.Vertex;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -30,6 +31,10 @@ public class WeightedPaths {
     private Map<Object, WeightedPath.Path> paths;
     @JsonProperty
     private Set<Vertex> vertices;
+    @JsonProperty
+    private Set<Edge> edges;
+    @JsonProperty
+    private ApiMeasure measure;
 
     public Map<Object, WeightedPath.Path> paths() {
         return this.paths;
@@ -38,4 +43,12 @@ public class WeightedPaths {
     public Set<Vertex> vertices() {
         return this.vertices;
     }
+
+    public Set<Edge> edges() {
+        return this.edges;
+    }
+
+    public ApiMeasure measure() {
+        return this.measure;
+    }
 }
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java
index 8ac29e14..43c3985c 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TokenApiTest.java
@@ -75,8 +75,7 @@ public class TokenApiTest extends AuthApiTest {
         Assert.assertThrows(ServerException.class, () -> {
             tokenAPI.verifyToken();
         }, e -> {
-            Assert.assertContains("Only HTTP Bearer authentication is 
supported",
-                                  e.getMessage());
+            Assert.assertContains("Only HTTP Bearer authentication is 
supported", e.getMessage());
         });
 
         String token = result.token();
@@ -91,15 +90,14 @@ public class TokenApiTest extends AuthApiTest {
         Assert.assertThrows(ServerException.class, () -> {
             tokenAPI.verifyToken();
         }, e -> {
-            Assert.assertContains("Invalid token", e.getMessage());
+            Assert.assertContains("Authentication failed", e.getMessage());
         });
 
         RestClient client2 = Whitebox.getInternalState(logoutAPI, "client");
         Assert.assertThrows(ServerException.class, () -> {
             logoutAPI.logout();
         }, e -> {
-            Assert.assertContains("Only HTTP Bearer authentication is 
supported",
-                                  e.getMessage());
+            Assert.assertContains("Only HTTP Bearer authentication is 
supported", e.getMessage());
         });
 
         client2.setAuthContext("Bearer " + token);
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CommonTraverserApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CommonTraverserApiTest.java
index 470a1112..766008db 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CommonTraverserApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CommonTraverserApiTest.java
@@ -99,11 +99,11 @@ public class CommonTraverserApiTest extends 
TraverserApiTest {
         CrosspointsRequest.Builder builder = CrosspointsRequest.builder();
         builder.sources().ids(lopId, rippleId);
         builder.pathPatterns().steps().direction(Direction.IN)
-                                      .labels("created").degree(-1);
-        builder.withPath(true).withVertex(true).capacity(-1).limit(-1);
+               .labels("created").degree(-1);
+        
builder.withPath(true).withVertex(true).withEdge(true).capacity(-1).limit(-1);
 
         CustomizedCrosspoints customizedCrosspoints =
-                              customizedCrosspointsAPI.post(builder.build());
+                customizedCrosspointsAPI.post(builder.build());
         List<Object> crosspoints = customizedCrosspoints.crosspoints();
         Assert.assertEquals(1, crosspoints.size());
         Assert.assertEquals(joshId, crosspoints.get(0));
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CountApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CountApiTest.java
index 33412c2c..50a72158 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CountApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CountApiTest.java
@@ -24,6 +24,7 @@ import org.apache.hugegraph.structure.graph.Vertex;
 import org.apache.hugegraph.structure.traverser.CountRequest;
 import org.apache.hugegraph.testutil.Assert;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -253,6 +254,7 @@ public class CountApiTest extends TraverserApiTest {
     }
 
     @Test
+    @Ignore
     public void testCountWithProperties() {
         CountRequest.Builder builder = CountRequest.builder();
         builder.source("A").containsTraversed(false);
@@ -427,29 +429,26 @@ public class CountApiTest extends TraverserApiTest {
         Assert.assertThrows(IllegalArgumentException.class, () -> {
             builder.dedupSize(-5);
         }, e -> {
-            Assert.assertContains("The dedup size must be >= 0 or == -1, " +
-                                  "but got: ", e.getMessage());
+            Assert.assertContains("The dedup size must be >= 0 or == -1, but 
got: ",
+                                  e.getMessage());
         });
 
         Assert.assertThrows(IllegalArgumentException.class, () -> {
             builder.steps().degree(0);
         }, e -> {
-            Assert.assertContains("Degree must be > 0 or == -1, but got: ",
-                                  e.getMessage());
+            Assert.assertContains("Degree must be > 0 or == -1, but got: ", 
e.getMessage());
         });
 
         Assert.assertThrows(IllegalArgumentException.class, () -> {
             builder.steps().skipDegree(-3);
         }, e -> {
-            Assert.assertContains("The skipped degree must be >= 0, but got",
-                                  e.getMessage());
+            Assert.assertContains("The skipped degree must be >= 0, but got", 
e.getMessage());
         });
 
         Assert.assertThrows(IllegalArgumentException.class, () -> {
             builder.steps().degree(5).skipDegree(3);
         }, e -> {
-            Assert.assertContains("The skipped degree must be >= max degree",
-                                  e.getMessage());
+            Assert.assertContains("The skipped degree must be >= max degree", 
e.getMessage());
         });
 
         CountRequest.Builder builder1 = CountRequest.builder();
@@ -459,8 +458,7 @@ public class CountApiTest extends TraverserApiTest {
             countAPI.post(builder1.build());
         }, e -> {
             Assert.assertContains("The properties filter condition can be " +
-                                  "set only if just set one edge label",
-                                  e.getMessage());
+                                  "set only if just set one edge label", 
e.getMessage());
         });
 
         CountRequest.Builder builder2 = CountRequest.builder();
@@ -471,8 +469,7 @@ public class CountApiTest extends TraverserApiTest {
             countAPI.post(builder2.build());
         }, e -> {
             Assert.assertContains("The properties filter condition can be " +
-                                  "set only if just set one edge label",
-                                  e.getMessage());
+                                  "set only if just set one edge label", 
e.getMessage());
         });
 
         CountRequest.Builder builder3 = CountRequest.builder();
@@ -488,8 +485,7 @@ public class CountApiTest extends TraverserApiTest {
                     .properties(ImmutableMap.of("weight", 3.3D));
             countAPI.post(builder4.build());
         }, e -> {
-            Assert.assertContains("does not match sort keys of edge label",
-                                  e.getMessage());
+            Assert.assertContains("does not match sort keys of edge label", 
e.getMessage());
         });
     }
 }
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CustomizedPathsApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CustomizedPathsApiTest.java
index f9435855..2a621d14 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CustomizedPathsApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/CustomizedPathsApiTest.java
@@ -73,7 +73,7 @@ public class CustomizedPathsApiTest extends TraverserApiTest {
                .weightBy("weight").degree(-1);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true).withEdge(true)
                .capacity(-1).limit(-1);
         CustomizedPathsRequest request = builder.build();
 
@@ -111,7 +111,7 @@ public class CustomizedPathsApiTest extends 
TraverserApiTest {
         builder.sources().ids(markoId, peterId);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true).withEdge(true)
                .capacity(-1).limit(-1);
         CustomizedPathsRequest request = builder.build();
 
@@ -152,7 +152,7 @@ public class CustomizedPathsApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", names);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true).withEdge(true)
                .capacity(-1).limit(-1);
         CustomizedPathsRequest request = builder.build();
 
@@ -195,7 +195,7 @@ public class CustomizedPathsApiTest extends 
TraverserApiTest {
                .weightBy("weight").degree(-1);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1).sample(1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true).withEdge(true)
                .capacity(-1).limit(-1);
         CustomizedPathsRequest request = builder.build();
 
@@ -236,7 +236,7 @@ public class CustomizedPathsApiTest extends 
TraverserApiTest {
                .weightBy("weight").degree(-1);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.DECR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.DECR).withVertex(true).withEdge(true)
                .capacity(-1).limit(-1);
         CustomizedPathsRequest request = builder.build();
 
@@ -277,7 +277,7 @@ public class CustomizedPathsApiTest extends 
TraverserApiTest {
                .weightBy("weight").degree(-1);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true).withEdge(true)
                .capacity(-1).limit(1);
         CustomizedPathsRequest request = builder.build();
 
@@ -315,7 +315,7 @@ public class CustomizedPathsApiTest extends 
TraverserApiTest {
                .weightBy("weight").degree(-1);
         builder.steps().direction(Direction.OUT).labels("created1")
                .weightBy("weight").degree(-1);
-        builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true)
+        
builder.sortBy(CustomizedPathsRequest.SortBy.INCR).withVertex(true).withEdge(true)
                .capacity(1).limit(-1);
         CustomizedPathsRequest request = builder.build();
 
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/FusiformSimilarityApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/FusiformSimilarityApiTest.java
index 8cee1ea0..82bda4f8 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/FusiformSimilarityApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/FusiformSimilarityApiTest.java
@@ -146,7 +146,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.75D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
 
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
@@ -176,7 +176,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(9)
                .alpha(0.8D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -194,7 +194,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p2");
         builder.label("read").direction(Direction.OUT).minNeighbors(9)
                .alpha(0.8D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -203,7 +203,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p3");
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.8D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(0, results.size());
@@ -212,7 +212,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p2");
         builder.label("read").direction(Direction.OUT).minNeighbors(7)
                .alpha(0.8D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -229,7 +229,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.75D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
 
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
@@ -246,7 +246,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(6)
                .alpha(0.83D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -283,7 +283,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.75D).minSimilars(2).groupProperty("city")
                .minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
 
         results = fusiformSimilarityAPI.post(request);
@@ -301,7 +301,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.75D).minSimilars(1).groupProperty("city")
                .minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
 
         results = fusiformSimilarityAPI.post(request);
@@ -327,7 +327,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.75D).top(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
 
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
@@ -344,7 +344,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(6)
                .alpha(0.8D).top(1);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -369,7 +369,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.7D).groupProperty("city").minGroups(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
 
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
@@ -386,7 +386,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(6)
                .alpha(0.8D).groupProperty("city").minGroups(3);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(0, results.size());
@@ -399,7 +399,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().label("person").property("name", "p1");
         builder.label("read").direction(Direction.OUT).minNeighbors(8)
                .alpha(0.8D).groupProperty("city").minGroups(2);
-        builder.capacity(10).limit(-1);
+        builder.capacity(10).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
 
         Assert.assertThrows(ServerException.class, () -> {
@@ -422,7 +422,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().ids(p1, p2, p3);
         builder.label("read").direction(Direction.OUT).minNeighbors(5)
                .alpha(0.8D).top(2);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(3, results.size());
@@ -431,7 +431,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().ids(p1, p2, p3);
         builder.label("read").direction(Direction.OUT).minNeighbors(5)
                .alpha(0.8D).top(2);
-        builder.capacity(-1).limit(2);
+        builder.capacity(-1).limit(2).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(2, results.size());
@@ -440,7 +440,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().ids(p1, p2, p3);
         builder.label("read").direction(Direction.OUT).minNeighbors(5)
                .alpha(0.8D).top(2);
-        builder.capacity(-1).limit(1);
+        builder.capacity(-1).limit(1).withVertex(true);
         request = builder.build();
         results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -461,7 +461,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().ids(id1, id2, id3);
         builder.label("write").direction(Direction.OUT).minNeighbors(3)
                .alpha(0.666D);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
         Assert.assertEquals(1, results.size());
@@ -484,7 +484,7 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         builder.sources().ids(p1, p2, p3);
         builder.direction(Direction.OUT).minNeighbors(8)
                .alpha(0.875D);
-        builder.capacity(-1).limit(-1);
+        builder.capacity(-1).limit(-1).withVertex(true);
         FusiformSimilarityRequest request = builder.build();
 
         FusiformSimilarity results = fusiformSimilarityAPI.post(request);
@@ -565,66 +565,6 @@ public class FusiformSimilarityApiTest extends 
TraverserApiTest {
         Assert.assertEquals(vertices, results.vertices());
     }
 
-    @Test
-    public void testFusiformSimilarityWithIntermediaryWithoutVertex() {
-        Vertex p1 = getVertex("person", "name", "p1");
-        Vertex p2 = getVertex("person", "name", "p2");
-        Vertex p3 = getVertex("person", "name", "p3");
-
-        Vertex b2 = getVertex("book", "name", "b2");
-        Vertex b3 = getVertex("book", "name", "b3");
-        Vertex b4 = getVertex("book", "name", "b4");
-        Vertex b5 = getVertex("book", "name", "b5");
-        Vertex b6 = getVertex("book", "name", "b6");
-        Vertex b7 = getVertex("book", "name", "b7");
-        Vertex b8 = getVertex("book", "name", "b8");
-        Vertex b9 = getVertex("book", "name", "b9");
-
-        Object p1Id = p1.id();
-        Object p2Id = p2.id();
-        Object p3Id = p3.id();
-
-        Object b2Id = b2.id();
-        Object b3Id = b3.id();
-        Object b4Id = b4.id();
-        Object b5Id = b5.id();
-        Object b6Id = b6.id();
-        Object b7Id = b7.id();
-        Object b8Id = b8.id();
-        Object b9Id = b9.id();
-
-        FusiformSimilarityRequest.Builder builder =
-                FusiformSimilarityRequest.builder();
-        builder.sources().label("person").property("name", "p1");
-        builder.label("read").direction(Direction.OUT).minNeighbors(8)
-               .alpha(0.75D).groupProperty("city").minGroups(2)
-               .withIntermediary(true).withVertex(false);
-        builder.capacity(-1).limit(-1);
-        FusiformSimilarityRequest request = builder.build();
-
-        FusiformSimilarity results = fusiformSimilarityAPI.post(request);
-        Assert.assertEquals(1, results.size());
-        Map.Entry<Object, Set<Similar>> entry = results.first();
-        Assert.assertEquals(p1Id, entry.getKey());
-
-        Assert.assertEquals(2, entry.getValue().size());
-        Set<Similar> similars = entry.getValue();
-        Set<Object> p2Inter = ImmutableSet.of(b2Id, b3Id, b4Id, b5Id,
-                                              b6Id, b7Id, b8Id, b9Id);
-        Set<Object> p3Inter = ImmutableSet.of(b3Id, b4Id, b5Id, b6Id,
-                                              b7Id, b8Id, b9Id);
-        for (Similar similar : similars) {
-            if (similar.id().equals(p2Id)) {
-                Assert.assertEquals(p2Inter, similar.intermediaries());
-            } else {
-                Assert.assertEquals(p3Id, similar.id());
-                Assert.assertEquals(p3Inter, similar.intermediaries());
-            }
-        }
-        Set<Vertex> vertices = ImmutableSet.of();
-        Assert.assertEquals(vertices, results.vertices());
-    }
-
     @Test
     public void testFusiformSimilarityWithoutIntermediaryWithVertex() {
         Vertex p1 = getVertex("person", "name", "p1");
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/JaccardSimilarityApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/JaccardSimilarityApiTest.java
index 27a9caa2..1b958081 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/JaccardSimilarityApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/JaccardSimilarityApiTest.java
@@ -17,12 +17,12 @@
 
 package org.apache.hugegraph.api.traverser;
 
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.hugegraph.structure.constant.Direction;
 import org.apache.hugegraph.structure.constant.T;
 import org.apache.hugegraph.structure.graph.Vertex;
+import org.apache.hugegraph.structure.traverser.JaccardSimilarity;
 import 
org.apache.hugegraph.structure.traverser.SingleSourceJaccardSimilarityRequest;
 import org.apache.hugegraph.testutil.Assert;
 import org.junit.BeforeClass;
@@ -85,11 +85,11 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
     @Test
     public void testJaccardSimilarityWithDirection() {
         double jaccard = jaccardSimilarityAPI.get(1, 2, Direction.OUT,
-                                                      null, -1);
+                                                  null, -1);
         Assert.assertEquals(0.5, jaccard, Double.MIN_VALUE);
 
         jaccard = jaccardSimilarityAPI.get(1, 2, Direction.IN,
-                                         null, -1);
+                                           null, -1);
         Assert.assertEquals(0.5, jaccard, Double.MIN_VALUE);
     }
 
@@ -104,19 +104,19 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
         Assert.assertEquals(0.3333333333333333D, jaccard, Double.MIN_VALUE);
 
         jaccard = jaccardSimilarityAPI.get(1, 2, Direction.IN,
-                                         "link", -1);
+                                           "link", -1);
         Assert.assertEquals(0.3333333333333333D, jaccard, Double.MIN_VALUE);
 
         jaccard = jaccardSimilarityAPI.get(1, 2, Direction.BOTH,
-                                         "relateTo", -1);
+                                           "relateTo", -1);
         Assert.assertEquals(1.0D, jaccard, Double.MIN_VALUE);
 
         jaccard = jaccardSimilarityAPI.get(1, 2, Direction.OUT,
-                                         "relateTo", -1);
+                                           "relateTo", -1);
         Assert.assertEquals(1.0D, jaccard, Double.MIN_VALUE);
 
         jaccard = jaccardSimilarityAPI.get(1, 2, Direction.IN,
-                                         "relateTo", -1);
+                                           "relateTo", -1);
         Assert.assertEquals(1.0D, jaccard, Double.MIN_VALUE);
     }
 
@@ -127,7 +127,7 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
         Assert.assertEquals(0.5D, jaccard, Double.MIN_VALUE);
 
         jaccard = jaccardSimilarityAPI.get(1, 2, Direction.OUT,
-                                         null, 1);
+                                           null, 1);
         Assert.assertEquals(1D, jaccard, Double.MIN_VALUE);
     }
 
@@ -138,7 +138,7 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
         builder.vertex(4);
         builder.step().direction(Direction.BOTH);
         SingleSourceJaccardSimilarityRequest request = builder.build();
-        Map<Object, Double> results = jaccardSimilarityAPI.post(request);
+        JaccardSimilarity results = jaccardSimilarityAPI.post(request);
 
         Assert.assertEquals(9, results.size());
         Set<Object> expected = ImmutableSet.of("1", "2", "3", "5", "6",
@@ -164,7 +164,7 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
         builder.step().direction(Direction.BOTH);
         builder.top(5);
         SingleSourceJaccardSimilarityRequest request = builder.build();
-        Map<Object, Double> results = jaccardSimilarityAPI.post(request);
+        JaccardSimilarity results = jaccardSimilarityAPI.post(request);
 
         Assert.assertEquals(5, results.size());
         Set<Object> expected = ImmutableSet.of("3", "5", "6", "7", "8");
@@ -184,7 +184,7 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
         builder.vertex(4);
         builder.step().direction(Direction.BOTH).labels("link");
         SingleSourceJaccardSimilarityRequest request = builder.build();
-        Map<Object, Double> results = jaccardSimilarityAPI.post(request);
+        JaccardSimilarity results = jaccardSimilarityAPI.post(request);
 
         Assert.assertEquals(7, results.size());
         Set<Object> expected = ImmutableSet.of("3", "7", "8", "9",
@@ -207,7 +207,7 @@ public class JaccardSimilarityApiTest extends 
TraverserApiTest {
         builder.vertex(4);
         builder.step().direction(Direction.OUT);
         SingleSourceJaccardSimilarityRequest request = builder.build();
-        Map<Object, Double> results = jaccardSimilarityAPI.post(request);
+        JaccardSimilarity results = jaccardSimilarityAPI.post(request);
 
         Assert.assertEquals(6, results.size());
         Set<Object> expected = ImmutableSet.of("1", "2", "3",
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KneighborApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KneighborApiTest.java
index 5d4338d8..94ffcb96 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KneighborApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KneighborApiTest.java
@@ -31,6 +31,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 public class KneighborApiTest extends TraverserApiTest {
@@ -53,7 +54,7 @@ public class KneighborApiTest extends TraverserApiTest {
         long softwareId = vertexLabelAPI.get("software").id();
 
         List<Object> vertices = kneighborAPI.get(markoId, Direction.OUT,
-                                                 null, 2, -1L, -1);
+                                                 null, 2, -1L, 100000);
         Assert.assertEquals(4, vertices.size());
         Assert.assertTrue(vertices.contains(softwareId + ":lop"));
         Assert.assertTrue(vertices.contains(softwareId + ":ripple"));
@@ -72,8 +73,10 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
+        builder.withVertex(true);
+        ;
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -84,8 +87,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -106,9 +110,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
-        builder.withPath(true);
+        builder.withPath(true).withVertex(true).withEdge(true);
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -128,9 +132,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
-        builder.withPath(true);
+        builder.withPath(true).withVertex(true).withEdge(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -162,10 +166,10 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.withPath(false);
-        builder.withVertex(true);
+        builder.withVertex(true).withEdge(true);
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -181,7 +185,7 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.withPath(false);
         builder.withVertex(true);
@@ -201,10 +205,10 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.withPath(true);
-        builder.withVertex(true);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -229,10 +233,10 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.withPath(true);
-        builder.withVertex(true);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -269,8 +273,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("created");
+        builder.steps().direction(Direction.BOTH).addEStep("created");
         builder.maxDepth(1);
+        builder.withVertex(true);
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -281,8 +286,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("created");
+        builder.steps().direction(Direction.BOTH).addEStep("created");
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -293,8 +299,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("knows");
+        builder.steps().direction(Direction.BOTH).addEStep("knows");
         builder.maxDepth(1);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -305,8 +312,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("knows");
+        builder.steps().direction(Direction.BOTH).addEStep("knows");
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -326,8 +334,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.OUT);
+        builder.steps().direction(Direction.OUT);
         builder.maxDepth(1);
+        builder.withVertex(true);
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -338,8 +347,9 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.OUT);
+        builder.steps().direction(Direction.OUT);
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -359,9 +369,11 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
+        builder.steps()
+               .direction(Direction.BOTH)
+               .addEStep("created", ImmutableMap.of("date", "P.gt(\"2014-01-01 
00:00:00\")"));
         builder.maxDepth(1);
+        builder.withVertex(true);
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -372,9 +384,11 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
+        builder.steps()
+               .direction(Direction.BOTH)
+               .addEStep("created", ImmutableMap.of("date", "P.gt(\"2014-01-01 
00:00:00\")"));
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -385,9 +399,11 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
+        builder.steps()
+               .direction(Direction.BOTH)
+               .addEStep("created", ImmutableMap.of("date", "P.gt(\"2014-01-01 
00:00:00\")"));
         builder.maxDepth(3);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -409,9 +425,10 @@ public class KneighborApiTest extends TraverserApiTest {
         // 1 depth with in&out edges
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.limit(3);
+        builder.withVertex(true);
         KneighborRequest request = builder.build();
 
         Kneighbor kneighborResult = kneighborAPI.post(request);
@@ -423,9 +440,10 @@ public class KneighborApiTest extends TraverserApiTest {
         // 2 depth with out edges
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.OUT);
+        builder.steps().direction(Direction.OUT);
         builder.maxDepth(2);
         builder.limit(5);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -437,9 +455,10 @@ public class KneighborApiTest extends TraverserApiTest {
         // 2 depth with in&out edges
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.limit(5);
+        builder.withVertex(true);
         request = builder.build();
 
         kneighborResult = kneighborAPI.post(request);
@@ -455,7 +474,7 @@ public class KneighborApiTest extends TraverserApiTest {
 
         KneighborRequest.Builder builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.countOnly(true);
         KneighborRequest request = builder.build();
@@ -469,7 +488,7 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.countOnly(true);
         request = builder.build();
@@ -483,25 +502,25 @@ public class KneighborApiTest extends TraverserApiTest {
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.countOnly(true);
         builder.withPath(true);
 
         KneighborRequest.Builder finalBuilder = builder;
-        Assert.assertThrows(IllegalArgumentException.class, ()-> {
+        Assert.assertThrows(IllegalArgumentException.class, () -> {
             finalBuilder.build();
         });
 
         builder = KneighborRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.countOnly(true);
         builder.withVertex(true);
 
         KneighborRequest.Builder finalBuilder1 = builder;
-        Assert.assertThrows(IllegalArgumentException.class, ()-> {
+        Assert.assertThrows(IllegalArgumentException.class, () -> {
             finalBuilder1.build();
         });
     }
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KoutApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KoutApiTest.java
index 87de1007..d07bc32f 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KoutApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/KoutApiTest.java
@@ -32,6 +32,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 public class KoutApiTest extends TraverserApiTest {
@@ -121,7 +122,7 @@ public class KoutApiTest extends TraverserApiTest {
 
         Assert.assertThrows(ServerException.class, () -> {
             koutAPI.get(markoId, Direction.BOTH, null,
-                    2, false, -1L, 1L, -1);
+                        2, false, -1L, 1L, -1);
         }, e -> {
             String expect = "Capacity can't be less than limit, " +
                             "but got capacity '1' and limit '-1'";
@@ -140,8 +141,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -152,8 +154,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -174,9 +177,10 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.nearest(false);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -187,9 +191,10 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.nearest(false);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -210,9 +215,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
-        builder.withPath(true);
+        builder.withPath(true).withVertex(true).withEdge(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -232,9 +237,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
-        builder.withPath(true);
+        builder.withPath(true).withVertex(true).withEdge(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -263,7 +268,7 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.withPath(false);
         builder.withVertex(true);
@@ -282,7 +287,7 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.withPath(false);
         builder.withVertex(true);
@@ -301,10 +306,11 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.withPath(true);
         builder.withVertex(true);
+        builder.withEdge(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -329,10 +335,11 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.withPath(true);
         builder.withVertex(true);
+        builder.withEdge(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -366,8 +373,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("created");
+        builder.steps().direction(Direction.BOTH).addEStep("created");
         builder.maxDepth(1);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -378,8 +386,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("created");
+        builder.steps().direction(Direction.BOTH).addEStep("created");
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -390,8 +399,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("knows");
+        builder.steps().direction(Direction.BOTH).addEStep("knows");
         builder.maxDepth(1);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -402,8 +412,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH).labels("knows");
+        builder.steps().direction(Direction.BOTH).addEStep("knows");
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -422,9 +433,11 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .labels("knows").labels("created");
+        builder.steps().direction(Direction.BOTH)
+               .addEStep("knows")
+               .addEStep("created");
         builder.maxDepth(1);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -432,12 +445,14 @@ public class KoutApiTest extends TraverserApiTest {
         Assert.assertEquals(3, koutResult.size());
         Set<Object> expected = ImmutableSet.of(vadasId, joshId, lopId);
         Assert.assertEquals(expected, koutResult.ids());
-        
+
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .labels("knows").labels("created");
+        builder.steps().direction(Direction.BOTH)
+               .addEStep("knows")
+               .addEStep("created");
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -457,8 +472,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.OUT);
+        builder.steps().direction(Direction.OUT);
         builder.maxDepth(1);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -469,8 +485,9 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.OUT);
+        builder.steps().direction(Direction.OUT);
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -490,9 +507,11 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
+        builder.steps()
+               .direction(Direction.BOTH)
+               .addEStep("created", ImmutableMap.of("date", "P.gt(\"2014-01-01 
00:00:00\")"));
         builder.maxDepth(1);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -503,9 +522,12 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
+        builder.steps()
+               .direction(Direction.BOTH)
+               .addEStep("created", ImmutableMap.of("date", "P.gt(\"2014-01-01 
00:00:00\")"));
+
         builder.maxDepth(2);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -516,9 +538,11 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH)
-               .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
+        builder.steps()
+               .direction(Direction.BOTH)
+               .addEStep("created", ImmutableMap.of("date", "P.gt(\"2014-01-01 
00:00:00\")"));
         builder.maxDepth(3);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -539,9 +563,10 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.limit(2);
+        builder.withVertex(true);
         KoutRequest request = builder.build();
 
         Kout koutResult = koutAPI.post(request);
@@ -552,9 +577,10 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.limit(1);
+        builder.withVertex(true);
         request = builder.build();
 
         koutResult = koutAPI.post(request);
@@ -570,7 +596,7 @@ public class KoutApiTest extends TraverserApiTest {
 
         KoutRequest.Builder builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.countOnly(true);
         KoutRequest request = builder.build();
@@ -584,7 +610,7 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(2);
         builder.countOnly(true);
         request = builder.build();
@@ -598,25 +624,25 @@ public class KoutApiTest extends TraverserApiTest {
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.countOnly(true);
         builder.withPath(true);
 
         KoutRequest.Builder finalBuilder = builder;
-        Assert.assertThrows(IllegalArgumentException.class, ()-> {
+        Assert.assertThrows(IllegalArgumentException.class, () -> {
             finalBuilder.build();
         });
 
         builder = KoutRequest.builder();
         builder.source(markoId);
-        builder.step().direction(Direction.BOTH);
+        builder.steps().direction(Direction.BOTH);
         builder.maxDepth(1);
         builder.countOnly(true);
         builder.withVertex(true);
 
         KoutRequest.Builder finalBuilder1 = builder;
-        Assert.assertThrows(IllegalArgumentException.class, ()-> {
+        Assert.assertThrows(IllegalArgumentException.class, () -> {
             finalBuilder1.build();
         });
     }
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/MultiNodeShortestPathApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/MultiNodeShortestPathApiTest.java
index c0eca409..20e68f6e 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/MultiNodeShortestPathApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/MultiNodeShortestPathApiTest.java
@@ -19,6 +19,7 @@ package org.apache.hugegraph.api.traverser;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.hugegraph.api.BaseApiTest;
@@ -45,6 +46,16 @@ public class MultiNodeShortestPathApiTest extends 
TraverserApiTest {
         BaseApiTest.initEdge();
     }
 
+    private static boolean contains(List<List<Object>> expected,
+                                    PathsWithVertices.Paths path) {
+        List<Object> objects = path.objects();
+        if (expected.contains(objects)) {
+            return true;
+        }
+        Collections.reverse(objects);
+        return expected.contains(objects);
+    }
+
     @Test
     public void testMultiNodeShortestPath() {
         Object markoId = getVertexId("person", "name", "marko");
@@ -59,6 +70,7 @@ public class MultiNodeShortestPathApiTest extends 
TraverserApiTest {
         builder.vertices().ids(markoId, rippleId, joshId,
                                lopId, vadasId, peterId);
         builder.step().direction(Direction.BOTH);
+        builder.withVertex(true).withEdge(true);
 
         MultiNodeShortestPathRequest request = builder.build();
         PathsWithVertices pathsWithVertices =
@@ -103,6 +115,7 @@ public class MultiNodeShortestPathApiTest extends 
TraverserApiTest {
                                lopId, vadasId, peterId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(2);
+        builder.withVertex(true).withEdge(true);
 
         MultiNodeShortestPathRequest request = builder.build();
         PathsWithVertices pathsWithVertices =
@@ -133,6 +146,7 @@ public class MultiNodeShortestPathApiTest extends 
TraverserApiTest {
                                lopId, vadasId, peterId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(1);
+        builder.withVertex(true).withEdge(true);
 
         request = builder.build();
         pathsWithVertices = multiNodeShortestPathAPI.post(request);
@@ -166,7 +180,7 @@ public class MultiNodeShortestPathApiTest extends 
TraverserApiTest {
         builder.vertices().ids(markoId, rippleId, joshId,
                                lopId, vadasId, peterId);
         builder.step().direction(Direction.BOTH);
-        builder.withVertex(true);
+        builder.withVertex(true).withEdge(true);
 
         MultiNodeShortestPathRequest request = builder.build();
         PathsWithVertices pathsWithVertices =
@@ -203,14 +217,4 @@ public class MultiNodeShortestPathApiTest extends 
TraverserApiTest {
             Assert.assertTrue(vertexIds.contains(vertex.id()));
         }
     }
-
-    private static boolean contains(List<List<Object>> expected,
-                                    PathsWithVertices.Paths path) {
-        List<Object> objects = path.objects();
-        if (expected.contains(objects)) {
-            return true;
-        }
-        Collections.reverse(objects);
-        return expected.contains(objects);
-    }
 }
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/PathsApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/PathsApiTest.java
index af6f09ef..fc9057e6 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/PathsApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/PathsApiTest.java
@@ -102,6 +102,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(rippleId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         PathsRequest request = builder.build();
 
         PathsWithVertices pathsWithVertices = pathsAPI.post(request);
@@ -129,7 +130,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(rippleId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(3);
-        builder.withVertex(true);
+        builder.withVertex(true).withEdge(true);
         PathsRequest request = builder.build();
 
         PathsWithVertices pathsWithVertices = pathsAPI.post(request);
@@ -165,6 +166,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(rippleId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         PathsRequest request = builder.build();
 
         PathsWithVertices pathsWithVertices = pathsAPI.post(request);
@@ -184,6 +186,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(rippleId);
         builder.step().direction(Direction.BOTH).labels("created");
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = pathsAPI.post(request);
         paths = pathsWithVertices.paths();
@@ -225,6 +228,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(jimId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(6);
+        builder.withVertex(true).withEdge(true);
         PathsRequest request = builder.build();
 
         PathsWithVertices pathsWithVertices = pathsAPI.post(request);
@@ -247,6 +251,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.step().direction(Direction.BOTH);
         builder.nearest(true);
         builder.maxDepth(6);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = pathsAPI.post(request);
         paths = pathsWithVertices.paths();
@@ -272,6 +277,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(rippleId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         PathsRequest request = builder.build();
 
         PathsWithVertices pathsWithVertices = pathsAPI.post(request);
@@ -292,6 +298,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.step().direction(Direction.BOTH)
                .properties("date", "P.gt(\"2014-01-01 00:00:00\")");
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = pathsAPI.post(request);
         paths = pathsWithVertices.paths();
@@ -316,6 +323,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.targets().ids(rippleId);
         builder.step().direction(Direction.BOTH);
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         PathsRequest request = builder.build();
 
         PathsWithVertices pathsWithVertices = pathsAPI.post(request);
@@ -336,6 +344,7 @@ public class PathsApiTest extends TraverserApiTest {
         builder.step().direction(Direction.BOTH);
         builder.limit(1);
         builder.maxDepth(3);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = pathsAPI.post(request);
         paths = pathsWithVertices.paths();
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathApiTest.java
index bbef9798..1dd9ae02 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/SingleSourceShortestPathApiTest.java
@@ -126,8 +126,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testSingleSourceShortestPath() {
         WeightedPaths weightedPaths = singleSourceShortestPathAPI.get(
-                                      "A", Direction.BOTH, null, "weight",
-                                      -1, 0, -1, -1, false);
+                "A", Direction.BOTH, null, "weight",
+                -1, 0, -1, -1, true, true);
         Assert.assertEquals(18, weightedPaths.paths().size());
 
         WeightedPath.Path path = weightedPaths.paths().get("B");
@@ -216,8 +216,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testSingleSourceShortestPathWithLabel() {
         WeightedPaths weightedPaths = singleSourceShortestPathAPI.get(
-                                      "A", Direction.BOTH, "link", "weight",
-                                      -1, 0, -1, -1, false);
+                "A", Direction.BOTH, "link", "weight",
+                -1, 0, -1, -1, true, true);
         Assert.assertEquals(12, weightedPaths.paths().size());
 
         WeightedPath.Path path = weightedPaths.paths().get("B");
@@ -276,8 +276,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
                             path.vertices());
 
         weightedPaths = singleSourceShortestPathAPI.get(
-                        "A", Direction.BOTH, "relateTo", "weight",
-                        -1, 0, -1, -1, false);
+                "A", Direction.BOTH, "relateTo", "weight",
+                -1, 0, -1, -1, true, true);
 
         Assert.assertEquals(7, weightedPaths.paths().size());
 
@@ -319,8 +319,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testSingleSourceShortestPathWithDirection() {
         WeightedPaths weightedPaths = singleSourceShortestPathAPI.get(
-                                      "A", Direction.OUT, null, "weight",
-                                      -1, 0, -1, -1, false);
+                "A", Direction.OUT, null, "weight",
+                -1, 0, -1, -1, true, true);
 
         Assert.assertEquals(17, weightedPaths.paths().size());
 
@@ -411,8 +411,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testSingleSourceShortestPathWithDegree() {
         WeightedPaths weightedPaths = singleSourceShortestPathAPI.get(
-                                      "A", Direction.OUT, null, "weight",
-                                      1, 0, -1, -1, false);
+                "A", Direction.OUT, null, "weight",
+                1, 0, -1, -1, true, true);
         Assert.assertEquals(4, weightedPaths.paths().size());
 
         WeightedPath.Path path = weightedPaths.paths().get("B");
@@ -439,8 +439,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testSingleSourceShortestPathWithLimit() {
         WeightedPaths weightedPaths = singleSourceShortestPathAPI.get(
-                                      "A", Direction.BOTH, null, "weight",
-                                      -1, 0, -1, 11, false);
+                "A", Direction.BOTH, null, "weight",
+                -1, 0, -1, 11, true, true);
         Assert.assertEquals(11, weightedPaths.paths().size());
 
         WeightedPath.Path path = weightedPaths.paths().get("B");
@@ -497,8 +497,8 @@ public class SingleSourceShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testSingleSourceShortestPathWithVertex() {
         WeightedPaths weightedPaths = singleSourceShortestPathAPI.get(
-                                      "A", Direction.BOTH, null, "weight",
-                                      -1, 0, -1, -1, true);
+                "A", Direction.BOTH, null, "weight",
+                -1, 0, -1, -1, true, true);
         Assert.assertEquals(18, weightedPaths.paths().size());
         Assert.assertEquals(19, weightedPaths.vertices().size());
     }
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TemplatePathsApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TemplatePathsApiTest.java
index f5739fe0..e9cd4caf 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TemplatePathsApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/TemplatePathsApiTest.java
@@ -108,6 +108,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         builder.steps().direction(Direction.OUT).maxTimes(3);
         builder.steps().direction(Direction.OUT).maxTimes(3);
         builder.steps().direction(Direction.IN).maxTimes(3);
+        builder.withVertex(true).withEdge(true);
         TemplatePathsRequest request = builder.build();
         PathsWithVertices pathsWithVertices = templatePathsAPI.post(request);
         List<PathsWithVertices.Paths> paths = pathsWithVertices.paths();
@@ -130,7 +131,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("relateTo").maxTimes(3);
-        builder.withVertex(true);
+        builder.withVertex(true).withEdge(true);
         TemplatePathsRequest request = builder.build();
         PathsWithVertices pathsWithVertices = templatePathsAPI.post(request);
         List<PathsWithVertices.Paths> paths = pathsWithVertices.paths();
@@ -155,6 +156,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         builder.steps().direction(Direction.OUT).labels("link").maxTimes(3);
         builder.steps().direction(Direction.OUT).labels("link").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("link").maxTimes(3);
+        builder.withVertex(true).withEdge(true);
         TemplatePathsRequest request = builder.build();
         PathsWithVertices pathsWithVertices = templatePathsAPI.post(request);
         List<PathsWithVertices.Paths> paths = pathsWithVertices.paths();
@@ -174,6 +176,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("relateTo").maxTimes(3);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = templatePathsAPI.post(request);
         paths = pathsWithVertices.paths();
@@ -194,6 +197,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("relateTo").maxTimes(3);
+        builder.withVertex(true).withEdge(true);
         TemplatePathsRequest request = builder.build();
         PathsWithVertices pathsWithVertices = templatePathsAPI.post(request);
         List<PathsWithVertices.Paths> paths = pathsWithVertices.paths();
@@ -212,6 +216,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("relateTo").maxTimes(3);
         builder.withRing(true);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = templatePathsAPI.post(request);
         paths = pathsWithVertices.paths();
@@ -236,6 +241,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         
builder.steps().direction(Direction.OUT).labels("relateTo").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("relateTo").maxTimes(3);
         builder.withRing(true);
+        builder.withVertex(true).withEdge(true);
         TemplatePathsRequest request = builder.build();
         PathsWithVertices pathsWithVertices = templatePathsAPI.post(request);
         List<PathsWithVertices.Paths> paths = pathsWithVertices.paths();
@@ -260,6 +266,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         builder.steps().direction(Direction.IN).labels("relateTo")
                .properties("weight", "P.gt(0.4)").maxTimes(3);
         builder.withRing(true);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = templatePathsAPI.post(request);
         paths = pathsWithVertices.paths();
@@ -280,6 +287,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         builder.steps().direction(Direction.OUT).labels("link").maxTimes(3);
         builder.steps().direction(Direction.OUT).labels("link").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("link").maxTimes(3);
+        builder.withVertex(true).withEdge(true);
         TemplatePathsRequest request = builder.build();
         PathsWithVertices pathsWithVertices = templatePathsAPI.post(request);
         List<PathsWithVertices.Paths> paths = pathsWithVertices.paths();
@@ -300,6 +308,7 @@ public class TemplatePathsApiTest extends TraverserApiTest {
         builder.steps().direction(Direction.OUT).labels("link").maxTimes(3);
         builder.steps().direction(Direction.IN).labels("link").maxTimes(3);
         builder.limit(2);
+        builder.withVertex(true).withEdge(true);
         request = builder.build();
         pathsWithVertices = templatePathsAPI.post(request);
         paths = pathsWithVertices.paths();
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/WeightedShortestPathApiTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/WeightedShortestPathApiTest.java
index ffa4b161..425c49e2 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/WeightedShortestPathApiTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/api/traverser/WeightedShortestPathApiTest.java
@@ -127,9 +127,10 @@ public class WeightedShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testWeightedShortestPath() {
         WeightedPath weightedPath = weightedShortestPathAPI.get(
-                                     "A", "Z", Direction.BOTH, null,
-                                     "weight", -1, 0, -1, false);
-        Assert.assertTrue(weightedPath.vertices().isEmpty());
+                "A", "Z", Direction.BOTH, null,
+                "weight", -1, 0, -1, true, true);
+        Assert.assertFalse(weightedPath.vertices().isEmpty());
+        Assert.assertFalse(weightedPath.edges().isEmpty());
         Assert.assertEquals(0.5D, weightedPath.path().weight(),
                             Double.MIN_VALUE);
         Assert.assertEquals(ImmutableList.of("A", "H", "I", "J", "Z"),
@@ -139,18 +140,20 @@ public class WeightedShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testWeightedShortestPathWithLabel() {
         WeightedPath weightedPath = weightedShortestPathAPI.get(
-                                    "A", "Z", Direction.BOTH, "link",
-                                    "weight", -1, 0, -1, false);
-        Assert.assertTrue(weightedPath.vertices().isEmpty());
+                "A", "Z", Direction.BOTH, "link",
+                "weight", -1, 0, -1, true, true);
+        Assert.assertFalse(weightedPath.vertices().isEmpty());
+        Assert.assertFalse(weightedPath.edges().isEmpty());
         Assert.assertEquals(0.5D, weightedPath.path().weight(),
                             Double.MIN_VALUE);
         Assert.assertEquals(ImmutableList.of("A", "H", "I", "J", "Z"),
                             weightedPath.path().vertices());
 
         weightedPath = weightedShortestPathAPI.get(
-                       "A", "Z", Direction.BOTH, "relateTo",
-                       "weight", -1, 0, -1, false);
-        Assert.assertTrue(weightedPath.vertices().isEmpty());
+                "A", "Z", Direction.BOTH, "relateTo",
+                "weight", -1, 0, -1, true, true);
+        Assert.assertFalse(weightedPath.vertices().isEmpty());
+        Assert.assertFalse(weightedPath.edges().isEmpty());
         Assert.assertEquals(6.3999999999999995D, weightedPath.path().weight(),
                             Double.MIN_VALUE);
         Assert.assertEquals(ImmutableList.of("A", "Q", "R", "Z"),
@@ -160,9 +163,10 @@ public class WeightedShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testWeightedShortestPathWithDirection() {
         WeightedPath weightedPath = weightedShortestPathAPI.get(
-                                    "A", "Z", Direction.OUT, null,
-                                    "weight", -1, 0, -1, false);
-        Assert.assertTrue(weightedPath.vertices().isEmpty());
+                "A", "Z", Direction.OUT, null,
+                "weight", -1, 0, -1, true, true);
+        Assert.assertFalse(weightedPath.vertices().isEmpty());
+        Assert.assertFalse(weightedPath.edges().isEmpty());
         Assert.assertEquals(2.0D, weightedPath.path().weight(),
                             Double.MIN_VALUE);
         Assert.assertEquals(ImmutableList.of("A", "B", "C", "D", "Z"),
@@ -172,9 +176,10 @@ public class WeightedShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testWeightedShortestPathWithDegree() {
         WeightedPath weightedPath = weightedShortestPathAPI.get(
-                                    "A", "Z", Direction.OUT, null,
-                                    "weight", 1L, 0L, -1L, false);
-        Assert.assertTrue(weightedPath.vertices().isEmpty());
+                "A", "Z", Direction.OUT, null,
+                "weight", 1L, 0L, -1L, true, true);
+        Assert.assertFalse(weightedPath.vertices().isEmpty());
+        Assert.assertFalse(weightedPath.edges().isEmpty());
         Assert.assertEquals(2.0D, weightedPath.path().weight(),
                             Double.MIN_VALUE);
         Assert.assertEquals(ImmutableList.of("A", "B", "C", "D", "Z"),
@@ -184,9 +189,10 @@ public class WeightedShortestPathApiTest extends 
TraverserApiTest {
     @Test
     public void testWeightedShortestPathWithVertex() {
         WeightedPath weightedPath = weightedShortestPathAPI.get(
-                                    "A", "Z", Direction.BOTH, null, "weight",
-                                    -1, 0, -1, true);
+                "A", "Z", Direction.BOTH, null, "weight",
+                -1, 0, -1, true, true);
         Assert.assertEquals(5, weightedPath.vertices().size());
+        Assert.assertFalse(weightedPath.edges().isEmpty());
         List<Object> expected = ImmutableList.of("A", "H", "I", "J", "Z");
         for (Vertex vertex : weightedPath.vertices()) {
             Assert.assertTrue(expected.contains(vertex.id()));
diff --git 
a/hugegraph-client/src/test/java/org/apache/hugegraph/functional/MetricsManagerTest.java
 
b/hugegraph-client/src/test/java/org/apache/hugegraph/functional/MetricsManagerTest.java
index 72d7732c..9b435178 100644
--- 
a/hugegraph-client/src/test/java/org/apache/hugegraph/functional/MetricsManagerTest.java
+++ 
b/hugegraph-client/src/test/java/org/apache/hugegraph/functional/MetricsManagerTest.java
@@ -50,5 +50,17 @@ public class MetricsManagerTest extends BaseFuncTest {
         Assert.assertEquals(ImmutableSet.of("gauges", "counters", "histograms",
                                             "meters", "timers"),
                             results.keySet());
+        // prom format
+        String resultsProm = metrics().allWithPromFormat();
+        Assert.assertContains("# HELP hugegraph_info", resultsProm);
+    }
+
+    @Test
+    public void testStatisticsMetrics() {
+        Map<String, Map<String, Object>> results = metrics().statistics();
+        Assert.assertNotNull(results);
+        // prom format
+        String resultsProm = metrics().statisticsWithPromFormat();
+        Assert.assertContains("# HELP hugegraph_info", resultsProm);
     }
 }
diff --git a/hugegraph-hubble/hubble-dist/assembly/travis/download-hugegraph.sh 
b/hugegraph-hubble/hubble-dist/assembly/travis/download-hugegraph.sh
index 1a08376d..ac4cf585 100755
--- a/hugegraph-hubble/hubble-dist/assembly/travis/download-hugegraph.sh
+++ b/hugegraph-hubble/hubble-dist/assembly/travis/download-hugegraph.sh
@@ -32,7 +32,8 @@ git checkout "${COMMIT_ID}"
 mvn package -DskipTests -Dmaven.javadoc.skip=true -ntp
 
 # TODO: lack incubator after apache package release (update it later)
+cd hugegraph-server
 TAR=$(echo apache-hugegraph-*.tar.gz)
-cp apache-hugegraph-*.tar.gz ../
-cd ../
+cp apache-hugegraph-*.tar.gz ../../
+cd ../../
 rm -rf "${GIT_DIR}"
diff --git a/hugegraph-loader/assembly/travis/install-hugegraph-from-source.sh 
b/hugegraph-loader/assembly/travis/install-hugegraph-from-source.sh
index 202f4569..61ea1c04 100755
--- a/hugegraph-loader/assembly/travis/install-hugegraph-from-source.sh
+++ b/hugegraph-loader/assembly/travis/install-hugegraph-from-source.sh
@@ -29,8 +29,9 @@ cd hugegraph
 git checkout "${COMMIT_ID}"
 mvn package -DskipTests -Dmaven.javadoc.skip=true -ntp
 # TODO: lack incubator after apache package release (update it later)
-mv apache-hugegraph-*.tar.gz ../
-cd ../
+cd hugegraph-server
+mv apache-hugegraph-*.tar.gz ../../
+cd ../../
 rm -rf hugegraph
 tar zxf apache-hugegraph-*.tar.gz
 
diff --git a/hugegraph-tools/assembly/travis/install-hugegraph-from-source.sh 
b/hugegraph-tools/assembly/travis/install-hugegraph-from-source.sh
index 45de8924..0987dd73 100755
--- a/hugegraph-tools/assembly/travis/install-hugegraph-from-source.sh
+++ b/hugegraph-tools/assembly/travis/install-hugegraph-from-source.sh
@@ -31,9 +31,10 @@ git checkout "${COMMIT_ID}"
 mvn package -DskipTests -Dmaven.javadoc.skip=true -ntp
 
 # TODO: lack incubator after apache package release (update it later)
+cd hugegraph-server
 TAR=$(echo apache-hugegraph-*.tar.gz)
-tar zxf "${TAR}" -C ../
-cd ../
+tar zxf "${TAR}" -C ../../
+cd ../../
 rm -rf "${GIT_DIR}"
 # TODO: lack incubator after apache package release (update it later)
 HTTP_SERVER_DIR=$(echo apache-hugegraph-*.*)


Reply via email to