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:[]]]]
网友评论