2013-11-28 2 views
1

У меня есть база данных диаграмм Титана с набором вершин, связанных реброю с свойством с именем «property1».Выполнение запросов агрегирования с использованием Gremlin/TitanDB

Можно ли написать Gremlin (или что-нибудь еще Titan будет поддерживать) запрос:

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

В SQL Я хотел бы использовать «Group By», в MongoDB Я хотел бы использовать один из агрегатных функций.

Я думаю, что это может быть работа для печи/Faunus?

ответ

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 раз, и что вы просто хотите узнать, сколько раз разные значения property1. С Faunus вы можете получить такой дистрибутив:

g.E.property1.groupCount() 
Смежные вопросы