繁体   English   中英

如何编写子查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM