【问题标题】:How to suggest new friends in Gremlin如何在 Gremlin 中推荐新朋友
【发布时间】:2015-02-19 15:08:35
【问题描述】:

我有一个 orientdb 图形数据库设置,用户作为顶点,朋友作为边。

如果两个用户彼此有 2 条边,则他们是朋友:

u1 --朋友 --> u2 和 u2 -- 朋友 --> u1

我如何使用 Gremlin 向 u1 推荐朋友的朋友,并确保这些人不是 u1 的当前朋友,具有单个 Gremlin 函数链?

到目前为止,这是我的 Gremlin 代码,但我想过滤掉已经与 u1 成为朋友的顶点:

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

我试过了,但似乎没有用:

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

感谢您的帮助:)。

【问题讨论】:

  • 使用您的方法,您需要执行u1.out('friend').out('friend').dedup.filter{ !u1.out('friend').toList().contains(it) && it != u1} 之类的操作,这当然是非常低效的。

标签: graph gremlin


【解决方案1】:

我建议您也按某些属性对推荐进行排序,例如从起始用户到推荐用户的长度为 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

也许你还需要考虑有向友谊边没有相反方向的对应边对查询结果的影响……

【讨论】:

  • 感谢您的回答。这正是我需要的。 :) 干杯
猜你喜欢
  • 2011-05-05
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多