如何编写子查询?

时间:2014-11-04 12:02:00

标签: graph-databases gremlin titan

我想要检索所有顶点,并且对于每个顶点,我想计算指向它的“Like”边的数量。

如何在Gremlin中编写此类查询?

在SQL中它可能就像....

SELECT *, (SELECT Count(*) FROM tbl_like l WHERE l.id = b.id) AS LikeCount
FROM tbl_blah b

3 个答案:

答案 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()]}