首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何输出Gremlin中相似之处的附加原因

如何输出Gremlin中相似之处的附加原因
EN

Stack Overflow用户
提问于 2015-03-05 13:57:32
回答 2查看 104关注 0票数 0

我有以下简单的图表:

用户-喜欢->项目

我正在使用以下Gremlin代码查找与用户u相似的前10名用户:

代码语言:javascript
复制
u.out('Likes').in('Likes').filter([u]).groupCount.cap.orderMap(T.decr)[0..10].map()

它输出的内容如下:

代码语言:javascript
复制
==>{userid=1}
==>{userid=5}
==>{userid=10}
==>{userid=15}

我希望输出内容更丰富,并与原始用户共享更多信息,如排序地图中的排名和项(itemid),如下所示:

代码语言:javascript
复制
==>{userid=1, rank=0, reason_items={1,2,3,5}}
==>{userid=5, rank=1, reason_items={1,2,10}}
==>{userid=10, rank=2, reason_items={1,2,4}}
==>{userid=15, rank=3, reason_items={1,2}}

一个高效的gremlin-groovy代码示例会很好!

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-05 14:56:04

通过在查询中附加适当的transform闭包:

代码语言:javascript
复制
rank = 0; itemsU1 = [] as Set; u1.out('Likes').aggregate(itemsU1).in('Likes')
      .filter{it != u1}.groupCount.cap.orderMap(T.decr)
      .transform{[id:it.id, rank:rank++, reason_item_ids:itemsU1.intersect(it.out('Likes').toSet()).collect{it.id}]}

…你可以获得:

代码语言:javascript
复制
==>{id=User6, rank=0, reason_item_ids=[Item1, Item5]}
==>{id=User4, rank=1, reason_item_ids=[Item1, Item2]}
==>{id=User2, rank=2, reason_item_ids=[Item1]}
==>{id=User5, rank=3, reason_item_ids=[Item5]}
==>{id=User3, rank=4, reason_item_ids=[Item2]}

对于以下示例图:

代码语言:javascript
复制
g = new TinkerGraph()

u1 = g.addVertex('User1')
u2 = g.addVertex('User2')
u3 = g.addVertex('User3')
u4 = g.addVertex('User4')
u5 = g.addVertex('User5')
u6 = g.addVertex('User6')

i1 = g.addVertex('Item1')
i2 = g.addVertex('Item2')
i3 = g.addVertex('Item3')
i4 = g.addVertex('Item4')
i5 = g.addVertex('Item5')

g.addEdge(u1,i1,'Likes')
g.addEdge(u1,i2,'Likes')
g.addEdge(u1,i5,'Likes')
g.addEdge(u2,i1,'Likes')
g.addEdge(u2,i4,'Likes')
g.addEdge(u3,i2,'Likes')
g.addEdge(u4,i1,'Likes')
g.addEdge(u4,i2,'Likes')
g.addEdge(u4,i3,'Likes')
g.addEdge(u5,i4,'Likes')
g.addEdge(u5,i5,'Likes')
g.addEdge(u6,i1,'Likes')
g.addEdge(u6,i4,'Likes')
g.addEdge(u6,i5,'Likes')
票数 1
EN

Stack Overflow用户

发布于 2015-03-05 23:48:04

给定Faber的示例图,您可以这样做:

代码语言:javascript
复制
u = u1; m = [:].withDefault {[]}; rank = 0; key = null
u.out('Likes').as('item').in('Likes').except([u]).as('user').select().groupBy {
  key = it.getColumn('user')
} {
  m[key] << it.getColumn('item').id
} {
  it.size()
}.cap().orderMap(T.decr)[0..10].transform {[
  'userid'         : it.id,
  'rank'           : rank++,
  'reason_item_ids': m[it]
]}

不需要在.transform()中嵌套遍历。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28879543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档