2015-05-11 3 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 сохранить шаг подсчитывая идентификаторов в вашем собираемой списке:

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

Я полагаю, что это дешевле, а на большем обходе поскольку вы просто поддерживаете счетчик, а не списки идентификаторов.

+0

Это решение хорошо работает в моем Dev среде, но и в производстве, у меня есть 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

Да, я получаю исключение outofmemory сбой в группировке из-за 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 Index в ключевом «домене» g.makeKey («domain»). DataType (String.class). Indexed ("standard", Vertex.class) .make(); –

0

Старый вопрос, но вы попробовали ниже, чтобы заставить индекс?

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

 Смежные вопросы

  • Нет связанных вопросов^_^