多个值的 GroupCount

GroupCount by Multiple Values

我的数据结构如下:

{
    number: Integer
    letter: String
}

我想像这样按两个属性进行分组计数:

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

并查看显示的数据:

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

在 tinkerpop 中有什么方法可以做到这一点吗?

我宁愿尽可能避免使用 lambda;但这是用 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();

简单

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

应该可以解决问题。

如果你想对相关顶点的属性进行 groupCount 以及 project() 将完成这项工作(values() 不处理对象上的简单属性的遍历)。

假设您的字母是相邻顶点的 属性(在这种情况下使用传出边(但也可能是传入的,使用 in())并且数字是 属性你的 current/starting 顶点:

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

很多时候很强大,可以任意遍历by语句中的and/or属性