2013-11-28 56 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()