我有一个orientdb图数据库设置,其中User为顶点,Friend为edge。
2如果用户彼此有2条边,则他们是朋友:
u1 - 朋友 - > u2和u2 - 朋友 - > U1
我如何向Gremlin推荐朋友的朋友,并确保这些人不是u1的现任朋友,只有一个Gremlin函数链?
到目前为止,这是我的Gremlin代码,但我想用u1过滤掉已经是朋友的顶点:
u1.out('Friend').out('Friend').dedup()
我试过这个但似乎不起作用:
u1.out('Friend').out('Friend').dedup().filter{ it!= u1.out('Friend')}
感谢您的帮助:)。
答案 0 :(得分: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
也许您还需要考虑对定向友谊边缘的查询结果的影响而没有相反方向的相应边缘...