Я предлагаю вам также сортировать рекомендации по некоторому свойству, например. количество путей длины 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
Может быть, вы также должны думать о влиянии на результат запроса ориентированных краев дружбы без соответствующего края в противоположном направлении ...
С вашим подходом вам нужно будет сделать что-то вроде 'u1.out ('friend'). out ('friend') .dedup.filter {! u1.out ('friend'). toList() содержит (it) && it! = u1} ', что, конечно, крайне неэффективно. – Faber