【问题标题】:How to retrieve the count and range in the same gremlin query如何在同一个 gremlin 查询中检索计数和范围
【发布时间】:2023-08-10 10:57:01
【问题描述】:

g.V().hasLabel('Person').count() 为我提供了数据库中存在的人物顶点数,g.V().hasLabel('Person').range(10,15) 为我提供了一系列人物顶点。

但是有没有办法将这两者组合成一个 Gremlin 查询?

这只是我的查询的简化版本,但我的实际查询非常复杂,并且重复那些遍历次数只是为了找到计数,似乎无效!

【问题讨论】:

    标签: titan gremlin


    【解决方案1】:

    我刚刚意识到,我可以使用 groovy 和 gremlin 来实现我想要的。不知道这有多优雅!

    def lst = g.V().hasLabel('Person').toList(); def result = ["count":0, "data":[] ]; result.count=lst.size();result.data=lst[2..3];result

    即使在我的复杂情况下,这也很有效。

    【讨论】:

    • 您应该更喜欢使用 Gremlin 步骤,即。 count()range() 步骤,因此查询优化器可以启动。
    • 感谢您的建议,您能帮我解答一下吗?
    【解决方案2】:

    我不建议在每个查询中都使用完整的count()。而是计算一次总数并将其缓存在您的应用程序中。

    也就是说,无论如何你都可以这样做:

    g.V().hasLabel('Person').aggregate('x').cap('x').
      project('page3', 'total').by(range(local, 10, 15)).by(count(local))
    

    更新:

    在旧版本中,您可以试试这个:

    g.V().hasLabel('Person').aggregate('x').cap('x').as('page3', 'total').
      select('page3', 'total').by(range(local, 10, 15)).by(count(local))
    

    【讨论】:

    • 谢谢丹尼尔的回答,但是当我尝试这个时,我得到:No signature of method: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal.project() is applicable for argument types: (java.lang.String, java.lang.String) values: [page3, total] Possible solutions: reset(), collect(), toSet(), inspect(), sort(), inject(groovy.lang.Closure) Display stack trace? [yN]
    • 我正在使用 titan11 分支和 Tinkerpop 3.1.1-incubating
    • 我不打算在应用程序中缓存计数,因为数据是事务性的,一旦我在第一个响应中提供它,计数就会变得陈旧!因此,我每次都必须进行完整计数。此外,这是一个示例查询,由于应用了过滤器,我将在完整计数中遍历的实际顶点/边数会更少。
    • 感谢 Daniel 的更新,但是当我尝试 as(..).select(..) 时,出现以下错误 Server could not serialize the result requested. Server error - Error during serialization: Class is not registered: java.util.LinkedList Note: To register this class use: kryo.register(java.util.LinkedList.class);. Note that the class must be serializable by the client and server for proper operation. 我无法理解的是范围步骤通常使用会产生结果,但在这种情况下会给出 LinkedList!
    • 那么这看起来像是 Titan 中的一个问题。 LinkedList 默认情况下应该是可序列化的。看看您是否可以注册自定义序列化程序(Titan 文档中记录了它是如何工作的)。