在TinkerPop中,顶点属性是否包含复杂对象?

问题描述 投票:0回答:1

我正在玩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

属性表示与Edge关联的键/值对。属性很像Java8可选,因为属性不存在(即空)。属性的键始终是String,属性的值是任意Java对象。每个底层图引擎通常都会限制允许将哪些Java对象用作值。

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

gremlin tinkerpop tinkerpop3
1个回答
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遍历能够直接对其进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.