[英]How do I write a sub-query?
我想检索所有顶点,并想为每个顶点计算指向它的“像”边的数量。
如何在Gremlin中编写此类查询?
在SQL中,可能类似于...。
SELECT *, (SELECT Count(*) FROM tbl_like l WHERE l.id = b.id) AS LikeCount
FROM tbl_blah b
例如,使用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
。第二个闭包中的a将当前输入值提供给groupCount
(这里是一个顶点),而it.b
将映射中输入对象的先前输入值提供给map。 尚未真正找到解释此问题的文档,也许TinkerPop的其中一位可以详细说明groupCount
闭包的确切用法。
我会考虑:
m = g.E.has('label','like').groupBy{it.inV.next()}{1}{it.sum()}.cap.next()
迭代所有边并按标签过滤,在每个“喜欢”边的inV
上分组, inV
结果Map
添加1
。 那将带您到groupBy
倒数第二个结束。 届时您将拥有一个类似于以下内容的Map
:
[v1:[1,1,1]
v2:[1,1]]
它基本上是一个顶点,每个顶点代表1个“相似”边缘。 回到上面的Gremlin,对groupBy
的最后关闭是对Map
的值进行的归约运算。 在这种情况下,我们使用Groovy sum
函数(尽管我想size
也可以在这里工作-但是sum
看起来更容易阅读)来增加边的数量。 最后,我们使用cap
从管道中提取Map
副作用, next
其提取到var中。
我想这里的缺点是,对于没有“相似”边缘的顶点,它不会产生结果。 如果需要,@ Faber提供的解决方案是更好的方法。 您甚至可以从两种解决方案中进行选择,最终找到您想要的。
不需要副作用...
g.V().transform{[it, it.in('likes').count()]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.