【问题标题】:Unsupported property value type: java.util.LinkedHashMap when writing to Neptune不支持的属性值类型:写入 Neptune 时的 java.util.LinkedHashMap
【发布时间】:2019-10-27 08:48:34
【问题描述】:

我对 Neptune 使用 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)

【问题讨论】:

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


    【解决方案1】:

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

    例如:不要拥有地址列表的属性,而是将地址设置为顶点标签,并具有从您的人到地址1 到地址2 的边。如果您预计列表会发生变化,则此选项会更好。

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

    更新

    接受这个作为答案,因为这就是我最终使用的。我想澄清一些事情。

    在使用 Gremlin property() 步骤等时,Neptune 支持 Single 和 Set 基数属性。

    我在Gremlin-scala 中打开了一个问题,因为我相信ListSet 应该支持本机TinkerPop 基数。 List 今天在 Neptune 中会失败,但这很好,因为用户可以切换到 Set,如果它适用于他们的用例并且会起作用。

    【讨论】:

    • 我已经选择了选项 A。我不想为不需要顶点的东西添加更多顶点,因为版本控制等会导致爆炸。最简单的方法是自己处理 json serDe。此外,Neptune 支持 Set 基数,但 gremlin-scala 不处理它。 Neptune 不直接支持其中任何一个,这我已经知道了。
    【解决方案2】:

    回复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

    【讨论】:

    • 会试试看。
    【解决方案3】:

    根据本文档,我相信 Neptune 可能不支持顶点上的列表属性:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

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

    【讨论】:

    • 这就是List 基数。我的案例类有一个列表,但是使用像 gremlin-scala 这样的库,我不应该关心它是如何处理它的。我希望它只是将其放入数据库,然后再将其取出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2021-06-29
    • 1970-01-01
    • 2019-03-17
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多