【问题标题】:How to filter by count on gremlin map (OrientDB)如何在 gremlin 地图上按计数过滤(OrientDB)
【发布时间】:2023-09-10 17:50:01
【问题描述】:

我的业务问题有点类似于 - Gremlin filter by count ,但我在 OrientDB 3.0.16 上运行

这个查询:

  g.V().hasLabel('skill').
   groupCount()

按预期从 OrientDB 返回:

{
"result": [
    {
        "com": 1,
        "netcompactframework": 1,
        "netremoting": 2,
        "netframework": 3,
        "net": 1,
        "netclr": 1
    }
],
"elapsedMs": 18

}

我尝试在它之后应用展开和过滤器:

  g.V().hasLabel('skill').
   groupCount().
   unfold().
   where(select(values).is(gt(1)))

但我得到一个错误:

{
"errors": [
    {
        "reason": 501,
        "code": 501,
        "content": "java.lang.UnsupportedOperationException: Cannot convert netremoting=2 - class java.util.HashMap$Node to JSON"
    }
]

}

似乎问题在于展开(),因为 OrientDB 试图将地图条目字符串转换为 JSON 并失败

有什么想法吗? 这是 OrientDB 的特定问题吗?也许还有另一种方法可以在 gremlin 中执行相同的逻辑?

【问题讨论】:

    标签: orientdb gremlin


    【解决方案1】:

    这看起来像是某种序列化错误,但我不确定您是在什么情况下遇到该问题的。当您 unfold()Map 时,它会转换为 Java Map.Entry 并返回这似乎是序列化程序遇到的内部类 HashMap$Node 的问题。我认为您可以通过折回Map 来解决此问题:

    g.V().hasLabel('skill').
       groupCount().
       unfold().
       where(select(values).is(gt(1))).
       group().
         by(keys).
         by(select(values))
    

    我很想知道是什么情况导致您收到该错误。 Gremlin Server 中的标准 GraphSON 序列化程序应该能够处理HashMap$Node,所以很奇怪你会遇到这个问题。

    【讨论】:

    • 嗨,斯蒂芬,感谢您的帮助。我刚刚尝试将查询运行到并包括展开()(前三行),并且出现了相同的序列化错误。我开始认为这可能是 OrientDB 实现的一个问题。我们的技能顶点似乎被正确定义,并且在其他许多查询中都可以正常工作。
    • 我很困惑。你是说你运行了我的整个查询(不仅仅是前三个步骤)并且仍然得到相同的序列化错误?
    • 我在另一个小型 OrientDB 数据库上运行查询 g.V().hasLabel('person').groupCount().by('name'),它本质上是玩具数据模型(Marko,Vadas, ETC。)。它工作正常。但是一旦我将 .unfold() 添加到查询中,就会发生相同的序列化错误。 “java.lang.UnsupportedOperationException: Cannot convert peter=1 - class java.util.HashMap$Node to JSON”因此我不认为它是我最初尝试过的数据库所独有的(有技巧)“结果”:[{ “彼得”:1,“瓦达斯”:1,“乔希”:1,“马克”:1}]
    • 您的查询似乎在 where 行之后缺少一个点但是即使在修复了那个小语法问题之后,您的查询也没有返回任何结果,也没有错误(这很奇怪)正如我所写,我切换到微小的数据模型,问题正在重现。
    • 您不再收到错误并不奇怪。我认为您没有看到我的解决方法的重点。 unfold() 返回HashMap$Node,这是不可序列化的,原因是我不清楚您对环境的解释。通过在where() 之后添加额外的步骤,我们将HashMap$Node 转换为HashMap,这应该可以毫无问题地序列化。您没有得到任何结果的事实与此无关。我建议您从我的查询建议中删除where(),看看您是否得到实际结果。