Gremlin Neptune 根据共同评分计数查询相似用户

Gremlin Neptune query similar users based on common ratings count

来自 Tickerpop 食谱中的下图:

  g.addV("user").property("name", "alice").as("u1").
  addV("user").property("name", "jen").as("u2").
  addV("user").property("name", "dave").as("u3").
  addV("movie").property("name", "the wild bunch").as("m1").
  addV("movie").property("name", "young guns").as("m2").
  addV("movie").property("name", "unforgiven").as("m3").
  addE("friend").from("u1").to("u2").
  addE("friend").from("u1").to("u3").
  addE("like").from("u2").to("m1").
  addE("like").from("u2").to("m2").
  addE("like").from("u3").to("m2").
  addE("like").from("u3").to("m3")

如何查询特定用户的朋友喜欢的电影数量从大到小?谢谢

我在图中添加了更多的边以使结果更有趣。

  g.addV("user").property("name", "alice").as("u1").
  addV("user").property("name", "jen").as("u2").
  addV("user").property("name", "dave").as("u3").
  addV("movie").property("name", "the wild bunch").as("m1").
  addV("movie").property("name", "young guns").as("m2").
  addV("movie").property("name", "unforgiven").as("m3").
  addE("friend").from("u1").to("u2").
  addE("friend").from("u1").to("u3").
  addE("friend").from("u2").to("u3").
  addE("friend").from("u2").to("u1").
  addE("like").from("u2").to("m1").
  addE("like").from("u2").to("m2").
  addE("like").from("u3").to("m2").
  addE("like").from("u3").to("m3").
  addE("like").from("u1").to("m1").
  addE("like").from("u1").to("m2")  

然后我们可以,例如,找到 Jen 并收集 Jen 喜欢的电影,然后找到 Jen 的朋友并计算他们共同喜欢的电影数量。

gremlin> g.V().
......1>   has('name','jen').as('jen').
......2>   sideEffect(out('like').store('movies')).
......3>   out('friend').
......4>   group().
......5>     by("name").
......6>     by(out('like').where(within('movies')).count())    


==>[dave:1,alice:2]    

您还可以更进一步,按升序或降序对结果进行排序。

gremlin> g.V().
......1>   has('name','jen').as('jen').
......2>   sideEffect(out('like').store('movies')).
......3>   out('friend').
......4>   group().
......5>     by("name").
......6>     by(out('like').where(within('movies')).count()).
......7>     order(local).
......8>       by(values,desc)  

==>[alice:2,dave:1]     

已更新 添加一个示例,其中其他信息是结果的一部分。

gremlin> g.V().
......1>   has('name','jen').as('jen').
......2>   sideEffect(out('like').store('movies')).
......3>   out('friend').
......4>   group().
......5>     by(valueMap(true)).
......6>     by(out('like').where(within('movies')).count()).
......7>     order(local).
......8>     by(values,asc)    

==>[[id:61353,label:user,name:[dave]]:1,[id:61349,label:user,name:[alice]]:2] 

从结果中忽略计数

gremlin> g.V().
......1>   has('name','jen').as('jen').
......2>   sideEffect(out('like').store('movies')).
......3>   out('friend').
......4>   group().
......5>     by(valueMap(true)).
......6>     by(out('like').where(within('movies')).count()).
......7>     order(local).
......8>     by(values,asc).
......9>   select(keys)  

==>[[id:61353,label:user,name:[dave]],[id:61349,label:user,name:[alice]]]