图数据库入门教程(十二)坐过哪些站-path
一、path(路径)
查询西单相邻的站点
g.V().has("station","name","西单").outE().inV()
//输出
[v[303144], v[315560], v[348168], v[819280]]
我们想知道西单到这些站点走的路径是什么?
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[复兴门, 阜成门]
]