首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将gremlin-groovy转换为jave,例如它的关键字/ sum()步骤的用法

将gremlin-groovy转换为jave,例如它的关键字/ sum()步骤的用法
EN

Stack Overflow用户
提问于 2019-04-20 06:52:53
回答 1查看 124关注 0票数 1

https://groups.google.com/forum/#!topic/gremlin-users/UZMD1qp5mfg使用脚本按示例讨论组:

代码语言:javascript
复制
gremlin> g.V.outE.groupBy{it.inV.next().name}{it.weight}{it.sum().doubleValue()}.cap.orderMap(T.decr)

基于现代示例图:

我想用Java来尝试一下,但是:

  1. 我不知道如何在java中实现"it“关键字。
  2. 上限步骤需要java中的两个参数。
  3. 在Tinkerpop3.4.0时似乎没有orderMap

首先,我只知道:

代码语言:javascript
复制
    // g.V.outE.groupBy{it.inV.next().name}{it.weight}{it.sum().doubleValue()}.cap.orderMap(T.decr)
    GraphTraversalSource g = TinkerFactory.createModern().traversal();
    Map<Object, Object> map = g.V().outE().group().by().next();
    if (debug) {
      System.out.println(map.values().size());
      for (Entry<Object, Object> entry : map.entrySet()) {
        System.out
            .println(String.format("%s=%s", entry.getKey(), entry.getValue()));
      }
    }

给出调试输出:

代码语言:javascript
复制
6
e[7][1-knows->2]=[e[7][1-knows->2]]
e[8][1-knows->4]=[e[8][1-knows->4]]
e[9][1-created->3]=[e[9][1-created->3]]
e[10][4-created->5]=[e[10][4-created->5]]
e[11][4-created->3]=[e[11][4-created->3]]
e[12][6-created->3]=[e[12][6-created->3]]

然后我做了一些这样的实验:

代码语言:javascript
复制
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;

 /**
   * show the given map entries
   * 
   * @param map
   */
  public void showMap(String title, Map<Object, Object> map) {
    System.out.println(title + ":" + map.values().size());
    for (Entry<Object, Object> entry : map.entrySet()) {
      System.out
          .println(String.format("\t%s=%s", entry.getKey(), entry.getValue()));
    }
  }

  public void showObject(String title, Object object) {
    System.out.println(title+":"+object.toString());
  }

  @Test
  /**
   * https://groups.google.com/forum/#!topic/gremlin-users/UZMD1qp5mfg
   * https://stackoverflow.com/questions/55771036/it-keyword-in-gremlin-java
   */
  public void testGroupBy() {
    // gremlin:
    // g.V.outE.groupBy{it.inV.next().name}{it.weight}{it.sum().doubleValue()}.cap.orderMap(T.decr)
    GraphTraversalSource g = TinkerFactory.createModern().traversal();
    debug=true;
    if (debug) {
      g.V().outE().group().by().forEachRemaining(m -> showMap("by()", m));
      g.V().outE().group().by(inV().id())
          .forEachRemaining(m -> showMap("by(inV().id())", m));
      g.V().outE().group("edges").by(inV().id()).cap("edges")
      .forEachRemaining(o -> showObject("cap", o));
}

其结果是:

代码语言:javascript
复制
by():6
    e[7][1-knows->2]=[e[7][1-knows->2]]
    e[8][1-knows->4]=[e[8][1-knows->4]]
    e[9][1-created->3]=[e[9][1-created->3]]
    e[10][4-created->5]=[e[10][4-created->5]]
    e[11][4-created->3]=[e[11][4-created->3]]
    e[12][6-created->3]=[e[12][6-created->3]]
by(inV().id()):4
    2=[e[7][1-knows->2]]
    3=[e[9][1-created->3], e[11][4-created->3], e[12][6-created->3]]
    4=[e[8][1-knows->4]]
    5=[e[10][4-created->5]]
cap:{2=[e[7][1-knows->2]], 3=[e[9][1-created->3], e[11][4-created->3], e[12][6-created->3]], 4=[e[8][1-knows->4]], 5=[e[10][4-created->5]]}

因此,看起来" it“可以被简单地忽略掉,在上限步骤中,"group”必须被命名。gremlin-groovy到Java翻译的其他部分我仍然不明白。

上面的脚本是如何完全翻译成Java的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-21 01:42:17

在TinkerPop 3中,它非常简单,如:

代码语言:javascript
复制
g.V().outE().
  group().
    by(inV().values("name")).
    by(values("weight").sum()).
  order(local).
    by(values, desc)

或者用完整的java语法:

代码语言:javascript
复制
import org.apache.tinkerpop.gremlin.structure.Column;
import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;

g.V().outE().
 group().
   by(inV().values("name")).
   by(values("weight").sum()).
 order(Scope.local).
   by(Column.values, Order.desc)

其结果是:

求和:{ripple=1.0,josh=1.0,lop=1.0,vadas=0.5}

更新

要回答关于使用两个顶点的评论中的问题,如下所示:

代码语言:javascript
复制
g.E().
  group().
    by(bothV().values("name").fold()).
    by(values("weight").sum()).
  order(Scope.local).
    by(Column.values, Order.desc)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55771036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档