TinkerPop 获取计数并继续同样的遍历

Viv*_*vek 5 gremlin tinkerpop janusgraph

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

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

当我尝试重用返回的遍历来gt.V().hasLabel("user").has("name", "John").count()获取列表时,它导致了错误

java.lang.IllegalStateException:遍历策略已完成,无法再调制遍历

我只是想知道是否有任何方法可以避免这种重复,因为两种情况的遍历都是相同的,gt.V().hasLabel("user").has("name", "John")只是终止操作不同。

有没有办法存储中间的计数(在java变量内)并继续遍历以获取用户列表。

Kel*_*nce 7

count()步骤是“减少障碍步骤”,这就是您看到自己所做行为的原因。有很多方法可以解决这个问题。下面是一个使用航线数据集的示例。

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]    
Run Code Online (Sandbox Code Playgroud)


bec*_*hbd 5

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

g.V().fold().project('cnt', 'edges').by(count(local)).by()
Run Code Online (Sandbox Code Playgroud)

返回这个:

==>[cnt:6,edges:[v[1],v[2],v[3],v[4],v[5],v[6]]]
Run Code Online (Sandbox Code Playgroud)

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