You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@s2graph.apache.org by st...@apache.org on 2017/11/19 02:28:45 UTC

[02/23] incubator-s2graph git commit: passed s2test.

passed s2test.


Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/f7170235
Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/f7170235
Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/f7170235

Branch: refs/heads/master
Commit: f71702357255ba191ee3670978be79cfe8c5b7b0
Parents: fac47d1
Author: DO YUNG YOON <st...@apache.org>
Authored: Fri Nov 3 12:13:03 2017 +0900
Committer: DO YUNG YOON <st...@apache.org>
Committed: Fri Nov 3 12:13:03 2017 +0900

----------------------------------------------------------------------
 .../org/apache/s2graph/core/PostProcess.scala   |  4 +-
 .../org/apache/s2graph/core/QueryParam.scala    |  6 +--
 .../org/apache/s2graph/core/QueryResult.scala   |  4 +-
 .../scala/org/apache/s2graph/core/S2Edge.scala  | 18 +++----
 .../scala/org/apache/s2graph/core/S2Graph.scala | 56 ++++++++++----------
 .../org/apache/s2graph/core/S2Vertex.scala      |  6 +--
 .../org/apache/s2graph/core/S2VertexLike.scala  | 11 +++-
 .../apache/s2graph/core/S2VertexProperty.scala  |  2 +-
 .../s2graph/core/index/IndexProvider.scala      | 12 ++---
 .../s2graph/core/rest/RequestParser.scala       |  4 +-
 .../apache/s2graph/core/storage/Storage.scala   | 10 ++--
 .../apache/s2graph/core/storage/StorageIO.scala |  4 +-
 .../s2graph/core/storage/StorageReadable.scala  |  8 +--
 .../s2graph/core/storage/StorageSerDe.scala     |  6 +--
 .../hbase/AsynchbaseStorageReadable.scala       |  4 +-
 .../storage/hbase/AsynchbaseStorageSerDe.scala  |  6 +--
 .../vertex/tall/VertexDeserializable.scala      |  6 +--
 .../serde/vertex/tall/VertexSerializable.scala  |  4 +-
 .../vertex/wide/VertexDeserializable.scala      |  6 +--
 .../serde/vertex/wide/VertexSerializable.scala  |  4 +-
 .../s2graph/core/storage/StorageIOTest.scala    |  8 +--
 .../core/tinkerpop/S2GraphProvider.scala        |  1 +
 .../rest/play/controllers/EdgeController.scala  |  6 +--
 23 files changed, 103 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala b/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
index b22eb65..3017749 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/PostProcess.scala
@@ -141,7 +141,7 @@ object PostProcess {
     }
   }
 
