美文网首页
gremlin语言介绍八:path查询

gremlin语言介绍八:path查询

作者: 生饼 | 来源:发表于2020-07-05 03:14 被阅读0次

0 打开一个新的图库

本节的命令使用的测试数据是tinkerpop官方提供的Modern图库,使用以下命令可以加载tinkerpop modern图库,它包含6个vertex和6条edge

$ ./bin/gremlin.sh
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin>
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
image.png

1 path

gremlin遍历图时,会经过一系列的vertex和edge,遍历的轨迹形成一条路径,path()则按遍历的顺序返回经过的vertex和edge

下面的查询有两条path,一条经过vertex 1、4、5,节点5的name值为ripple

gremlin> g.V().out().out().values('name').path()
==>[v[1],v[4],v[5],ripple]
==>[v[1],v[4],v[3],lop]

path中如果要返回边,则需要显式的加上遍历edge的step,如下:

gremlin> g.V().outE().inV().outE().inV().path()
==>[v[1],e[8][1-knows->4],v[4],e[10][4-created->5],v[5]]
==>[v[1],e[8][1-knows->4],v[4],e[11][4-created->3],v[3]]

可以通过by()选择path中vertex和edge返回的内容。
下面的查询语句,path中的第一个元素返回它的name值,第二个元素返回它的age值,第三个元素返回它的name,如此递推

gremlin> g.V().out().out().path().by('name').by('age')
==>[marko,32,ripple]
==>[marko,32,lop]

2 simplePath

查询简单路径,过滤掉环路

gremlin> g.V(1).both().both().simplePath().path()
==>[v[1],v[3],v[4]]
==>[v[1],v[3],v[6]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]

3 cyclicPath

查询环路

gremlin> g.V(1).both().both().cyclicPath().path()
==>[v[1],v[3],v[1]]
==>[v[1],v[2],v[1]]
==>[v[1],v[4],v[1]]

4 shortestPath

查询最短无环路径。。注意最短路径计算是OLAP类型的遍历,需要GraphComputer的支持,所有需要使用withComputer()配置遍历

所有vertex对之间的最短路径

gremlin> g.withComputer().V().shortestPath()
==>[v[1],v[2]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4]]
==>[v[1]]
==>[v[1],v[3]]
==>[v[1],v[3],v[6]]
==>[v[2]]
==>[v[2],v[1],v[4],v[5]]
==>[v[2],v[1],v[4]]
==>[v[2],v[1]]
==>[v[2],v[1],v[3]]
==>[v[2],v[1],v[3],v[6]]
==>[v[3],v[1],v[2]]
==>[v[3],v[4],v[5]]
==>[v[3],v[4]]
==>[v[3],v[1]]
==>[v[3]]
==>[v[3],v[6]]
==>[v[4],v[1],v[2]]
==>[v[4],v[5]]
==>[v[4]]
==>[v[4],v[1]]
==>[v[4],v[3]]
==>[v[4],v[3],v[6]]
==>[v[5],v[4],v[1],v[2]]
==>[v[5]]
==>[v[5],v[4]]
==>[v[5],v[4],v[1]]
==>[v[5],v[4],v[3]]
==>[v[5],v[4],v[3],v[6]]
==>[v[6],v[3],v[1],v[2]]
==>[v[6],v[3],v[4],v[5]]
==>[v[6],v[3],v[4]]
==>[v[6],v[3],v[1]]
==>[v[6],v[3]]
==>[v[6]]

指定起点,起点到所有vertex的最短路径

gremlin> g.withComputer().V().has('person','name','marko').shortestPath() 
==>[v[1]]
==>[v[1],v[2]]
==>[v[1],v[4]]
==>[v[1],v[4],v[5]]
==>[v[1],v[3],v[6]]
==>[v[1],v[3]]

指定终点,所有vertex到终点最短路径

gremlin> g.withComputer().V().shortestPath().with(ShortestPath.target, __.has('name','peter')) 
==>[v[1],v[3],v[6]]
==>[v[2],v[1],v[3],v[6]]
==>[v[4],v[3],v[6]]
==>[v[3],v[6]]
==>[v[5],v[4],v[3],v[6]]
==>[v[6]]

指定起点和终点,两点间的最短路径

gremlin> g.withComputer().V().has('person','name','marko').
               shortestPath().
                 with(ShortestPath.target, __.has('name','josh')) 
==>[v[1],v[4]]

加权最短路径,通过with(ShortestPath.distance, 'weight')指定表示权重的property name

gremlin> g.withComputer().V().has('person','name','marko').
               shortestPath().
                 with(ShortestPath.target, __.has('name','josh')).
                 with(ShortestPath.distance, 'weight') 
==>[v[1],v[3],v[4]]

指定计算最短路径时,起点到终点的edge的方向

gremlin> g.withComputer().V().shortestPath().
                 with(ShortestPath.edges, Direction.IN).
                 with(ShortestPath.target, __.has('name','josh')) 
==>[v[3],v[4]]
==>[v[4]]
==>[v[5],v[4]]

返回的路径中包含edge

gremlin> g.withComputer().V().has('person','name','marko').
               shortestPath().
                 with(ShortestPath.target, __.has('name','josh')).
                 with(ShortestPath.includeEdges, true) //7\
==>[v[1],e[8][1-knows->4],v[4]]

5 tree

以树形的结构形式输出遍历过的路径。形式上类似于深度优先树

gremlin> g.V(1).out().out().tree().by('name')
==>[marko:[josh:[ripple:[],lop:[]]]]

相关文章

网友评论

      本文标题:gremlin语言介绍八:path查询

      本文链接:https://www.haomeiwen.com/subject/omemqktx.html