Gremlin TinkerPop获得计数并继续相同的遍历

Gremlin TinkerPop获得计数并继续相同的遍历,gremlin,tinkerpop,janusgraph,Gremlin,Tinkerpop,Janusgraph,我目前正在使用TinkerpopJavaAPI进行图形遍历。目前,我必须创建相同遍历的副本来计算计数 Long allUsersCount = gt.V().hasLabel("user").has("name", "John").count().next(); List<Vertex> users = gt.V().hasLabel("user").has("name", "John").toList(); 当我试图重用gt.V.hasLabeluser.hasname、John

我目前正在使用TinkerpopJavaAPI进行图形遍历。目前,我必须创建相同遍历的副本来计算计数

Long allUsersCount = gt.V().hasLabel("user").has("name", "John").count().next();
List<Vertex> users = gt.V().hasLabel("user").has("name", "John").toList();
当我试图重用gt.V.hasLabeluser.hasname、John.count返回的遍历来获取列表时,它导致了错误

IllegalStateException:遍历策略已完成 并且遍历不再能够被调制

我只是想知道是否有任何方法可以避免这种重复,因为两种情况下的遍历是相同的gt.V.hasLabeluser.hasname,John只是终止操作不同

是否有任何方法将计数存储在java变量之间,并继续遍历以获取用户列表。

计数步骤是一个减少障碍的步骤,这就是为什么您会看到这样的行为。有很多方法可以解决这个问题。下面是一个使用AirRoutes数据集的示例

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]    
计数步骤是一个减少障碍的步骤,这就是为什么你看到你的行为。有很多方法可以解决这个问题。下面是一个使用AirRoutes数据集的示例

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]    

您可以通过投影结果和使用带有局部范围的计数步骤来实现这一点

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]]]

本地作用域,即countlocal将对当前对象内的每个列表执行所需的操作。在本例中,我们将查找所有顶点,并将它们收集到一个列表中。进入项目后,我们将计算局部范围,即列表中的项目数,并将该计数与原始列表一起返回。

您可以通过投影结果并使用局部范围的计数步骤来实现这一点

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]]]
本地作用域,即countlocal将对当前对象内的每个列表执行所需的操作。在本例中,我们将查找所有顶点,并将它们收集到一个列表中。一旦进入项目,我们将计算本地范围,即列表中的项目数,并将该计数与原始列表一起返回