查询路径Path
在使用Gremlin对图进行分析时,关注点有时并不仅仅在最终到达的顶点、边或者属性上,通过什么样的路径到达最终的顶点、边和属性同样重要,此时可以借助path()
来获取经过的路径信息。
path()
返回当前遍历过的所有路径。有时需要对路径进行过滤,只选择没有环路的路径或者选择包含环路的路径,Gremlin针对这种需求提供了两种过滤路径的step:simplePath()
、cyclicPath()
path()
Step path()
:获取当前遍历过的所有路径
示例:
// 顶点"2:HugeGraph" 到关联顶点的路径
// 返回的路径结果只包含顶点信息
// [{"2:HugeGraph", "2:TinkerPop"}, {"2:HugeGraph", "3:Gremlin"}......]
g.V('2:HugeGraph').both().path()
// 顶点"2:HugeGraph"到邻接边的路径
// 返回路径包含"2HugeGraph"顶点和邻接边信息
// [{"2:HugeGraph", "S2:HugeGraph>5>>S2:TinkerPop"}, ........]
g.V("2:HugeGraph").bothE().path()
// 顶点"2:HugeGraph"到关联顶点的路径
// 返回的路径结果包含顶点、邻接边信息、关联顶点
// [{"2:HugeGraph", "S2:HugeGraph>5>>S2:TinkerPop", "2:TinkerPop"}, ......]
g.V("2:HugeGraph").bothE().otherV().path()
by()
Step by()
:输出路径的时候,通过by(property)
语句可以指定对象的某个属性代替对象,且连续的多个by()
是循环应用到路径中的对象。
例如路径中有3个对象[A, B, C]:
by(X)
表示:用A的X属性代表A,用B的X属性代表B,用C的X属性代表C。by(X).by(Y)
表示:用A的X属性代表A,用B的Y属性代表B,用C的X属性代表Cby(X).by(Y).by(Z)
表示:用A的X属性代表A,用B的Y属性代表B,用C的Z属性代表C
示例:
// 顶点"2:HugeGraph"到关联顶点的路径
// 返回的路径结果包含顶点、邻接边信息、关联顶点
// 使用顶点的name属性代表顶点,使用邻接边的weight属性代表邻接边,使用关联顶点的name属性代表关联顶点
// 输出的结果为:
// [{"HugeGraph", 1, "TinkerPop"}, ........]
g.V('2:HugeGraph').bothE().otherV().path().by('name').by('weight')
有环路径和无环路径
有环路径是指路径中至少有一个对象出现的次数大于等于两次。
无环路径是指路径中所有的对象只出现一次。
path()
会返回所有路径,包括有环路径和无环路径,例如:
// 返回的结果中存在有环路径:[{"2:HugeGraph", "2:TinkerPop", "2:HugeGraph"},......]
g.V('2:HugeGraph').both().both().path()
simplePath()
Step simplePath()
:过滤掉路径中含有环路的对象,只保留路径中不含有环路的对象
示例:
// 去掉有环路径
g.V("2:HugeGraph").both().both().simplePath().path()
cyclicPath()
Step cyclicPath()
:过滤掉路径中的无环路径对象,只保留有环路径
示例:
// 只显示有环路径
g.V('2:HugeGraph').both().both().cyclicPath().path()