2015-02-19 3 views
1

У меня есть настройка базы данных ориентированного графика с пользователем как вершина, а Friend - как край.Как предложить новых друзей в Gremlin

2 пользователей являются друзьями, если у них есть 2 ребра друг с другом:

u1 --Friend -> u2 и u2 - Друг -> u1

Как я могу предложить друг друзей u1 с Гремлином и убедиться, что эти люди не являются текущими друзьями u1, с одной цепочкой функций Гремлина?

Вот мой Gremlin код до сих пор, но я хочу, чтобы отфильтровать вершины уже подружился с u1:

u1.out('Friend').out('Friend').dedup()

Я попытался это, но не похоже на работу:

u1.out('Friend').out('Friend').dedup().filter{ it!= u1.out('Friend')}

Благодарим за помощь :).

+0

С вашим подходом вам нужно будет сделать что-то вроде 'u1.out ('friend'). out ('friend') .dedup.filter {! u1.out ('friend'). toList() содержит (it) && it! = u1} ', что, конечно, крайне неэффективно. – Faber

ответ

3

Я предлагаю вам также сортировать рекомендации по некоторому свойству, например. количество путей длины 2 от начального пользователя до рекомендуемого пользователя и, следовательно, применять базовую совместную фильтрацию, как предлагается на gremlin github home page.

Применительно к вашей проблеме мы могли бы написать:

m = [:]; known = [u1]; u1.out('friend').aggregate(known).out('friend').except(known).groupCount(m) 
m = m.sort{-it.value} 

Это дает вам карту m упорядоченным по убыванию по значениям, которые являются числом различных путей длиной 2 и вершин пользователей рекомендуют в качестве друзей пользователь u1 как ключи.

Далее пример:

g = new TinkerGraph() 
u1 = g.addVertex('u1') 
u2 = g.addVertex('u2') 
u3 = g.addVertex('u3') 
u4 = g.addVertex('u4') 
u5 = g.addVertex('u5') 

g.addEdge(u1,u2,'friend') 
g.addEdge(u2,u1,'friend') 
g.addEdge(u2,u3,'friend') 
g.addEdge(u3,u2,'friend') 
g.addEdge(u1,u5,'friend') 
g.addEdge(u5,u1,'friend') 
g.addEdge(u5,u4,'friend') 
g.addEdge(u4,u5,'friend') 
g.addEdge(u2,u4,'friend') 
g.addEdge(u4,u2,'friend') 
g.addEdge(u5,u2,'friend') 
g.addEdge(u2,u5,'friend') 

Содержание карты после предлагаемого запроса для пользователя u1 является:

gremlin> m 
==>v[u4]=2 
==>v[u3]=1 

Может быть, вы также должны думать о влиянии на результат запроса ориентированных краев дружбы без соответствующего края в противоположном направлении ...

+0

спасибо за ваш ответ. Это именно то, что мне нужно. :) приветствие – riflehawk

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