-  def s2VertexToJson(s2Vertex: S2Vertex): Option[JsValue] = {
+  def s2VertexToJson(s2Vertex: S2VertexLike): Option[JsValue] = {
     val props = for {
       (k, v) <- s2Vertex.properties
       jsVal <- anyValToJsValue(v)
@@ -160,7 +160,7 @@ object PostProcess {
     }
   }
 
-  def verticesToJson(s2Vertices: Seq[S2Vertex]): JsValue =
+  def verticesToJson(s2Vertices: Seq[S2VertexLike]): JsValue =
     Json.toJson(s2Vertices.flatMap(s2VertexToJson(_)))
 
   def withOptionalFields(queryOption: QueryOption,

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala b/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala
index 1100f6c..2e8d1f4 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala
@@ -40,7 +40,7 @@ object Query {
   def apply(query: Query): Query = {
     Query(query.vertices, query.steps, query.queryOption, query.jsonQuery)
   }
-  def toQuery(srcVertices: Seq[S2Vertex], queryParams: Seq[QueryParam]) = Query(srcVertices, Vector(Step(queryParams)))
+  def toQuery(srcVertices: Seq[S2VertexLike], queryParams: Seq[QueryParam]) = Query(srcVertices, Vector(Step(queryParams)))
 
 }
 
@@ -97,7 +97,7 @@ case class QueryOption(removeCycle: Boolean = false,
 
 }
 
-case class Query(vertices: Seq[S2Vertex] = Seq.empty[S2Vertex],
+case class Query(vertices: Seq[S2VertexLike] = Nil,
                  steps: IndexedSeq[Step] = Vector.empty[Step],
                  queryOption: QueryOption = QueryOption(),
                  jsonQuery: JsValue = JsNull) {
@@ -219,7 +219,7 @@ case class Step(queryParams: Seq[QueryParam],
   }
 }
 
-case class VertexParam(vertices: Seq[S2Vertex]) {
+case class VertexParam(vertices: Seq[S2VertexLike]) {
   var filters: Option[Map[Byte, InnerValLike]] = None
 
   def has(what: Option[Map[Byte, InnerValLike]]): VertexParam = {

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/QueryResult.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/QueryResult.scala b/s2core/src/main/scala/org/apache/s2graph/core/QueryResult.scala
index 3916f39..7506b40 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/QueryResult.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/QueryResult.scala
@@ -27,7 +27,7 @@ import scala.collection.mutable.{ArrayBuffer, ListBuffer}
 import scala.collection.{Seq, mutable}
 
 object QueryResult {
-  def fromVertices(graph: S2Graph, vertices: Seq[S2Vertex], queryParams: Seq[QueryParam]): StepResult = {
+  def fromVertices(graph: S2Graph, vertices: Seq[S2VertexLike], queryParams: Seq[QueryParam]): StepResult = {
     val edgeWithScores = vertices.flatMap { vertex =>
       queryParams.map { queryParam =>
         val label = queryParam.label
@@ -69,7 +69,7 @@ object QueryResult {
 
 case class QueryRequest(query: Query,
                         stepIdx: Int,
-                        vertex: S2Vertex,
+                        vertex: S2VertexLike,
                         queryParam: QueryParam,
                         prevStepScore: Double = 1.0,
                         labelWeight: Double = 1.0) {

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/S2Edge.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2Edge.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2Edge.scala
index 51af831..641db74 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2Edge.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Edge.scala
@@ -64,8 +64,8 @@ object SnapshotEdge {
 }
 
 case class SnapshotEdge(graph: S2Graph,
-                        srcVertex: S2Vertex,
-                        tgtVertex: S2Vertex,
+                        srcVertex: S2VertexLike,
+                        tgtVertex: S2VertexLike,
                         label: Label,
                         dir: Int,
                         op: Byte,
@@ -168,8 +168,8 @@ object IndexEdge {
 }
 
 case class IndexEdge(graph: S2Graph,
-                     srcVertex: S2Vertex,
-                     tgtVertex: S2Vertex,
+                     srcVertex: S2VertexLike,
+                     tgtVertex: S2VertexLike,
                      label: Label,
                      dir: Int,
                      op: Byte,
@@ -302,8 +302,8 @@ case class IndexEdge(graph: S2Graph,
 }
 
 case class S2Edge(innerGraph: S2Graph,
-                srcVertex: S2Vertex,
-                var tgtVertex: S2Vertex,
+                srcVertex: S2VertexLike,
+                var tgtVertex: S2VertexLike,
                 innerLabel: Label,
                 dir: Int,
                 var op: Byte = GraphUtil.defaultOpByte,
@@ -429,7 +429,7 @@ case class S2Edge(innerGraph: S2Graph,
 
   //    def relatedEdges = List(this)
 
-  private def getServiceColumn(vertex: S2Vertex, defaultServiceColumn: ServiceColumn) =
+  private def getServiceColumn(vertex: S2VertexLike, defaultServiceColumn: ServiceColumn) =
       if (vertex.id.column == ServiceColumn.Default) defaultServiceColumn else vertex.id.column
 
   def srcForVertex = {
@@ -566,8 +566,8 @@ case class S2Edge(innerGraph: S2Graph,
 
   def checkProperty(key: String): Boolean = propsWithTs.containsKey(key)
 
-  def copyEdge(srcVertex: S2Vertex = srcVertex,
-               tgtVertex: S2Vertex = tgtVertex,
+  def copyEdge(srcVertex: S2VertexLike = srcVertex,
+               tgtVertex: S2VertexLike = tgtVertex,
                innerLabel: Label = innerLabel,
                dir: Int = dir,
                op: Byte = op,

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
index 34db9e4..90190cf 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala
@@ -190,7 +190,7 @@ object S2Graph {
     }
   }
 
-  def alreadyVisitedVertices(edgeWithScoreLs: Seq[EdgeWithScore]): Map[(LabelWithDirection, S2Vertex), Boolean] = {
+  def alreadyVisitedVertices(edgeWithScoreLs: Seq[EdgeWithScore]): Map[(LabelWithDirection, S2VertexLike), Boolean] = {
     val vertices = for {
       edgeWithScore <- edgeWithScoreLs
       edge = edgeWithScore.edge
@@ -272,7 +272,7 @@ object S2Graph {
                   queryRequests: Seq[QueryRequest],
                   queryResultLsFuture: Future[Seq[StepResult]],
                   queryParams: Seq[QueryParam],
-                  alreadyVisited: Map[(LabelWithDirection, S2Vertex), Boolean] = Map.empty,
+                  alreadyVisited: Map[(LabelWithDirection, S2VertexLike), Boolean] = Map.empty,
                   buildLastStepInnerResult: Boolean = true,
                   parentEdges: Map[VertexId, Seq[EdgeWithScore]])
                  (implicit ec: scala.concurrent.ExecutionContext): Future[StepResult] = {
@@ -1059,10 +1059,10 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
       val step = q.steps(stepIdx)
 
      val alreadyVisited =
-        if (stepIdx == 0) Map.empty[(LabelWithDirection, S2Vertex), Boolean]
+        if (stepIdx == 0) Map.empty[(LabelWithDirection, S2VertexLike), Boolean]
         else alreadyVisitedVertices(stepInnerResult.edgeWithScores)
 
-      val initial = (Map.empty[S2Vertex, Double], Map.empty[S2Vertex, ArrayBuffer[EdgeWithScore]])
+      val initial = (Map.empty[S2VertexLike, Double], Map.empty[S2VertexLike, ArrayBuffer[EdgeWithScore]])
       val (sums, grouped) = edgeWithScoreLs.foldLeft(initial) { case ((sum, group), edgeWithScore) =>
         val key = edgeWithScore.edge.tgtVertex
         val newScore = sum.getOrElse(key, 0.0) + edgeWithScore.score
@@ -1144,7 +1144,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
     } get
   }
 
-  def getVertices(vertices: Seq[S2Vertex]): Future[Seq[S2Vertex]] = {
+  def getVertices(vertices: Seq[S2VertexLike]): Future[Seq[S2VertexLike]] = {
     val verticesWithIdx = vertices.zipWithIndex
     val futures = verticesWithIdx.groupBy { case (v, idx) => v.service }.map { case (service, vertexGroup) =>
       getStorage(service).fetchVertices(vertices).map(_.zip(vertexGroup.map(_._2)))
@@ -1156,7 +1156,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
   }
 
   /** mutate */
-  def deleteAllAdjacentEdges(srcVertices: Seq[S2Vertex],
+  def deleteAllAdjacentEdges(srcVertices: Seq[S2VertexLike],
                              labels: Seq[Label],
                              dir: Int,
                              ts: Long): Future[Boolean] = {
@@ -1320,11 +1320,11 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
                      withWait: Boolean = false): Future[Seq[MutateResponse]] = {
 
     val edgeBuffer = ArrayBuffer[(S2Edge, Int)]()
-    val vertexBuffer = ArrayBuffer[(S2Vertex, Int)]()
+    val vertexBuffer = ArrayBuffer[(S2VertexLike, Int)]()
 
     elements.zipWithIndex.foreach {
       case (e: S2Edge, idx: Int) => edgeBuffer.append((e, idx))
-      case (v: S2Vertex, idx: Int) => vertexBuffer.append((v, idx))
+      case (v: S2VertexLike, idx: Int) => vertexBuffer.append((v, idx))
       case any@_ => logger.error(s"Unknown type: ${any}")
     }
 
@@ -1467,8 +1467,8 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
     }
   }
 
-  def mutateVertices(vertices: Seq[S2Vertex], withWait: Boolean = false): Future[Seq[MutateResponse]] = {
-    def mutateVertex(storage: Storage)(vertex: S2Vertex, withWait: Boolean): Future[MutateResponse] = {
+  def mutateVertices(vertices: Seq[S2VertexLike], withWait: Boolean = false): Future[Seq[MutateResponse]] = {
+    def mutateVertex(storage: Storage)(vertex: S2VertexLike, withWait: Boolean): Future[MutateResponse] = {
       if (vertex.op == GraphUtil.operations("delete")) {
         storage.writeToStorage(vertex.hbaseZkAddr,
           storage.vertexSerializer(vertex).toKeyValues.map(_.copy(operation = SKeyValue.Delete)), withWait)
@@ -1480,7 +1480,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
       }
     }
 
-    def mutateVertices(storage: Storage)(vertices: Seq[S2Vertex],
+    def mutateVertices(storage: Storage)(vertices: Seq[S2VertexLike],
                        withWait: Boolean = false): Future[Seq[MutateResponse]] = {
       val futures = vertices.map { vertex => mutateVertex(storage)(vertex, withWait) }
       Future.sequence(futures)
@@ -1567,7 +1567,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
   } get
 
 
-  def toVertex(s: String): Option[S2Vertex] = {
+  def toVertex(s: String): Option[S2VertexLike] = {
     toVertex(GraphUtil.split(s))
   }
 
@@ -1588,7 +1588,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
       throw e
   } get
 
-  def toVertex(parts: Array[String]): Option[S2Vertex] = Try {
+  def toVertex(parts: Array[String]): Option[S2VertexLike] = Try {
     val (ts, operation, logType, srcId, serviceName, colName) = (parts(0), parts(1), parts(2), parts(3), parts(4), parts(5))
     val props = if (parts.length >= 7) fromJsonToProperties(Json.parse(parts(6)).asOpt[JsObject].getOrElse(Json.obj())) else Map.empty[String, Any]
     val vertex = toVertex(serviceName, colName, srcId, props, ts.toLong, operation)
@@ -1630,7 +1630,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
                id: Any,
                props: Map[String, Any] = Map.empty,
                ts: Long = System.currentTimeMillis(),
-               operation: String = "insert"): S2Vertex = {
+               operation: String = "insert"): S2VertexLike = {
 
     val service = Service.findByName(serviceName).getOrElse(throw new java.lang.IllegalArgumentException(s"$serviceName is not found."))
     val column = ServiceColumn.find(service.id.get, columnName).getOrElse(throw new java.lang.IllegalArgumentException(s"$columnName is not found."))
@@ -1702,8 +1702,8 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
    * @param tsInnerValOpt
    * @return
    */
-  def newEdge(srcVertex: S2Vertex,
-              tgtVertex: S2Vertex,
+  def newEdge(srcVertex: S2VertexLike,
+              tgtVertex: S2VertexLike,
               innerLabel: Label,
               dir: Int,
               op: Byte = GraphUtil.defaultOpByte,
@@ -1751,8 +1751,8 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
    * @param tsInnerValOpt
    * @return
    */
-  private[core] def newSnapshotEdge(srcVertex: S2Vertex,
-                                    tgtVertex: S2Vertex,
+  private[core] def newSnapshotEdge(srcVertex: S2VertexLike,
+                                    tgtVertex: S2VertexLike,
                                     label: Label,
                                     dir: Int,
                                     op: Byte,
@@ -1792,22 +1792,22 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
                 ts: Long = System.currentTimeMillis(),
                 props: S2Vertex.Props = S2Vertex.EmptyProps,
                 op: Byte = 0,
-                belongLabelIds: Seq[Int] = Seq.empty): S2Vertex = {
+                belongLabelIds: Seq[Int] = Seq.empty): S2VertexLike = {
     val vertex = new S2Vertex(this, id, ts, S2Vertex.EmptyProps, op, belongLabelIds)
     S2Vertex.fillPropsWithTs(vertex, props)
     vertex
   }
 
-  def getVertex(vertexId: VertexId): Option[S2Vertex] = {
+  def getVertex(vertexId: VertexId): Option[S2VertexLike] = {
     val v = newVertex(vertexId)
     Await.result(getVertices(Seq(v)).map { vertices => vertices.headOption }, WaitTimeout)
   }
 
-  def fetchEdges(vertex: S2Vertex, labelNameWithDirs: Seq[(String, String)]): util.Iterator[Edge] = {
+  def fetchEdges(vertex: S2VertexLike, labelNameWithDirs: Seq[(String, String)]): util.Iterator[Edge] = {
     Await.result(fetchEdgesAsync(vertex, labelNameWithDirs), WaitTimeout)
   }
 
-  def fetchEdgesAsync(vertex: S2Vertex, labelNameWithDirs: Seq[(String, String)]): Future[util.Iterator[Edge]] = {
+  def fetchEdgesAsync(vertex: S2VertexLike, labelNameWithDirs: Seq[(String, String)]): Future[util.Iterator[Edge]] = {
     val queryParams = labelNameWithDirs.map { case (l, direction) =>
       QueryParam(labelName = l, direction = direction.toLowerCase)
     }
@@ -1844,7 +1844,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
       Await.result(defaultStorage.fetchVerticesAll(), WaitTimeout).iterator
     } else {
       val vertices = ids.collect {
-        case s2Vertex: S2Vertex => s2Vertex
+        case s2Vertex: S2VertexLike => s2Vertex
         case vId: VertexId => newVertex(vId)
         case vertex: Vertex => newVertex(vertex.id().asInstanceOf[VertexId])
         case other @ _ => newVertex(VertexId.fromString(other.toString))
@@ -1906,7 +1906,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
     addVertex(Seq(T.label, label): _*)
   }
 
-  def makeVertex(idValue: AnyRef, kvsMap: Map[String, AnyRef]): S2Vertex = {
+  def makeVertex(idValue: AnyRef, kvsMap: Map[String, AnyRef]): S2VertexLike = {
     idValue match {
       case vId: VertexId =>
         toVertex(vId.column.service.serviceName, vId.column.columnName, vId, kvsMap)
@@ -1958,7 +1958,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
                 ts: Long = System.currentTimeMillis(),
                 props: S2Vertex.Props = S2Vertex.EmptyProps,
                 op: Byte = 0,
-                belongLabelIds: Seq[Int] = Seq.empty): S2Vertex = {
+                belongLabelIds: Seq[Int] = Seq.empty): S2VertexLike = {
     val vertex = newVertex(id, ts, props, op, belongLabelIds)
 
     val future = mutateVertices(Seq(vertex), withWait = true).map { rets =>
@@ -1970,7 +1970,7 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
     vertex
   }
 
-  def addVertexInner(vertex: S2Vertex): S2Vertex = {
+  def addVertexInner(vertex: S2VertexLike): S2VertexLike = {
     val future = mutateVertices(Seq(vertex), withWait = true).flatMap { rets =>
       if (rets.forall(_.isSuccess)) {
         indexProvider.mutateVerticesAsync(Seq(vertex))
@@ -1982,11 +1982,11 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph
   }
 
   /* tp3 only */
-  def addEdge(srcVertex: S2Vertex, labelName: String, tgtVertex: Vertex, kvs: AnyRef*): Edge = {
+  def addEdge(srcVertex: S2VertexLike, labelName: String, tgtVertex: Vertex, kvs: AnyRef*): Edge = {
     val containsId = kvs.contains(T.id)
 
     tgtVertex match {
-      case otherV: S2Vertex =>
+      case otherV: S2VertexLike =>
         if (!features().edge().supportsUserSuppliedIds() && containsId) {
           throw Exceptions.userSuppliedIdsNotSupported()
         }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala
index 62efa14..96e7afe 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Vertex.scala
@@ -85,7 +85,7 @@ object S2Vertex {
 
   def isLabelId(propKey: Int): Boolean = propKey > Byte.MaxValue
 
-  def fillPropsWithTs(vertex: S2Vertex, props: Props): Unit = {
+  def fillPropsWithTs(vertex: S2VertexLike, props: Props): Unit = {
     props.forEach(new BiConsumer[String, S2VertexProperty[_]] {
       override def accept(key: String, p: S2VertexProperty[_]): Unit = {
 //        vertex.property(Cardinality.single, key, p.value)
@@ -94,7 +94,7 @@ object S2Vertex {
     })
   }
 
-  def fillPropsWithTs(vertex: S2Vertex, state: State): Unit = {
+  def fillPropsWithTs(vertex: S2VertexLike, state: State): Unit = {
     state.foreach { case (k, v) => vertex.propertyInner(Cardinality.single, k.name, v.value) }
   }
 
@@ -104,7 +104,7 @@ object S2Vertex {
     }.toMap
   }
 
-  def stateToProps(vertex: S2Vertex, state: State): Props = {
+  def stateToProps(vertex: S2VertexLike, state: State): Props = {
     state.foreach { case (k, v) =>
       vertex.property(k.name, v.value)
     }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
index c2bc40c..5a8f722 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexLike.scala
@@ -4,6 +4,7 @@ import java.util.function.{BiConsumer, Consumer}
 
 import org.apache.s2graph.core.S2Vertex.Props
 import org.apache.s2graph.core.mysqls.{ColumnMeta, Label, Service, ServiceColumn}
+import org.apache.s2graph.core.types.VertexId
 import org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality
 import org.apache.tinkerpop.gremlin.structure.{Direction, Edge, T, Vertex, VertexProperty}
 import play.api.libs.json.Json
@@ -14,9 +15,17 @@ import scala.collection.JavaConverters._
 trait S2VertexLike extends Vertex with GraphElement {
   this: S2Vertex =>
 
+  val graph: S2Graph
+  val id: VertexId
+  val ts: Long
+  val props: Props
+  val op: Byte
+  val belongLabelIds: Seq[Int]
+
   val innerId = id.innerId
   val innerIdVal = innerId.value
 
+
   lazy val properties = for {
     (k, v) <- props.asScala
   } yield v.columnMeta.name -> v.value
@@ -52,7 +61,7 @@ trait S2VertexLike extends Vertex with GraphElement {
       Seq(ts, GraphUtil.fromOp(op), "v", id.innerId, serviceName, columnName).mkString("\t")
   }
 
-  def copyVertexWithState(props: Props): S2Vertex = {
+  def copyVertexWithState(props: Props): S2VertexLike = {
     val newVertex = copy(props = S2Vertex.EmptyProps)
     S2Vertex.fillPropsWithTs(newVertex, props)
     newVertex

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/S2VertexProperty.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexProperty.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexProperty.scala
index d0b56a0..1fbc894 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/S2VertexProperty.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/S2VertexProperty.scala
@@ -37,7 +37,7 @@ case class S2VertexPropertyId(columnMeta: ColumnMeta, value: InnerValLike) {
   }
 }
 
-case class S2VertexProperty[V](element: S2Vertex,
+case class S2VertexProperty[V](element: S2VertexLike,
                                columnMeta: ColumnMeta,
                                key: String,
                                v: V) extends VertexProperty[V] {

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala b/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
index b52ffda..098d0b4 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/index/IndexProvider.scala
@@ -29,7 +29,7 @@ import org.apache.lucene.queryparser.classic.{ParseException, QueryParser}
 import org.apache.lucene.search.IndexSearcher
 import org.apache.lucene.store.{BaseDirectory, RAMDirectory}
 import org.apache.s2graph.core.io.Conversions
-import org.apache.s2graph.core.{EdgeId, S2Edge, S2Vertex}
+import org.apache.s2graph.core.{EdgeId, S2Edge, S2Vertex, S2VertexLike}
 import org.apache.s2graph.core.mysqls._
 import org.apache.s2graph.core.types.{InnerValLike, VertexId}
 import org.apache.s2graph.core.utils.logger
@@ -127,8 +127,8 @@ trait IndexProvider {
   def fetchVertexIds(hasContainers: java.util.List[HasContainer]): java.util.List[VertexId]
   def fetchVertexIdsAsync(hasContainers: java.util.List[HasContainer]): Future[java.util.List[VertexId]]
 
-  def mutateVertices(vertices: Seq[S2Vertex]): Seq[Boolean]
-  def mutateVerticesAsync(vertices: Seq[S2Vertex]): Future[Seq[Boolean]]
+  def mutateVertices(vertices: Seq[S2VertexLike]): Seq[Boolean]
+  def mutateVerticesAsync(vertices: Seq[S2VertexLike]): Future[Seq[Boolean]]
 
   def mutateEdges(edges: Seq[S2Edge]): Seq[Boolean]
   def mutateEdgesAsync(edges: Seq[S2Edge]): Future[Seq[Boolean]]
@@ -154,7 +154,7 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
     })
   }
 
-  private def toDocument(globalIndex: GlobalIndex, vertex: S2Vertex): Option[Document] = {
+  private def toDocument(globalIndex: GlobalIndex, vertex: S2VertexLike): Option[Document] = {
     val props = vertex.props.asScala
     val exist = props.exists(t => globalIndex.propNamesSet(t._1))
     if (!exist) None
@@ -204,7 +204,7 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
     }
   }
 
-  override def mutateVertices(vertices: Seq[S2Vertex]): Seq[Boolean] = {
+  override def mutateVertices(vertices: Seq[S2VertexLike]): Seq[Boolean] = {
     val globalIndexOptions = GlobalIndex.findAll(GlobalIndex.VertexType)
 
     globalIndexOptions.map { globalIndex =>
@@ -314,7 +314,7 @@ class LuceneIndexProvider(config: Config) extends IndexProvider {
 
   override def fetchVertexIdsAsync(hasContainers: java.util.List[HasContainer]): Future[util.List[VertexId]] = Future.successful(fetchVertexIds(hasContainers))
 
-  override def mutateVerticesAsync(vertices: Seq[S2Vertex]): Future[Seq[Boolean]] = Future.successful(mutateVertices(vertices))
+  override def mutateVerticesAsync(vertices: Seq[S2VertexLike]): Future[Seq[Boolean]] = Future.successful(mutateVertices(vertices))
 
   override def mutateEdgesAsync(edges: Seq[S2Edge]): Future[Seq[Boolean]] = Future.successful(mutateEdges(edges))
 }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala b/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala
index 4bc9376..55b6e12 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala
@@ -262,7 +262,7 @@ class RequestParser(graph: S2Graph) {
     case _ => GroupBy.Empty
   }.getOrElse(GroupBy.Empty)
 
-  def toVertices(labelName: String, direction: String, ids: Seq[JsValue]): Seq[S2Vertex] = {
+  def toVertices(labelName: String, direction: String, ids: Seq[JsValue]): Seq[S2VertexLike] = {
     val vertices = for {
       label <- Label.findByName(labelName).toSeq
       serviceColumn = if (direction == "out") label.srcColumn else label.tgtColumn
@@ -581,7 +581,7 @@ class RequestParser(graph: S2Graph) {
     toJsValues(jsValue).map(toVertex(_, operation, serviceName, columnName))
   }
 
-  def toVertex(jsValue: JsValue, operation: String, serviceName: Option[String] = None, columnName: Option[String] = None): S2Vertex = {
+  def toVertex(jsValue: JsValue, operation: String, serviceName: Option[String] = None, columnName: Option[String] = None): S2VertexLike = {
     val id = parse[JsValue](jsValue, "id")
     val ts = parseOption[Long](jsValue, "timestamp").getOrElse(System.currentTimeMillis())
     val sName = if (serviceName.isEmpty) parse[String](jsValue, "serviceName") else serviceName.get

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/Storage.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/Storage.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/Storage.scala
index e4eafbf..01dd128 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/Storage.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/Storage.scala
@@ -68,7 +68,7 @@ abstract class Storage(val graph: S2Graph,
   def indexEdgeSerializer(indexEdge: IndexEdge): serde.Serializable[IndexEdge] =
     serDe.indexEdgeSerializer(indexEdge)
 
-  def vertexSerializer(vertex: S2Vertex): serde.Serializable[S2Vertex] =
+  def vertexSerializer(vertex: S2VertexLike): serde.Serializable[S2VertexLike] =
     serDe.vertexSerializer(vertex)
 
   def snapshotEdgeDeserializer(schemaVer: String): Deserializable[SnapshotEdge] =
@@ -77,7 +77,7 @@ abstract class Storage(val graph: S2Graph,
   def indexEdgeDeserializer(schemaVer: String): IndexEdgeDeserializable =
     serDe.indexEdgeDeserializer(schemaVer)
 
-  def vertexDeserializer(schemaVer: String): Deserializable[S2Vertex] =
+  def vertexDeserializer(schemaVer: String): Deserializable[S2VertexLike] =
     serDe.vertexDeserializer(schemaVer)
 
   /** Mutation Builder */
@@ -102,7 +102,7 @@ abstract class Storage(val graph: S2Graph,
   def buildDegreePuts(edge: S2Edge, degreeVal: Long): Seq[SKeyValue] =
     io.buildDegreePuts(edge, degreeVal)
 
-  def buildPutsAll(vertex: S2Vertex): Seq[SKeyValue] =
+  def buildPutsAll(vertex: S2VertexLike): Seq[SKeyValue] =
     io.buildPutsAll(vertex)
 
   /** Mutation **/
@@ -118,12 +118,12 @@ abstract class Storage(val graph: S2Graph,
               prevStepEdges: Map[VertexId, Seq[EdgeWithScore]])(implicit ec: ExecutionContext): Future[Seq[StepResult]] =
     fetcher.fetches(queryRequests, prevStepEdges)
 
-  def fetchVertices(vertices: Seq[S2Vertex])(implicit ec: ExecutionContext): Future[Seq[S2Vertex]] =
+  def fetchVertices(vertices: Seq[S2VertexLike])(implicit ec: ExecutionContext): Future[Seq[S2VertexLike]] =
     fetcher.fetchVertices(vertices)
 
   def fetchEdgesAll()(implicit ec: ExecutionContext): Future[Seq[S2Edge]] = fetcher.fetchEdgesAll()
 
-  def fetchVerticesAll()(implicit ec: ExecutionContext): Future[Seq[S2Vertex]] = fetcher.fetchVerticesAll()
+  def fetchVerticesAll()(implicit ec: ExecutionContext): Future[Seq[S2VertexLike]] = fetcher.fetchVerticesAll()
 
   def fetchSnapshotEdgeInner(edge: S2Edge)(implicit ec: ExecutionContext): Future[(Option[S2Edge], Option[SKeyValue])] =
     fetcher.fetchSnapshotEdgeInner(edge)

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageIO.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageIO.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageIO.scala
index 67033f0..4014b6d 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageIO.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageIO.scala
@@ -221,7 +221,7 @@ class StorageIO(val graph: S2Graph, val serDe: StorageSerDe) {
   }
 
   //TODO: ServiceColumn do not have durability property yet.
-  def buildDeleteBelongsToId(vertex: S2Vertex): Seq[SKeyValue] = {
+  def buildDeleteBelongsToId(vertex: S2VertexLike): Seq[SKeyValue] = {
     val kvs = serDe.vertexSerializer(vertex).toKeyValues
     val kv = kvs.head
     vertex.belongLabelIds.map { id =>
@@ -251,7 +251,7 @@ class StorageIO(val graph: S2Graph, val serDe: StorageSerDe) {
     kvs
   }
 
-  def buildPutsAll(vertex: S2Vertex): Seq[SKeyValue] = {
+  def buildPutsAll(vertex: S2VertexLike): Seq[SKeyValue] = {
     vertex.op match {
       case d: Byte if d == GraphUtil.operations("delete") => serDe.vertexSerializer(vertex).toKeyValues.map(_.copy(operation = SKeyValue.Delete))
       case _ => serDe.vertexSerializer(vertex).toKeyValues.map(_.copy(operation = SKeyValue.Put))

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageReadable.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageReadable.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageReadable.scala
index 052ca69..c3b38e8 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageReadable.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageReadable.scala
@@ -41,11 +41,11 @@ trait StorageReadable {
 
   def fetchEdgesAll()(implicit ec: ExecutionContext): Future[Seq[S2Edge]]
 
-  def fetchVerticesAll()(implicit ec: ExecutionContext): Future[Seq[S2Vertex]]
+  def fetchVerticesAll()(implicit ec: ExecutionContext): Future[Seq[S2VertexLike]]
 
   protected def fetchKeyValues(queryRequest: QueryRequest, edge: S2Edge)(implicit ec: ExecutionContext): Future[Seq[SKeyValue]]
 
-  protected def fetchKeyValues(queryRequest: QueryRequest, vertex: S2Vertex)(implicit ec: ExecutionContext): Future[Seq[SKeyValue]]
+  protected def fetchKeyValues(queryRequest: QueryRequest, vertex: S2VertexLike)(implicit ec: ExecutionContext): Future[Seq[SKeyValue]]
 
 
   def fetchSnapshotEdgeInner(edge: S2Edge)(implicit ec: ExecutionContext): Future[(Option[S2Edge], Option[SKeyValue])] = {
@@ -72,8 +72,8 @@ trait StorageReadable {
     }
   }
 
-  def fetchVertices(vertices: Seq[S2Vertex])(implicit ec: ExecutionContext): Future[Seq[S2Vertex]] = {
-    def fromResult(kvs: Seq[SKeyValue], version: String): Seq[S2Vertex] = {
+  def fetchVertices(vertices: Seq[S2VertexLike])(implicit ec: ExecutionContext): Future[Seq[S2VertexLike]] = {
+    def fromResult(kvs: Seq[SKeyValue], version: String): Seq[S2VertexLike] = {
       if (kvs.isEmpty) Nil
       else serDe.vertexDeserializer(version).fromKeyValues(kvs, None).toSeq
     }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageSerDe.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageSerDe.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageSerDe.scala
index 15b3576..32d640c 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageSerDe.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/StorageSerDe.scala
@@ -19,7 +19,7 @@
 
 package org.apache.s2graph.core.storage
 
-import org.apache.s2graph.core.{IndexEdge, S2Graph, S2Vertex, SnapshotEdge}
+import org.apache.s2graph.core._
 import org.apache.s2graph.core.storage.serde.Deserializable
 import org.apache.s2graph.core.storage.serde.indexedge.tall.IndexEdgeDeserializable
 
@@ -57,7 +57,7 @@ trait StorageSerDe {
     * @param vertex : vertex to serialize
     * @return serializer implementation
     */
-  def vertexSerializer(vertex: S2Vertex): serde.Serializable[S2Vertex]
+  def vertexSerializer(vertex: S2VertexLike): serde.Serializable[S2VertexLike]
 
   /**
     * create deserializer that can parse stored CanSKeyValue into snapshotEdge.
@@ -72,7 +72,7 @@ trait StorageSerDe {
 
   def indexEdgeDeserializer(schemaVer: String): IndexEdgeDeserializable
 
-  def vertexDeserializer(schemaVer: String): Deserializable[S2Vertex]
+  def vertexDeserializer(schemaVer: String): Deserializable[S2VertexLike]
 
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageReadable.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageReadable.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageReadable.scala
index 8ff0ee0..92130f5 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageReadable.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageReadable.scala
@@ -168,7 +168,7 @@ class AsynchbaseStorageReadable(val graph: S2Graph,
     * @param vertex
     * @return
     */
-  private def buildRequest(queryRequest: QueryRequest, vertex: S2Vertex) = {
+  private def buildRequest(queryRequest: QueryRequest, vertex: S2VertexLike) = {
     val kvs = serDe.vertexSerializer(vertex).toKeyValues
     val get = new GetRequest(vertex.hbaseTableName.getBytes, kvs.head.row, Serializable.vertexCf)
     //      get.setTimeout(this.singleGetTimeout.toShort)
@@ -183,7 +183,7 @@ class AsynchbaseStorageReadable(val graph: S2Graph,
     fetchKeyValues(rpc)
   }
 
-  override def fetchKeyValues(queryRequest: QueryRequest, vertex: S2Vertex)(implicit ec: ExecutionContext) = {
+  override def fetchKeyValues(queryRequest: QueryRequest, vertex: S2VertexLike)(implicit ec: ExecutionContext) = {
     val rpc = buildRequest(queryRequest, vertex)
     fetchKeyValues(rpc)
   }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageSerDe.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageSerDe.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageSerDe.scala
index 1bdd74e..bb47e3b 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageSerDe.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/hbase/AsynchbaseStorageSerDe.scala
@@ -20,7 +20,7 @@
 package org.apache.s2graph.core.storage.hbase
 
 import org.apache.s2graph.core.storage.serde.Deserializable
-import org.apache.s2graph.core.{IndexEdge, S2Graph, S2Vertex, SnapshotEdge}
+import org.apache.s2graph.core._
 import org.apache.s2graph.core.storage.{StorageIO, StorageSerDe, serde}
 
 class AsynchbaseStorageSerDe(val graph: S2Graph) extends StorageSerDe {
@@ -63,7 +63,7 @@ class AsynchbaseStorageSerDe(val graph: S2Graph) extends StorageSerDe {
     * @param vertex : vertex to serialize
     * @return serializer implementation
     */
-  override def vertexSerializer(vertex: S2Vertex) = new serde.vertex.wide.VertexSerializable(vertex)
+  override def vertexSerializer(vertex: S2VertexLike) = new serde.vertex.wide.VertexSerializable(vertex)
 
   /**
     * create deserializer that can parse stored CanSKeyValue into snapshotEdge.
@@ -83,5 +83,5 @@ class AsynchbaseStorageSerDe(val graph: S2Graph) extends StorageSerDe {
 
   /** create deserializer that can parser stored CanSKeyValue into vertex. */
   private val vertexDeserializer = new serde.vertex.wide.VertexDeserializable(graph)
-  override def vertexDeserializer(schemaVer: String): Deserializable[S2Vertex] = vertexDeserializer
+  override def vertexDeserializer(schemaVer: String): Deserializable[S2VertexLike] = vertexDeserializer
 }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexDeserializable.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexDeserializable.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexDeserializable.scala
index 648c9df..019394e 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexDeserializable.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexDeserializable.scala
@@ -24,12 +24,12 @@ import org.apache.s2graph.core.storage.CanSKeyValue
 import org.apache.s2graph.core.storage.serde.Deserializable
 import org.apache.s2graph.core.storage.serde.StorageDeserializable._
 import org.apache.s2graph.core.types.{HBaseType, InnerValLike, VertexId}
-import org.apache.s2graph.core.{S2Graph, S2Vertex}
+import org.apache.s2graph.core.{S2Graph, S2Vertex, S2VertexLike}
 
 class VertexDeserializable(graph: S2Graph,
-                           bytesToInt: (Array[Byte], Int) => Int = bytesToInt) extends Deserializable[S2Vertex] {
+                           bytesToInt: (Array[Byte], Int) => Int = bytesToInt) extends Deserializable[S2VertexLike] {
   def fromKeyValues[T: CanSKeyValue](_kvs: Seq[T],
-                                          cacheElementOpt: Option[S2Vertex]): Option[S2Vertex] = {
+                                          cacheElementOpt: Option[S2VertexLike]): Option[S2VertexLike] = {
     try {
       assert(_kvs.size == 1)
 

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexSerializable.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexSerializable.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexSerializable.scala
index 87f050d..6e82b87 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexSerializable.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/tall/VertexSerializable.scala
@@ -19,14 +19,14 @@
 
 package org.apache.s2graph.core.storage.serde.vertex.tall
 
-import org.apache.s2graph.core.S2Vertex
+import org.apache.s2graph.core.{S2Vertex, S2VertexLike}
 import org.apache.s2graph.core.storage.SKeyValue
 import org.apache.s2graph.core.storage.serde.Serializable
 import org.apache.s2graph.core.storage.serde.StorageSerializable._
 
 import scala.collection.JavaConverters._
 
-case class VertexSerializable(vertex: S2Vertex, intToBytes: Int => Array[Byte] = intToBytes) extends Serializable[S2Vertex] {
+case class VertexSerializable(vertex: S2VertexLike, intToBytes: Int => Array[Byte] = intToBytes) extends Serializable[S2VertexLike] {
 
   override val table = vertex.hbaseTableName.getBytes
   override val ts = vertex.ts

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexDeserializable.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexDeserializable.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexDeserializable.scala
index bae7941..ddb90ac 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexDeserializable.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexDeserializable.scala
@@ -24,14 +24,14 @@ import org.apache.s2graph.core.storage.CanSKeyValue
 import org.apache.s2graph.core.storage.serde.Deserializable
 import org.apache.s2graph.core.storage.serde.StorageDeserializable._
 import org.apache.s2graph.core.types.{HBaseType, InnerVal, InnerValLike, VertexId}
-import org.apache.s2graph.core.{S2Graph, S2Vertex}
+import org.apache.s2graph.core.{S2Graph, S2Vertex, S2VertexLike}
 
 import scala.collection.mutable.ListBuffer
 
 class VertexDeserializable(graph: S2Graph,
-                           bytesToInt: (Array[Byte], Int) => Int = bytesToInt) extends Deserializable[S2Vertex] {
+                           bytesToInt: (Array[Byte], Int) => Int = bytesToInt) extends Deserializable[S2VertexLike] {
   def fromKeyValues[T: CanSKeyValue](_kvs: Seq[T],
-                                          cacheElementOpt: Option[S2Vertex]): Option[S2Vertex] = {
+                                          cacheElementOpt: Option[S2VertexLike]): Option[S2VertexLike] = {
     try {
       val kvs = _kvs.map { kv => implicitly[CanSKeyValue[T]].toSKeyValue(kv) }
       val kv = kvs.head

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexSerializable.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexSerializable.scala b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexSerializable.scala
index 59db0ab..9efd4e6 100644
--- a/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexSerializable.scala
+++ b/s2core/src/main/scala/org/apache/s2graph/core/storage/serde/vertex/wide/VertexSerializable.scala
@@ -19,14 +19,14 @@
 
 package org.apache.s2graph.core.storage.serde.vertex.wide
 
-import org.apache.s2graph.core.S2Vertex
+import org.apache.s2graph.core.{S2Vertex, S2VertexLike}
 import org.apache.s2graph.core.storage.SKeyValue
 import org.apache.s2graph.core.storage.serde.Serializable
 import org.apache.s2graph.core.storage.serde.StorageSerializable._
 
 import scala.collection.JavaConverters._
 
-case class VertexSerializable(vertex: S2Vertex, intToBytes: Int => Array[Byte] = intToBytes) extends Serializable[S2Vertex] {
+case class VertexSerializable(vertex: S2VertexLike, intToBytes: Int => Array[Byte] = intToBytes) extends Serializable[S2VertexLike] {
 
   override val table = vertex.hbaseTableName.getBytes
   override val ts = vertex.ts

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/test/scala/org/apache/s2graph/core/storage/StorageIOTest.scala
----------------------------------------------------------------------
diff --git a/s2core/src/test/scala/org/apache/s2graph/core/storage/StorageIOTest.scala b/s2core/src/test/scala/org/apache/s2graph/core/storage/StorageIOTest.scala
index a05be79..0cd975c 100644
--- a/s2core/src/test/scala/org/apache/s2graph/core/storage/StorageIOTest.scala
+++ b/s2core/src/test/scala/org/apache/s2graph/core/storage/StorageIOTest.scala
@@ -22,7 +22,7 @@ package org.apache.s2graph.core.storage
 import org.apache.s2graph.core.mysqls._
 import org.apache.s2graph.core.storage.hbase.AsynchbaseStorageSerDe
 import org.apache.s2graph.core.storage.serde.{StorageDeserializable, StorageSerializable}
-import org.apache.s2graph.core.{S2Vertex, TestCommonWithModels}
+import org.apache.s2graph.core.{S2Vertex, S2VertexLike, TestCommonWithModels}
 import org.scalatest.{FunSuite, Matchers}
 
 class StorageIOTest extends FunSuite with Matchers with TestCommonWithModels {
@@ -30,9 +30,9 @@ class StorageIOTest extends FunSuite with Matchers with TestCommonWithModels {
   initTests()
 
   test("AsynchbaseStorageIO: VertexSerializer/Deserializer") {
-    def check(vertex: S2Vertex,
-              op: S2Vertex => StorageSerializable[S2Vertex],
-              deserializer: StorageDeserializable[S2Vertex]): Boolean = {
+    def check(vertex: S2VertexLike,
+              op: S2VertexLike => StorageSerializable[S2VertexLike],
+              deserializer: StorageDeserializable[S2VertexLike]): Boolean = {
       val sKeyValues = op(vertex).toKeyValues
       val deserialized = deserializer.fromKeyValues(sKeyValues, None)
       vertex == deserialized

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
----------------------------------------------------------------------
diff --git a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
index 52d182e..d8b2cfa 100644
--- a/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
+++ b/s2core/src/test/scala/org/apache/s2graph/core/tinkerpop/S2GraphProvider.scala
@@ -39,6 +39,7 @@ object S2GraphProvider {
   val Implementation: Set[Class[_]] = Set(
     classOf[S2Edge],
     classOf[S2Vertex],
+    classOf[S2VertexLike],
     classOf[S2Property[_]],
     classOf[S2VertexProperty[_]],
     classOf[S2Graph]

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/f7170235/s2rest_play/app/org/apache/s2graph/rest/play/controllers/EdgeController.scala
----------------------------------------------------------------------
diff --git a/s2rest_play/app/org/apache/s2graph/rest/play/controllers/EdgeController.scala b/s2rest_play/app/org/apache/s2graph/rest/play/controllers/EdgeController.scala
index 9a45bd5..101b331 100644
--- a/s2rest_play/app/org/apache/s2graph/rest/play/controllers/EdgeController.scala
+++ b/s2rest_play/app/org/apache/s2graph/rest/play/controllers/EdgeController.scala
@@ -52,7 +52,7 @@ object EdgeController extends Controller {
     val kafkaTopic = toKafkaTopic(graphElem.isAsync)
 
     graphElem match {
-      case v: S2Vertex =>
+      case v: S2VertexLike =>
         enqueue(kafkaTopic, graphElem, tsv)
       case e: S2Edge =>
         e.innerLabel.extraOptions.get("walLog") match {
@@ -74,7 +74,7 @@ object EdgeController extends Controller {
     }
   }
 
-  private def toDeleteAllFailMessages(srcVertices: Seq[S2Vertex], labels: Seq[Label], dir: Int, ts: Long ) = {
+  private def toDeleteAllFailMessages(srcVertices: Seq[S2VertexLike], labels: Seq[Label], dir: Int, ts: Long ) = {
     for {
       vertex <- srcVertices
       id = vertex.id.toString
@@ -268,7 +268,7 @@ object EdgeController extends Controller {
     }
 
     def deleteEach(labels: Seq[Label], direction: String, ids: Seq[JsValue],
-                   ts: Long, vertices: Seq[S2Vertex]) = {
+                   ts: Long, vertices: Seq[S2VertexLike]) = {
 
       val future = s2.deleteAllAdjacentEdges(vertices.toList, labels, GraphUtil.directions(direction), ts)
       if (withWait) {