Loading

图数据库入门教程(十二)坐过哪些站-path

一、path(路径)

查询西单相邻的站点

g.V().has("station","name","西单").outE().inV()

//输出
[v[303144], v[315560], v[348168], v[819280]]

image-20220829134746228

我们想知道西单到这些站点走的路径是什么?

g.V().has("station","name","西单").outE().inV().path()

//输出
[
  path[v[323672], e[7si3-6xqw-74l-6hwo][323672-route->303144], v[303144]], 
 	path[v[323672], e[7swb-6xqw-74l-6rhk][323672-route->315560], v[315560]], 
 	path[v[323672], e[7nrf-6xqw-74l-7gnc][323672-route->348168], v[348168]], 
 	path[v[323672], e[7nd7-6xqw-74l-hk5s][323672-route->819280], v[819280]]
]

输出结果是4个path,拿第一个path来说

  • v[323672]:西单
  • e[7si3-6xqw-74l-6hwo][323672-route->303144]:边,西单到灵境胡同之间的边
  • v[303144]:灵境胡同

再看看这个输出,可能不是我们想要的,它太复杂,假设我们想要的只是:

出发顶点的code属性,边的dist(距离)属性,目标顶点的code属性,怎么写呢?

g.V().has("station","name","西单").outE().inV().path().by('name').by('dist').by('name')

//输出
[
  path[西单, 1011, 灵境胡同], 
  path[西单, 815, 宣武门], 
  path[西单, 1217, 天安门西], 
  path[西单, 1596, 复兴门]
]

可以看到by的作用是指定每个元素提取的属性。

我们都知道对于要获取目标顶点,outE().inV() = out(),如果我们把上面的语句换成out会怎样呢?

g.V().has("station","name","西单").out().path().by('name').by('name')

//输出
[
  path[西单, 灵境胡同], 
  path[西单, 宣武门], 
  path[西单, 天安门西], 
  path[西单, 复兴门]
]

由于直接写了out,因此path中就没有了边信息。

也可以这样写

g.V().has("station","name","西单").out().path().by('name')

在获取每个元素属性的时候,如果没有对应的by,会从头所有的by遍历一遍,取到值停止,比如我们知道第一个path有两个元素[path[v[323672], v[303144]],但是没有给第二个元素指定by,那么它会开始遍历所有的by,正好有且只有一个by并且name能取到值,但是,一般建议还是把by写全。

有时,我们想获取到元素本身,而不是元素的一个属性,那么直接使用by()就可以

g.V().has("station","name","西单").out().values("lineno").path().by("name").by('name').by()

//输出
[
    {
        "path": [
            "西单",
            "灵境胡同",
            "4"
        ]
    },
    {
        "path": [
            "西单",
            "宣武门",
            "4,2"
        ]
    },
    {
        "path": [
            "西单",
            "天安门西",
            "1"
        ]
    },
    {
        "path": [
            "西单",
            "复兴门",
            "1,2"
        ]
    }
]

二、路径选取

首先看下下面的查询

g.V().has("station","name","西单").out().out().simplePath().path().by('name')

//输出
[
  path[西单, 灵境胡同, 西四], 
  path[西单, 宣武门, 和平门], 
  path[西单, 宣武门, 长椿街], 
  path[西单, 宣武门, 菜市口], 
  path[西单, 天安门西, 天安门东], 
  path[西单, 复兴门, 长椿街], 
  path[西单, 复兴门, 南礼士路], 
  path[西单, 复兴门, 阜成门]
]

对于这个结果,我们知道我们是从西单出发的,我们不想看到西单这一项行不行?

g.V().has("station","name","西单").out().as('a').out().simplePath().as('b').path().by('name').from("a").to("b")

//输出
[
  path[灵境胡同, 西四], 
  path[宣武门, 和平门], 
  path[宣武门, 长椿街], 
  path[宣武门, 菜市口], 
  path[天安门西, 天安门东], 
  path[复兴门, 长椿街], 
  path[复兴门, 南礼士路], 
  path[复兴门, 阜成门]
]

我们也可以把to去掉

g.V().has("station","name","西单").out().as('a').out().simplePath().path().by('name').from("a")

//输出
[
  path[灵境胡同, 西四], 
  path[宣武门, 和平门], 
  path[宣武门, 长椿街], 
  path[宣武门, 菜市口], 
  path[天安门西, 天安门东], 
  path[复兴门, 长椿街], 
  path[复兴门, 南礼士路], 
  path[复兴门, 阜成门]
]

我们还可以用from to截取中间部分的路径

g.V().has("station","name","西单").out().as('a').out().simplePath().as('b').out().simplePath().path().by('name')

//输出
[
  path[西单, 灵境胡同, 西四, 平安里], 
  path[西单, 宣武门, 和平门, 前门], 
  path[西单, 宣武门, 长椿街, 复兴门], 
  path[西单, 宣武门, 菜市口, 陶然亭], 
  path[西单, 宣武门, 菜市口, 虎坊桥], 
  path[西单, 宣武门, 菜市口, 广安门内], 
  path[西单, 天安门西, 天安门东, 王府井], 
  path[西单, 复兴门, 长椿街, 宣武门], 
  path[西单, 复兴门, 南礼士路, 木樨地], 
  path[西单, 复兴门, 阜成门, 车公庄]
]

修改语句如下

g.V().has("station","name","西单").out().as('a').out().simplePath().as('b').out().simplePath().path().by('name').from('a').to('b')

//输出
[
  path[灵境胡同, 西四], 
  path[宣武门, 和平门], 
  path[宣武门, 长椿街], 
  path[宣武门, 菜市口], 
  path[宣武门, 菜市口], 
  path[宣武门, 菜市口], 
  path[天安门西, 天安门东], 
  path[复兴门, 长椿街], 
  path[复兴门, 南礼士路], 
  path[复兴门, 阜成门]
]
posted @ 2022-08-29 14:16  树先生1024  阅读(158)  评论(0编辑  收藏  举报