不受支持的属性值类型:写入Neptune时的java.util.LinkedHashMap

时间:2019-06-12 19:15:18

标签: scala gremlin tinkerpop3 amazon-neptune gremlin-scala

我对海王星使用Gremlin-scala 3.4.1.5,因此无法使用带有List或Set的案例类添加顶点。当不存在顶点时,添加顶点似乎可以工作

//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)

3 个答案:

答案 0 :(得分:0)

关于Unsupported property value type: java.util.LinkedHashMap

我没有有效的海王星设置,但是普通的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

答案 1 :(得分:0)

我相信Neptune可能不支持此文档中的列表属性:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

要对此进行测试,您可以尝试针对gremlin-server或其他实现运行相同的代码

答案 2 :(得分:0)

Neptune不支持将List作为属性类型[1]。如果需要有序列表,则一种方法是将其序列化为单个属性(例如:列表的json字符串)。在应用程序层中确实需要一些逻辑才能正确地读回它。进行列表的另一种常见方法是将列表项自身建模为顶点,并将其建模为图形中的边。

例如:将地址设置为顶点标签,并从“人”到“地址1”到“地址2”具有边,而不是为地址列表提供属性。如果您希望列表发生突变,则此选项更好。

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

更新

接受此答案,因为这就是我最终使用的答案。我只想澄清几件事。

  

在使用Gremlin property()步骤等时,Neptune支持“单一”和“设置基数”属性。

我在Gremlin-scala中提出了一个问题,因为我认为ListSet应该支持本机TinkerPop基数。 List今天在海王星上将失败,但这很好,因为如果用户可以使用Set,并且可以使用{{1}},那么它就可以使用。