多个值的GroupCount

时间:2016-09-26 21:11:58

标签: tinkerpop tinkerpop3

我的数据结构如下:

{
    number: Integer
    letter: String
}

我想通过这两个属性进行分组计数:

g.V().values('number', 'letter').groupCount();

并查看显示的数据:

[[1,A]:16, [1,B]:64, [2,A]:78, [2,B]:987]

有没有办法在tinkerpop中这样做?

3 个答案:

答案 0 :(得分:5)

一个简单的

g.V().groupCount().by(values('number', 'letter').fold())

应该这样做。

答案 1 :(得分:1)

如果您希望对来自相关顶点的属性进行groupCount操作,那么project()也可以完成工作(values()不能仅处理对象上的简单属性的遍历)。

假设您的字母是相邻顶点的一个属性(在这种情况下,使用向外的边(但也可能是传入的,请使用in()),而number是您当前/起始顶点的一个属性:

g.V().project('number', 'letter').
  by(values('number')).
  by(out('<outgoing-edge-label>').values('letter')).
  groupCount()

在许多情况下,它功能强大,它可以是by语句中的任意遍历和/或属性。

答案 2 :(得分:0)

如果可能的话,我宁愿避免使用lambdas;但这就是如何用lambda完成的(如果没有lambda就不可能做到这一点)。

Map<String, Map<Integer, Integer> map = new HashMap<>();
g.V().sideEffect(it -> {
    String letter = (String) it.get().property("letter").value());
    Integer number = (Integer) it.get().property("number").value());
    if (map.get(letter) == null)
        map.put(letter, new HashMap<>());
    if (map.get(letter).get(number) == null)
        map.get(letter).put(number, 1);
    else 
        map.get(letter).put(number, map.get(letter).get(number) + 1);
}).iterate();

的速度大致相同
g.V().values('number', 'letter').groupCount();