2013-11-28 44 views
1

我有一个Titan图形数据库,其顶点由一个名为“property1”的属性连接起来。使用Gremlin/TitanDB执行聚合查询

是否可以查询写一个小鬼(或其他任何泰坦将支持),以:

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

在SQL我会使用“分组依据”,MongoDB中我会使用的聚合函数之一。

我在想这可能是Furnace/Faunus的工作?

回答

1

您可以通过迭代所有边缘并使用groupBy来完成此操作。下面是与地方使用weightproperty1玩具图为例:

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所有边缘。从那里你可以下降到标准的常规功能,如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次,并且你只想知道不同property1值出现的次数。通过Faunus,你可以得到如下发行版:

g.E.property1.groupCount()