2015-05-11 39 views
2

我使用TITAN 0.4和gremlin進行遍歷。 我的要求是在圖中標識重複的頂點,併合並它們。 圖中有> 15 M個頂點。Gremlin:GroupBy頂點,計數> 1

gremlin> g.V.has('domain').groupBy{it.domain}{it.id}.cap 

==>{google.com=[4], yahoo.com=[16, 24, 20]} 

我能夠對頂點進行分組,但我只需要那些不止一次存在的域(頂點)。

在上面的例子中,我只需要返回==>{yahoo.com=[16, 24, 20]} 關鍵的「域」被索引,如果這有什麼區別的話。

請幫我在這裏

回答

2

考慮使用groupCount而非groupBy來保存您收集名單計數IDS的步驟:

g.V.has('domain').groupCount(it.domain}.cap.next().findAll{it.value>1} 

我想這是更便宜,以及在更大的遍歷因爲你只是維護一個計數器而不是標識符列表。

+0

此解決方案以及在我的開發環境,但在生產中,我有10M +頂點,在此無法運行,引發異常如下: - 。 小鬼> gVhas(「IP_ADDRESS」)groupCount {it.ip_address} .cap.next()。findAll {it.value> 1} WARN com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx - 查詢需要迭代所有頂點[(ip_address <> null)]。爲了獲得更好的性能,請使用 –

+0

的索引,這不是一個例外 - 只是警告您正在迭代所有頂點。或許我懷疑你的異常是'OutOfMemoryException'?無論哪種方式,這就是查詢的本質 - 它必須迭代所有頂點以在其上查找「domain」屬性到「groupCount」。如果你必須這樣做,並且你的圖很大,那麼(1)在這個問題上拋出更多的內存,或者(2)使用titan-hadoop或者(3)以某種方式重構你的圖以允許使用索引。 –

+0

是的,我正在取消內存異常 分組步驟失敗,因爲TemporaryStorageException gremlin> gVhas('domain').groupCount {it.domain} .cap.next()。findAll {it.value> 1} WARN com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx - 查詢需要遍歷所有頂點[(domain <> null)]。爲了獲得更好的性能,請使用索引 引起的:com.thinkaurelius.titan.diskstorage.TemporaryStorageException:臨時存儲後端失敗 另外我在密鑰「域」中使用TITAN標準索引 g.makeKey(「domain」)。dataType( String.class).indexed(「standard」,Vertex.class).make(); –

0

老問題,但你有沒有嘗試下面強制索引?

g.V.hasNot('domain', null).groupBy{it.domain}{it.id}.cap