如何在JanusGraph中用系数求和权重?

时间:2017-08-28 08:34:34

标签: graph gremlin janusgraph

我们有下面的图表。

gremlin>g.V().has('name','alice').repeat(outE().has('tag','ruby').inV()).times(3).emit().group().by('name').by(path().unfold().has('value').values('value').fold()).next()
==>bobby=[9]
==>cindy=[8, 9, 8]
==>david=[8, 7, 9, 8, 7]

在脚本下方,我们可以获得所有路径的权重。

gremlin>g.V().has('name','alice').repeat(outE().has('tag','ruby').inV()).times(3).emit().group().by('name').by(path().unfold().has('value').values('value').sum()).next()
==>bobby=9 sum[9]
==>cindy=25 sum[8, 9, 8]
==>david=39 sum[8, 7, 9, 8, 7]

下面我们可以总结所有路径的权重。

==>bobby=[9] = 9*1
==>cindy=[8, 9, 8] = 8*1 + 9*0.5 + 8*0.25 
==>david=[8, 7, 9, 8, 7] = 8*1 + 7*0.5 + 9*0.25 + 8*0.125 + 7*0.0625

我的问题是如何用系数求和权重? 如下所示

type message struct {
    Data string `json:"data"`
}

func test(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    data := // Retrieve message that contain backslash
    json.NewEncoder(w).Encode(message{Data: data})
}

另一个请求是系数是否来自edge property co?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

尽可能防止lambda。

gremlin> g.withSack(1.0).V().has("name","alice").
           repeat(outE("rates").has("tag","ruby").
                  project("a","b","c").
                    by(inV()).
                    by(sack()).
                    by("value").as("x").
                  select("a").
                  sack(mult).by(constant(0.5))).
              times(3).emit().
            select(all, "x").
            project("name","score").
              by(tail(local, 1).select("a").values("name")).
              by(unfold().
                 sack(assign).by(select("b")).
                 sack(mult).by(select("c")).
                 sack().sum())
==>[name:bobby,score:9.0]
==>[name:cindy,score:13.00]
==>[name:david,score:14.750]

此查询返回的结果与您提供的示例略有不同,但这只是因为您的查询显示的结果不是使用提供的示例图生成的。

答案 1 :(得分:1)

您可以执行类似g.V().has('name','alice').repeat(outE().has('tag','ruby').inV()).times(3).emit().group().by('name').by(path().unfold().has('value').values('value').fold()).next().collect{k, v -> v.withIndex().collect {Integer it, Integer idx -> return it * (1/(idx + 1))}.inject(0.0) {acc,i -> acc+i}}的操作。不要忘记,您也在使用groovy编程语言,因此您可以访问这些功能。