我想要检索所有顶点,并且对于每个顶点,我想计算指向它的“Like”边的数量。
如何在Gremlin中编写此类查询?
在SQL中它可能就像....
SELECT *, (SELECT Count(*) FROM tbl_like l WHERE l.id = b.id) AS LikeCount
FROM tbl_blah b
答案 0 :(得分:1)
E.g。使用sideEffect
将计数放入地图(m
)
m=[:];g.V.sideEffect{m[it]=it.inE.has('label','like').count()}
省略顶点为0的替代方案:
m=[:];g.V.inE('like').groupCount(m){it.inV.next()}
修改强>
最后是智能解决方案:
m=[:];g.V.groupCount(m){it}{it.a.inE('like').count()}
groupCount
的第一个闭包确定了在地图中更新的键,第二个闭包了键的值。似乎第二个闭包中的it.a
将当前输入值提供给groupCount
(此处为顶点)和it.b
输入对象的映射中的先前值。还没有真正找到解释这个的文档,也许其中一个TinkerPop人员可以详细说明groupCount
闭包的确切用法。
答案 1 :(得分:1)
我会考虑:
m = g.E.has('label','like').groupBy{it.inV.next()}{1}{it.sum()}.cap.next()
迭代所有边缘并按标签过滤,在每个inV
上分组"类似"边缘并向1
个结果添加Map
。这将带你到groupBy
的倒数第二次关闭。那时你将有Map
之类的:
[v1:[1,1,1]
v2:[1,1]]
它基本上是一个顶点,其中1表示每个"喜欢"边缘。回到上面的Gremlin,groupBy
的最后一个闭包是对Map
中的值进行的减少操作。在这种情况下,我们使用Groovy sum
函数(虽然我认为size
也可以在这里工作 - 但sum
似乎更容易阅读)以增加边数。最后,我们使用cap
从管道中提取Map
副作用,并将next
提取到var中。
我认为这里的缺点是它不会产生没有&#34的顶点的结果;比如"边缘。如果您需要,那么@Faber提供的解决方案是更好的方法。你甚至可以从这两种解决方案中挑选一些,以最终得到你想要的东西。
答案 2 :(得分:0)
无需副作用......
g.V().transform{[it, it.in('likes').count()]}