Неподдерживаемый тип значения свойства: java.util.LinkedHashMap при записи в Neptune.

Я использую Gremlin-scala 3.4.1.5 против Neptune, и я не могу добавить вершину с помощью класс case со списком или набором, например. Добавить вершину, кажется, работает, когда ее не существует

//connection
Cluster.build()
      .addContactPoint(endpoint)
      .serializer(new GraphSONMessageSerializerV3d0())
      .port(port)
      .create()

val g = EmptyGraph.instance.asScala().configure(_.withRemote(DriverRemoteConnection.using(cluster)))

// adding vertex

case class Person(name: String, friends: Seq[String])
case class Person(name: String, friends: Set[String]) // also does not work
g + Person

Трассировка стека

org.apache.tinkerpop.gremlin.driver.exception.ResponseException: {"requestId":-087f-4868-b4b7-","code":"UnsupportedOperationException","detailedMessage":"Unsupported property value type: java.util.LinkedHashMap"}
java.util.concurrent.CompletionException: org.apache.tinkerpop.gremlin.driver.exception.ResponseException: {"requestId":"-087f-4868-b4b7-","code":"UnsupportedOperationException","detailedMessage":"Unsupported property value type: java.util.LinkedHashMap"}
    at java.util.concurrent.CompletableFuture.reportJoin(CompletableFuture.java:375)
    at java.util.concurrent.CompletableFuture.join(CompletableFuture.java:1934)
    at org.apache.tinkerpop.gremlin.driver.ResultSet.one(ResultSet.java:119)
    at org.apache.tinkerpop.gremlin.driver.ResultSet$1.hasNext(ResultSet.java:171)
    at org.apache.tinkerpop.gremlin.driver.ResultSet$1.next(ResultSet.java:178)
    at org.apache.tinkerpop.gremlin.driver.ResultSet$1.next(ResultSet.java:165)
    at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteTraversal$TraverserIterator.next(DriverRemoteTraversal.java:140)
    at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteTraversal$TraverserIterator.next(DriverRemoteTraversal.java:125)
    at org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteTraversal.nextTraverser(DriverRemoteTraversal.java:106)

person Bowofola    schedule 12.06.2019    source источник


Ответы (3)


Neptune не поддерживает List как тип свойства [1]. Если требуется упорядоченный список, один из способов сделать это — сериализовать его в одно свойство (например, строку json списка). Для правильного чтения требуется немного логики на прикладном уровне. Другой распространенный способ создания списков — смоделировать элемент списка как отдельную вершину и смоделировать их как ребра в графе.

Например: вместо того, чтобы иметь свойство для списка адресов, сделайте адрес меткой вершины и сделайте ребра от вашего человека до адреса 1 и адреса 2. Этот вариант лучше, если вы ожидаете изменений в вашем списке.

https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

Обновлять

Принять это как ответ, потому что это то, что я в итоге использовал. Я просто хотел бы уточнить несколько вещей.

Neptune поддерживает свойства кардинальности Single и Set при использовании шага Gremlin property() и т. д.

Я открыл задачу в Gremlin-scala, так как считаю, что исходные мощности TinkerPop должны поддерживаться для List и Set. List сегодня в Neptune потерпит неудачу, но это нормально, потому что пользователь может переключиться на Set, если он сработает для его варианта использования, и это сработает.

person The-Big-K    schedule 26.06.2019
comment
Я уже выбрал вариант A. Я не хочу добавлять больше вершин для вещей, которые не должны быть вершинами, потому что это взрывается с управлением версиями и т. Д. Самый простой способ - просто обработать json serDe самостоятельно. Кроме того, Neptune поддерживает кардинальность Set, но gremlin-scala не поддерживает ее. Нептун не поддерживает ни одну из них напрямую, и это я уже знал. - person Bowofola; 27.06.2019

Re Unsupported property value type: java.util.LinkedHashMap

У меня нет работающей установки Neptune, но обычная scala List может подойти. Если нет, вот соответствующие разделы в макросе:

https://github.com/mpollmeier/gremlin-scala/blob/2e32ae0/macros/src/main/scala/gremlin/scala/Marshallable.scala#L178-L179

https://github.com/mpollmeier/gremlin-scala/blob/2e32ae0/macros/src/main/scala/gremlin/scala/Marshallable.scala#L110-L120

person Michael Pollmeier    schedule 15.06.2019
comment
Попробую это и посмотрим. - person Bowofola; 19.06.2019

Я считаю, что Neptune может не поддерживать свойства списка в вершинах в соответствии с этой документацией: https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

Чтобы проверить это, вы можете попробовать запустить тот же код на gremlin-server или какой-либо другой реализации.

person Cody Braun    schedule 18.06.2019
comment
Это около List кардинальности. В моем классе case есть список, но при использовании такой библиотеки, как gremlin-scala, мне все равно, как она с ним справляется. Я ожидаю, что он просто поместит его в базу данных и вернет обратно. - person Bowofola; 27.06.2019