叮当得到计数,继续相同的遍历。

问题描述 投票:0回答:1

我目前正在使用TinkerPop java APIs进行图遍历。目前,我不得不为同一个遍历创建一个重复的副本来计算计数。

Long allUsersCount = gt.V().hasLabel("user").has("name", "John").count().next();
List<Vertex> users = gt.V().hasLabel("user").has("name", "John").toList();

当我尝试重用由 gt.V().hasLabel("user").has("name", "John").count() 以获取列表,它引起了错误

java.lang.IllegalStateException。遍历策略已经完成,不能再进行遍历了。

我只想知道是否有办法避免这种重复,因为两种情况下的遍历是一样的。gt.V().hasLabel("user").has("name", "John") 只是结束的操作不同。

有没有办法把中间的计数存储起来(在一个java变量里面),然后继续遍历得到用户列表。

gremlin tinkerpop janusgraph
1个回答
3
投票

的"..."。count() 步骤是 "减少障碍步骤",这就是为什么你会看到你所做的行为。有很多方法可以解决这个问题。这里有一个使用air-routes数据集的例子。

gremlin> g.V().has('city','London').
               fold().
               project('cities','count').
                 by().
                 by(count(local))

==>[cities:[v[49],v[50],v[88],v[94],v[206],v[649]],count:6]    

2
投票

你可以通过投影你的结果,并使用具有本地范围的count()步骤来实现。

g.V().fold().project('cnt', 'edges').by(count(local)).by()

返回这个结果。

==>[cnt:6,edges:[v[1],v[2],v[3],v[4],v[5],v[6]]]

本地作用域(即 count(local))将对当前对象内的每个列表执行所需操作。 在本例中,我们要找到所有顶点,将它们收集到一个列表中。 一旦我们在project()中,我们就会对局部范围(即列表中的项目数量)进行计数,并将该计数与原始列表一起返回。

© www.soinside.com 2019 - 2024. All rights reserved.