В TinkerPop могут свойства вершин содержать сложные объекты? - PullRequest
0 голосов
/ 06 сентября 2018

Я играю с TinkerGraph и gremlin-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)
  }
}

Однако, документы мне не совсем понятны. С одной стороны, для значений свойств не так много структуры, кроме lists, sets и metaproperties. С другой стороны документы говорят :

Свойство обозначает пару ключ / значение, связанную с ребром. свойство очень похоже на Java8 Необязательный в том, что свойство может быть не настоящее (то есть пустое). Ключ свойства всегда является строкой, а Значение свойства является произвольным объектом Java. Каждый базовый граф Движок обычно имеет ограничения на то, что объекты Java разрешено использовать в качестве значений.

Хорошо, похоже, это зависит от реализации. Но можно ли работать с вложенными объектами в запросах Gremlin?

1 Ответ

0 голосов
/ 06 сентября 2018

Это действительно зависит от реализации. Вы используете 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 работать непосредственно над ними.

...