如何在 Gremlin 中推荐新朋友
How to suggest new friends in Gremlin
我有一个 orientdb 图形数据库设置,其中 User 为顶点,Friend 为边。
2 如果用户之间有 2 个边,则他们是朋友:
u1 --Friend --> u2 and u2 -- Friend --> u1
我如何使用 Gremlin 向 u1 推荐朋友的朋友,并确保这些人不是 u1 的当前朋友,只有一个 Gremlin 函数链?
到目前为止,这是我的 Gremlin 代码,但我想过滤掉已经与 u1 成为朋友的顶点:
u1.out('Friend').out('Friend').dedup()
我试过了,但似乎不起作用:
u1.out('Friend').out('Friend').dedup().filter{ it!= u1.out('Friend')}
感谢您的帮助:)。
我建议您也按一些 属性 对推荐进行排序,例如从起始用户到推荐用户的长度为 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
也许你还需要考虑一下,没有对应的反方向的边,有向友情边对查询结果的影响...
我有一个 orientdb 图形数据库设置,其中 User 为顶点,Friend 为边。
2 如果用户之间有 2 个边,则他们是朋友:
u1 --Friend --> u2 and u2 -- Friend --> u1
我如何使用 Gremlin 向 u1 推荐朋友的朋友,并确保这些人不是 u1 的当前朋友,只有一个 Gremlin 函数链?
到目前为止,这是我的 Gremlin 代码,但我想过滤掉已经与 u1 成为朋友的顶点:
u1.out('Friend').out('Friend').dedup()
我试过了,但似乎不起作用:
u1.out('Friend').out('Friend').dedup().filter{ it!= u1.out('Friend')}
感谢您的帮助:)。
我建议您也按一些 属性 对推荐进行排序,例如从起始用户到推荐用户的长度为 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
也许你还需要考虑一下,没有对应的反方向的边,有向友情边对查询结果的影响...