【发布时间】:2023-08-10 10:57:01
【问题描述】:
g.V().hasLabel('Person').count() 为我提供了数据库中存在的人物顶点数,g.V().hasLabel('Person').range(10,15) 为我提供了一系列人物顶点。
但是有没有办法将这两者组合成一个 Gremlin 查询?
这只是我的查询的简化版本,但我的实际查询非常复杂,并且重复那些遍历次数只是为了找到计数,似乎无效!
【问题讨论】:
g.V().hasLabel('Person').count() 为我提供了数据库中存在的人物顶点数,g.V().hasLabel('Person').range(10,15) 为我提供了一系列人物顶点。
但是有没有办法将这两者组合成一个 Gremlin 查询?
这只是我的查询的简化版本,但我的实际查询非常复杂,并且重复那些遍历次数只是为了找到计数,似乎无效!
【问题讨论】:
我刚刚意识到,我可以使用 groovy 和 gremlin 来实现我想要的。不知道这有多优雅!
def lst = g.V().hasLabel('Person').toList(); def result = ["count":0, "data":[] ]; result.count=lst.size();result.data=lst[2..3];result
即使在我的复杂情况下,这也很有效。
【讨论】:
count() 和 range() 步骤,因此查询优化器可以启动。
我不建议在每个查询中都使用完整的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]
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!
LinkedList 默认情况下应该是可序列化的。看看您是否可以注册自定义序列化程序(Titan 文档中记录了它是如何工作的)。