在TinkerPop中,顶点属性可以包含复杂对象吗?

时间:2018-09-06 16:13:37

标签: gremlin tinkerpop tinkerpop3

我正在玩TinkerGraphgremlin-scala,我发现它能够保留复杂的对象:

case class InnerObj(a: Int, b: String)
case class ComplexObj(a: Int, b: InnerObj)
case class SuperComplexObj(a : String, b: ComplexObj)

class GremlinQueriesSpec extends FlatSpec
  with ScalaFutures with MustMatchers {

  behavior of "Gremlin queries"

  it must "be able to persist complex objects containing collections" taggedAs Integration in {

    val g = TinkerGraph.open()
    implicit val graph = g.asScala

    val user = RandomData.randomUserDataAggregate

    graph + user

    graph.V().toCC[UserDataAggregate].toList() must be eq List(user)
  }
}

但是,docs对我来说并不完全清楚。一方面,除了listssetsmetaproperties以外,没有太多可用于属性值的结构。另一方面,docs say

  

属性表示与边缘关联的键/值对。一种   属性很像Java8 Optional,因为属性不能是   礼物(即空)。 属性的键始终是字符串,并且   属性的值是任意Java对象。每个基础图   引擎通常会对Java对象是什么有所限制   允许用作值。

好吧,看来它取决于实现。但是可以在Gremlin查询中使用嵌套对象吗?

1 个答案:

答案 0 :(得分:6)

它确实取决于实现。您正在使用TinkerGraph,后者可以存储任何Java对象,因此您可以随意在其中放置任何内容:

gremlin> g.addV().property('function',{it.length()})
==>v[2]
gremlin> g.V().sideEffect{println(it.get().value('function')("four"))}
4
==>v[2]

疯狂吧?当然,您将需要考虑序列化之类的问题,例如,如果您开始在其中插入随机的奇数/结尾,并且需要保留这些对象或将它们推到网上(例如通过Gremlin Server)。

嵌套对象作为TinkerGraph属性的值没有问题。请注意。在深入研究将复杂Java对象存储为属性的路径之前,请真正停止思考您的模式。也许最好只是将这些对象作为图元元素建模为图的元素,以使Gremlin遍历直接在其上起作用。