使用Gremlin / TitanDB执行聚合查询

时间:2013-11-28 12:37:40

标签: database graph gremlin titan

我有一个Titan图数据库,其中一组顶点由一条边连接,并带有一个名为“property1”的属性。

是否可以将Gremlin(或其他任何Titan支持的)查询写入:

Find all edges that have a value for "property1" that is seen 5 or less times.

在SQL中我会使用“Group By”,在MongoDB中我会使用其中一个聚合函数。

我认为这可能是Furnace / Faunus的工作?

1 个答案:

答案 0 :(得分:1)

您可以通过迭代所有边并使用groupBy来完成此操作。以下是使用weight代替property1的玩具图表的示例:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.E.groupBy{it.weight}{it}.cap.next()                         
==>0.5=[e[7][1-knows->2]]
==>1.0=[e[8][1-knows->4], e[10][4-created->5]]
==>0.4=[e[11][4-created->3], e[9][1-created->3]]
==>0.2=[e[12][6-created->3]]

这样就可以按照weight对所有边缘进行分组。从那里你可以下到标准的groovy函数,如findAll来过滤掉你不想要的东西(这里我过滤掉了>1边缘的权重...在你的情况下它会是<5)。

gremlin> g.E.groupBy{it.weight}{it}.cap.next().findAll{k,v->v.size()>1}
==>1.0=[e[8][1-knows->4], e[10][4-created->5]]
==>0.4=[e[11][4-created->3], e[9][1-created->3]]

显然,对于一个非常大的图形来说,这是一个非常昂贵的操作,因为你需要在边缘上进行大量的迭代,并且你必须在内存中建立一个Map,这可能很大,这取决于多样性property1中的值。如果您可以找到使用其他过滤器限制边缘迭代的方法,那可能会有所帮助。

如果你有一个非常大的图表,这对于Faunus来说是一个很好的工作。我将在这里简单回答,并简单地说,您不一定希望具有property1值的特定边缘发生少于5次,并且您只想知道不同{{1}的多少次}值出现。使用Faunus,你可以得到这样的分布:

property1