我的数据结构如下:
{
number: Integer
letter: String
}
我想像这样两个属性进行分组计数:
g.V().values('number', 'letter').groupCount();
并查看显示的数据:
[[1,A]:16, [1,B]:64, [2,A]:78, [2,B]:987]
在tinkerpop有什么办法吗?
一个简单的
g.V().groupCount().by(values('number', 'letter').fold())
应该做的伎俩。
如果您希望对相关顶点的属性执行groupCount以及project()将执行该任务(values()不处理对象上仅遍历的简单属性)。
假设您的字母是相邻Vertex的属性(在这种情况下使用传出边(但也可能是inoing,在()中使用)并且number是当前/起始Vertex的属性:
g.V().project('number', 'letter').
by(values('number')).
by(out('<outgoing-edge-label>').values('letter')).
groupCount()
在许多情况下它很强大,它可以是by语句中的任意遍历和/或属性。
如果可能的话,我宁愿避免使用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();