Loading

图数据库入门教程(十一)local

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

image-20220829133820508

我们要按照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
}
posted @ 2022-08-29 13:44  树先生1024  阅读(221)  评论(0编辑  收藏  举报