【问题标题】:TinkerPop get the count and continue the same traversalTinkerPop 获取计数并继续相同的遍历
【发布时间】:2020-06-03 15:26:48
【问题描述】:

我目前正在使用 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();

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

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

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

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

【问题讨论】:

    标签: gremlin tinkerpop janusgraph


    【解决方案1】:

    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]    
    

    【讨论】:

    • 我还在学习 Gremlin 的来龙去脉,这对我很有帮助!我的要求是在总计数旁边只返回一组对象中的第一个实例的计数,所以我像上面那样使用fold(),并在投影中将它与unfold().limit(1)结合起来。 ...fold().project('city','count').by(unfold().limit(1)).by(count(local))
    【解决方案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(),我们就会计算本地范围(即列表中的项目数)并将该计数与原始列表一起返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多