https://groups.google.com/forum/#!topic/gremlin-users/UZMD1qp5mfg使用以下脚本通过示例讨论小组:
gremlin> g.V.outE.groupBy{it.inV.next().name}{it.weight}{it.sum().doubleValue()}.cap.orderMap(T.decr)
我想使用 Java 尝试一下,但是:
- 我不知道“it”关键字在java中是如何实现的。
- java 中的 cap 步骤需要两个参数
- 从 Tinkerpop 3.4.0 开始似乎没有 orderMap
首先我只得到了:
// 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()));
}
}
给出调试输出:
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]]
然后我进行了如下实验:
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));
}
结果:
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的?
最佳答案
在 TinkerPop 3 中,它非常简单:
g.V().outE().
group().
by(inV().values("name")).
by(values("weight").sum()).
order(local).
by(values, desc)
或者完整的java语法:
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)
结果:
总和:{纹波=1.0,乔什=1.0,lop=1.0,vadas=0.5}
更新
要回答评论中有关使用两个顶点的问题,应该是这样的:
g.E().
group().
by(bothV().values("name").fold()).
by(values("weight").sum()).
order(Scope.local).
by(Column.values, Order.desc)
关于java - 将 gremlin-groovy 翻译为 java,例如it 关键字/sum() 步骤的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55771036/