local的用法
求地铁站直接连接地铁站数量的平均数,一般一个地铁站联通着两个站,上一站下一站,但是如果是换乘车站,连接数量可能多一些
g.V().has("station","name","农大南路").out().count()
//输出
[2]
g.V().has("station","name","西二旗").out().count()
//输出
[3]
gremlin的mean是用来算平均值的
g.V().hasLabel('station').out('route').count().mean()
//输出
[792.0]
这个结果是我们想要的吗?明显不是。为什么会出现这结果呢?因为我们在这个语句中,执行到count后,的结果就是792,我们对792求平均数相当于792/1,自然得到错误的结果。我们调整下语句
g.V().hasLabel('station').local(out('route').count()).mean()
//输出
[2.2564102564102564]
这个结果似乎是我们想要的。下面的查询删除了mean步骤,显示了此查询运行时遍历期间发生的情况。我用limit输出了几行
g.V().hasLabel('station').local(out('route').count()).limit(10)
//输出
[1, 2, 2, 2, 2, 2, 2, 2, 4, 3]
可以看到,我们得到的是一个几个,集合中是每个地铁站直达的地铁站的数量。当我们将mean应用于这个集合时,就是对这个集合求平均值。
从上可以看出,对于local()中包含的操作,是应用于local前的每个元素,并将结果应用到一个集合中。
通过local排序
我们来查询一西单直达地铁站,对结果进行排序,排序规则为该站能够直达的地铁站的数量
g.V().has("station","name","西单").out().group().by('name').by(out().count()).next()
//输出
{
"宣武门": 4,
"灵境胡同": 2,
"天安门西": 2,
"复兴门": 4
}
group 聚合后得到的结果是一个map
我们要按照values排序得到的结果是我们想要的吗?
g.V().has("station","name","西单").out().group().by('name').by(out().count()).order().by(values,desc).next()
//输出
{
"宣武门": 4,
"灵境胡同": 2,
"天安门西": 2,
"复兴门": 4
}
答案是否定的,把语句改下
g.V().has("station","name","西单").out().group().by('name').by(out().count()).order(local).by(values,desc).next
//输出
{
"宣武门": 4,
"复兴门": 4,
"灵境胡同": 2,
"天安门西": 2
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/282936.html