blob: 04268d6892744686721c5c91046c7c59931e17b9 [file] [log] [blame]
/*
* 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.s2graph.core.tinkerpop.structure
import java.util.function.Predicate
import org.apache.s2graph.core.GraphExceptions.LabelNotExistException
import org.apache.s2graph.core.Management.JsonModel.Prop
import org.apache.s2graph.core._
import org.apache.s2graph.core.schema.{GlobalIndex, Service, ServiceColumn}
import org.apache.s2graph.core.tinkerpop.S2GraphProvider
import org.apache.s2graph.core.utils.logger
import org.apache.tinkerpop.gremlin.process.traversal.{Compare, P, Scope}
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.{in, out}
import org.apache.tinkerpop.gremlin.structure._
import org.scalatest.{FunSuite, Matchers}
class S2GraphTest extends FunSuite with Matchers with TestCommonWithModels {
import scala.concurrent.ExecutionContext.Implicits.global
initTests()
val g = new S2Graph(config)
def printEdges(edges: Seq[Edge]): Unit = {
edges.foreach { edge =>
logger.debug(s"[FetchedEdge]: $edge")
}
}
import scala.language.implicitConversions
// def newVertexId(id: Any, label: Label = labelV2) = g.newVertexId(label.srcService, label.srcColumn, id)
//
// def addVertex(id: AnyRef, label: Label = labelV2) =
// g.addVertex(T.label, label.srcService.serviceName + S2Vertex.VertexLabelDelimiter + label.srcColumnName,
// T.id, id).asInstanceOf[S2Vertex]
//
// val srcId = Long.box(20)
// val range = (100 until 110)
// testData(srcId, range)
// val testProps = Seq(
// Prop("affinity_score", "0.0", DOUBLE),
// Prop("is_blocked", "false", BOOLEAN),
// Prop("time", "0", INT),
// Prop("weight", "0", INT),
// Prop("is_hidden", "true", BOOLEAN),
// Prop("phone_number", "xxx-xxx-xxxx", STRING),
// Prop("score", "0.1", FLOAT),
// Prop("age", "10", INT)
// )
// def testData(srcId: AnyRef, range: Range, label: Label = labelV2) = {
// val src = addVertex(srcId)
//
// for {
// i <- range
// } {
// val tgt = addVertex(Int.box(i))
//
// src.addEdge(labelV2.label, tgt,
// "age", Int.box(10),
// "affinity_score", Double.box(0.1),
// "is_blocked", Boolean.box(true),
// "ts", Long.box(i))
// }
// }
// test("test traversal.") {
// val vertices = g.traversal().V(newVertexId(srcId)).out(labelV2.label).toSeq
//
// vertices.size should be(range.size)
// range.reverse.zip(vertices).foreach { case (tgtId, vertex) =>
// val vertexId = g.newVertexId(labelV2.tgtService, labelV2.tgtColumn, tgtId)
// val expectedId = g.newVertex(vertexId)
// vertex.asInstanceOf[S2Vertex].innerId should be(expectedId.innerId)
// }
// }
//
// test("test traversal. limit 1") {
// val vertexIdParams = Seq(newVertexId(srcId))
// val t: GraphTraversal[Vertex, Double] = g.traversal().V(vertexIdParams: _*).outE(labelV2.label).limit(1).values("affinity_score")
// for {
// affinityScore <- t
// } {
// logger.debug(s"$affinityScore")
// affinityScore should be (0.1)
// }
// }
// test("test traversal. 3") {
//
// val l = label
//
// val srcA = addVertex(Long.box(1), l)
// val srcB = addVertex(Long.box(2), l)
// val srcC = addVertex(Long.box(3), l)
//
// val tgtA = addVertex(Long.box(101), l)
// val tgtC = addVertex(Long.box(103), l)
//
// srcA.addEdge(l.label, tgtA)
// srcA.addEdge(l.label, tgtC)
// tgtC.addEdge(l.label, srcB)
// tgtA.addEdge(l.label, srcC)
//
// val vertexIdParams = Seq(srcA.id)
// val vertices = g.traversal().V(vertexIdParams: _*).out(l.label).out(l.label).toSeq
// vertices.size should be(2)
// vertices.foreach { v =>
// val vertex = v.asInstanceOf[S2Vertex]
// // TODO: we have too many id. this is ugly and confusing so fix me.
// vertex.id.innerId == srcB.id.innerId || vertex.id.innerId == srcC.id.innerId should be(true)
// logger.debug(s"[Vertex]: $v")
// }
// }
// test("add vertex without params.") {
// val vertex = g.addVertex().asInstanceOf[S2Vertex]
// vertex.id.column.service.serviceName should be(g.DefaultService.serviceName)
// vertex.id.column.columnName should be(g.DefaultColumn.columnName)
// }
// val s2Graph = graph.asInstanceOf[S2Graph]
// val mnt = s2Graph.getManagement()
// override val service = s2Graph.DefaultService
//
// val personColumn = Management.createServiceColumn(service.serviceName, "person", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer")))
// val softwareColumn = Management.createServiceColumn(service.serviceName, "software", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("lang", "-", "string")))
// // val vertexColumn = Management.createServiceColumn(service.serviceName, "vertex", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "-1", "integer"), Prop("lang", "scala", "string")))
//
// val created = mnt.createLabel("created", service.serviceName, "person", "integer", service.serviceName, "software", "integer",
// true, service.serviceName, Nil, Seq(Prop("weight", "0.0", "float")), "strong", None, None)
//
// val knows = mnt.createLabel("knows", service.serviceName, "person", "integer", service.serviceName, "person", "integer",
// true, service.serviceName, Nil, Seq(Prop("weight", "0.0", "float")), "strong", None, None)
//
// test("tinkerpop class graph test.") {
// val marko = graph.addVertex(T.label, "person", T.id, Int.box(1))
// marko.property("name", "marko")
// marko.property("age", Int.box(29))
// val vadas = graph.addVertex(T.label, "person", T.id, Int.box(2))
// vadas.property("name", "vadas", "age", Int.box(27))
// val lop = graph.addVertex(T.label, "software", T.id, Int.box(3), "name", "lop", "lang", "java")
// val josh = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "josh", "age", Int.box(32))
// val ripple = graph.addVertex(T.label, "software", T.id, Int.box(5), "name", "ripple", "lang", "java")
// val peter = graph.addVertex(T.label, "person", T.id, Int.box(6), "name", "peter", "age", Int.box(35))
//
// marko.addEdge("knows", vadas, T.id, Int.box(7), "weight", Float.box(0.5f))
// marko.addEdge("knows", josh, T.id, Int.box(8), "weight", Float.box(1.0f))
// marko.addEdge("created", lop, T.id, Int.box(9), "weight", Float.box(0.4f))
// josh.addEdge("created", ripple, T.id, Int.box(10), "weight", Float.box(1.0f))
// josh.addEdge("created", lop, T.id, Int.box(11), "weight", Float.box(0.4f))
// peter.addEdge("created", lop, T.id, Int.box(12), "weight", Float.box(0.2f))
// graph.tx().commit()
//
// graph.traversal().V().inV()
// val verticees = graph.traversal().V().asAdmin()
//
//
// val vs = verticees.toList
//
//
// }
// test("addVertex with empty parameter") {
//
// }
// test("aaa") {
// val mnt = graph.management
// val defaultService = graph.DefaultService
// val defaultServiceColumn = graph.DefaultColumn
// val columnNames = Set(defaultServiceColumn.columnName, "person", "software", "product", "dog")
// val labelNames = Set("knows", "created", "bought", "test", "self", "friends", "friend", "hate", "collaborator", "test1", "test2", "test3", "pets", "walks")
//
// Management.deleteService(defaultService.serviceName)
// columnNames.foreach { columnName =>
// Management.deleteColumn(defaultServiceColumn.service.serviceName, columnName)
// }
// labelNames.foreach { labelName =>
// Management.deleteLabel(labelName)
// }
//
// val knows = mnt.createLabel("knows",
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// true, defaultService.serviceName, Nil, Seq(Prop("since", "0", "integer")), consistencyLevel = "strong", None, None,
// options = Option("""{"skipReverse": false}"""))
//
// val pets = mnt.createLabel("pets",
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// true, defaultService.serviceName, Nil, Nil, consistencyLevel = "strong", None, None,
// options = Option("""{"skipReverse": false}"""))
//
// val walks = mnt.createLabel("walks",
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// true, defaultService.serviceName, Nil, Seq(Prop("location", "-", "string")), consistencyLevel = "strong", None, None,
// options = Option("""{"skipReverse": false}"""))
//
// val livesWith = mnt.createLabel("livesWith",
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// true, defaultService.serviceName, Nil, Nil, consistencyLevel = "strong", None, None,
// options = Option("""{"skipReverse": false}"""))
//
// val friend = mnt.createLabel("friend", defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType, defaultService.serviceName, defaultServiceColumn.columnName, defaultServiceColumn.columnType,
// true, defaultService.serviceName, Nil,
// Seq(
// Prop("name", "-", "string"),
// Prop("location", "-", "string"),
// Prop("status", "-", "string")
// ),
// "strong", None, None,
// options = Option("""{"skipReverse": false}""")
// )
//
// val v1 = graph.addVertex("name", "marko")
// val v2 = graph.addVertex("name", "puppy")
//
// v1.addEdge("knows", v2, "since", Int.box(2010))
// v1.addEdge("pets", v2)
// v1.addEdge("walks", v2, "location", "arroyo")
// v2.addEdge("knows", v1, "since", Int.box(2010))
//
// v1.edges(Direction.BOTH).foreach { e => logger.error(s"[Edge]: $e")}
// }
// test("bb") {
// val mnt = graph.management
// val defaultService = graph.DefaultService
// val defaultServiceColumn = graph.DefaultColumn
// val columnNames = Set(defaultServiceColumn.columnName, "person", "software", "product", "dog")
// val labelNames = Set("knows", "created", "bought", "test", "self", "friends", "friend", "hate", "collaborator", "test1", "test2", "test3", "pets", "walks")
//
// Management.deleteService(defaultService.serviceName)
// columnNames.foreach { columnName =>
// Management.deleteColumn(defaultServiceColumn.service.serviceName, columnName)
// }
// labelNames.foreach { labelName =>
// Management.deleteLabel(labelName)
// }
// val personColumn = Management.createServiceColumn(defaultService.serviceName, "person", "integer",
// Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string")))
// val knows = mnt.createLabel("knows",
// defaultService.serviceName, "person", "integer",
// defaultService.serviceName, "person", "integer",
// true, defaultService.serviceName, Nil, Seq(Prop("since", "0", "integer"), Prop("year", "0", "integer")), consistencyLevel = "strong", None, None)
//
// val created = mnt.createLabel("created", defaultService.serviceName, "person", "integer", defaultService.serviceName, "software", "integer",
// true, defaultService.serviceName, Nil, Seq(Prop("weight", "0.0", "double")), "strong", None, None)
//
//// val v1 = graph.toVertex(graph.DefaultService.serviceName, "person", 1)
//// val v4 = graph.toVertex(graph.DefaultService.serviceName, "person", 4)
//// val ts = System.currentTimeMillis()
//// val edge = graph.newEdge(v1, v4, knows.get,
//// GraphUtil.directions("out"), GraphUtil.operations("insert"),
//// propsWithTs = Map(LabelMeta.timestamp -> InnerValLikeWithTs.withLong(ts, ts, knows.get.schemaVersion)))
// val v1 = graph.addVertex(T.label, "person", T.id, Int.box(1), "name", "marko")
// val v4 = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "vadas")
//
// val g = graph.traversal()
// v1.addEdge("knows", v4, "year", Int.box(2002))
//
// def convertToEdgeId(outVertexName: String, edgeLabel: String, inVertexName: String): AnyRef = {
// g.V().has("name", outVertexName).outE(edgeLabel).as("e").inV.has("name", inVertexName).select[Edge]("e").next().id()
// }
//
// g.V().has("name", "marko").outE("knows").as("e").inV.foreach(e => logger.error(s"[Edge]: $e"))
//
//// .as("e").inV.has("name", "vadas").select[Edge]("e").next().id()
//// g.E(convertToEdgeId("marko", "knows", "vadas")).foreach(e => logger.error(s"[EDGE]: $e"))
//// val x = DetachedFactory.detach(g.E(convertToEdgeId("marko", "knows", "vadas")).next(), true)
////// .hashCode()
//// val y = DetachedFactory.detach(g.E(convertToEdgeId("marko", "knows", "vadas")).next(), true)
//// .hashCode()
//// logger.error(s"[X]: $x")
//// logger.error(s"[Y]: $y")
//
//// g.E().foreach(e => logger.error(s"[Edge]: $e"))
//// g.V().has("name", "marko").outE("knows").foreach(v => logger.error(s"[OutVertex]: $v"))
//// g.V().has("name", "vadas").inE("knows").foreach(v => logger.error(s"[InVertex]: $v"))
//
//
// @Test
// @LoadGraphWith(GraphData.MODERN)
// @FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
// def shouldConstructDetachedEdgeAsReference() {
//
// graph.traversal().E(convertToEdgeId("marko", "knows", "vadas")).next().property("year", 2002);
// val detachedEdge = DetachedFactory.detach(g.E(convertToEdgeId("marko", "knows", "vadas")).next(), false);
//// assertEquals(convertToEdgeId("marko", "knows", "vadas"), detachedEdge.id());
//// assertEquals("knows", detachedEdge.label());
//// assertEquals(DetachedVertex.class, detachedEdge.vertices(Direction.OUT).next().getClass());
//// assertEquals(convertToVertexId("marko"), detachedEdge.vertices(Direction.OUT).next().id());
//// assertEquals("person", detachedEdge.vertices(Direction.IN).next().label());
//// assertEquals(DetachedVertex.class, detachedEdge.vertices(Direction.IN).next().getClass());
//// assertEquals(convertToVertexId("vadas"), detachedEdge.vertices(Direction.IN).next().id());
//// assertEquals("person", detachedEdge.vertices(Direction.IN).next().label());
////
//// assertEquals(0, IteratorUtils.count(detachedEdge.properties()));
// }
//// shouldConstructDetachedEdgeAsReference()
// }
def convertToEdgeId(g: GraphTraversalSource, outVertexName: String, edgeLabel: String, inVertexName: String): AnyRef = {
g.V().has("name", outVertexName).outE(edgeLabel).as("e").inV.has("name", inVertexName).select[Edge]("e").next().id()
}
// test("ccc") {
// val mnt = graph.management
// val defaultService = graph.DefaultService
// val defaultServiceColumn = graph.DefaultColumn
// val columnNames = Set(defaultServiceColumn.columnName, "person", "software", "product", "dog")
// val labelNames = Set("knows", "created", "bought", "test", "self", "friends", "friend", "hate", "collaborator", "test1", "test2", "test3", "pets", "walks")
//
// Management.deleteService(defaultService.serviceName)
// columnNames.foreach { columnName =>
// Management.deleteColumn(defaultServiceColumn.service.serviceName, columnName)
// }
// labelNames.foreach { labelName =>
// Management.deleteLabel(labelName)
// }
// val personColumn = Management.createServiceColumn(defaultService.serviceName, "person", "integer",
// Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string")))
// val knows = mnt.createLabel("knows",
// defaultService.serviceName, "person", "integer",
// defaultService.serviceName, "person", "integer",
// true, defaultService.serviceName, Nil, Seq(Prop("since", "0", "integer"), Prop("year", "0", "integer")), consistencyLevel = "strong", None, None)
//
// val created = mnt.createLabel("created",
// defaultService.serviceName, "person", "integer",
// defaultService.serviceName, "person", "integer",
// true, defaultService.serviceName, Nil, Seq(Prop("weight", "0.0", "double")), "strong", None, None)
//
// val g = graph.traversal()
// val v1 = graph.addVertex(T.label, "person", T.id, Int.box(1), "name", "josh")
// val v4 = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "lop")
// val e = v1.addEdge("created", v4)
//
// val toDetach = g.E(convertToEdgeId(g, "josh", "created", "lop")).next()
// val outV = toDetach.vertices(Direction.OUT).next()
// val detachedEdge = DetachedFactory.detach(toDetach, true)
// val attached = detachedEdge.attach(Attachable.Method.get(outV))
//
// assert(toDetach.equals(attached))
// assert(!attached.isInstanceOf[DetachedEdge])
// }
// test("ddd") {
//// @Test
//// @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
//// @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
//// @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = EdgeFeatures.FEATURE_ADD_PROPERTY)
//// def shouldEnableFeatureOnEdgeIfNotEnabled() = {
//// graph.features.supports(classOf[EdgePropertyFeatures], "BooleanValues")
////// assumeThat(graph.features().supports(EdgePropertyFeatures.class, featureName), is(false));
////// try {
////// final Edge edge = createEdgeForPropertyFeatureTests();
////// edge.property("aKey", value);
////// fail(String.format(INVALID_FEATURE_SPECIFICATION, EdgePropertyFeatures.class.getSimpleName(), featureName));
////// } catch (Exception e) {
////// validateException(Property.Exceptions.dataTypeOfPropertyValueNotSupported(value), e);
////// }
//// }
// val ret = graph.features.supports(classOf[EdgePropertyFeatures], "BooleanValues")
// logger.error(s"[Support]: $ret")
////
//// @Test
//// @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
//// @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
//// public void shouldEnableFeatureOnVertexIfNotEnabled() throws Exception {
//// assumeThat(graph.features().supports(VertexPropertyFeatures.class, featureName), is(false));
//// try {
//// graph.addVertex("aKey", value);
//// fail(String.format(INVALID_FEATURE_SPECIFICATION, VertexPropertyFeatures.class.getSimpleName(), featureName));
//// } catch (Exception e) {
//// validateException(Property.Exceptions.dataTypeOfPropertyValueNotSupported(value), e);
//// }
//// }
////
////
////
//// @Test
//// @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
//// @FeatureRequirement(featureClass = VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
//// @FeatureRequirement(featureClass = VertexFeatures.class, feature = FEATURE_ANY_IDS, supported = false)
//// public void shouldSupportUserSuppliedIdsOfTypeAny() throws Exception {
//// try {
//// final Date id = new Date();
//// graph.addVertex(T.id, id);
////
//// // a graph can "allow" an id without internally supporting it natively and therefore doesn't need
//// // to throw the excepStion
//// if (!graph.features().vertex().willAllowId(id))
//// fail(String.format(INVALID_FEATURE_SPECIFICATION, VertexFeatures.class.getSimpleName(), FEATURE_ANY_IDS));
//// } catch (Exception e) {
//// validateException(Vertex.Exceptions.userSuppliedIdsOfThisTypeNotSupported(), e);
//// }
//// }
// }
ignore("Modern") {
val mnt = graph.management
S2GraphFactory.cleanupDefaultSchema
S2GraphFactory.initDefaultSchema(graph)
val softwareColumn = Management.createServiceColumn(S2Graph.DefaultServiceName, "software", "integer", Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("lang", "-", "string")))
val personColumn = Management.createServiceColumn(S2Graph.DefaultServiceName, "person", "integer",
Seq(Prop(T.id.toString, "-1", "integer"), Prop("name", "-", "string"), Prop("age", "0", "integer"), Prop("location", "-", "string")))
val knows = mnt.createLabel("knows",
S2Graph.DefaultServiceName, "person", "integer",
S2Graph.DefaultServiceName, "person", "integer",
true, S2Graph.DefaultServiceName, Nil, Seq(Prop("weight", "0.0", "double"), Prop("year", "0", "integer")), consistencyLevel = "strong", None, None)
val created = mnt.createLabel("created",
S2Graph.DefaultServiceName, "person", "integer",
S2Graph.DefaultServiceName, "person", "integer",
true, S2Graph.DefaultServiceName, Nil, Seq(Prop("weight", "0.0", "double")), "strong", None, None)
val g = graph.traversal()
val v1 = graph.addVertex(T.label, "person", T.id, Int.box(1), "name", "marko", "age", Int.box(29))
val v2 = graph.addVertex(T.label, "person", T.id, Int.box(2), "name", "vadas", "age", Int.box(27))
val v3 = graph.addVertex(T.label, "software", T.id, Int.box(3), "name", "lop", "lang", "java")
val v4 = graph.addVertex(T.label, "person", T.id, Int.box(4), "name", "josh", "josh", Int.box(32))
val v5 = graph.addVertex(T.label, "software", T.id, Int.box(5), "name", "ripple", "lang", "java")
val v6 = graph.addVertex(T.label, "person", T.id, Int.box(6), "name", "peter", "age", Int.box(35))
val e1 = v1.addEdge("created", v3, "weight", Double.box(0.4))
val e2 = v1.addEdge("knows", v2, "weight", Double.box(0.5))
val e3 = v1.addEdge("knows", v4, "weight", Double.box(1.0))
val e4 = v2.addEdge("knows", v1, "weight", Double.box(0.5))
val e5 = v3.addEdge("created", v1, "weight", Double.box(0.4))
val e6 = v3.addEdge("created", v4, "weight", Double.box(0.4))
val e7 = v3.addEdge("created", v6, "weight", Double.box(0.2))
val e8 = v4.addEdge("knows", v1, "weight", Double.box(1.0))
val e9 = v4.addEdge("created", v5, "weight", Double.box(1.0))
val e10 = v4.addEdge("created", v3, "weight", Double.box(0.4))
val e11 = v5.addEdge("created", v4, "weight", Double.box(1.0))
val e12 = v6.addEdge("created", v3, "weight", Double.box(0.2))
val ls = graph.traversal().E().has("knows", "weight", P.eq(Double.box(0.5)))
// return graph.traversal.V().hasLabel("person").has("age", P.not(P.lte(10).and(P.not(P.between(11, 20)))).and(P.lt(29).or(P.eq(35)))).values("name")
val l = ls.toList
println(s"[Size]: ${l.size}")
println(l.toArray.toSeq.mkString("\n"))
ls
}
}