查询路径Path

在使用Gremlin对图进行分析时,关注点有时并不仅仅在最终到达的顶点、边或者属性上,通过什么样的路径到达最终的顶点、边和属性同样重要,此时可以借助path()来获取经过的路径信息。

path()返回当前遍历过的所有路径。有时需要对路径进行过滤,只选择没有环路的路径或者选择包含环路的路径,Gremlin针对这种需求提供了两种过滤路径的step:simplePath()cyclicPath()

path()

Step path():获取当前遍历过的所有路径

示例:

  1. // 顶点"2:HugeGraph" 到关联顶点的路径
  2. // 返回的路径结果只包含顶点信息
  3. // [{"2:HugeGraph", "2:TinkerPop"}, {"2:HugeGraph", "3:Gremlin"}......]
  4. g.V('2:HugeGraph').both().path()
  5. // 顶点"2:HugeGraph"到邻接边的路径
  6. // 返回路径包含"2HugeGraph"顶点和邻接边信息
  7. // [{"2:HugeGraph", "S2:HugeGraph>5>>S2:TinkerPop"}, ........]
  8. g.V("2:HugeGraph").bothE().path()
  9. // 顶点"2:HugeGraph"到关联顶点的路径
  10. // 返回的路径结果包含顶点、邻接边信息、关联顶点
  11. // [{"2:HugeGraph", "S2:HugeGraph>5>>S2:TinkerPop", "2:TinkerPop"}, ......]
  12. 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属性代表C
  • by(X).by(Y).by(Z)表示:用A的X属性代表A,用B的Y属性代表B,用C的Z属性代表C

示例:

  1. // 顶点"2:HugeGraph"到关联顶点的路径
  2. // 返回的路径结果包含顶点、邻接边信息、关联顶点
  3. // 使用顶点的name属性代表顶点,使用邻接边的weight属性代表邻接边,使用关联顶点的name属性代表关联顶点
  4. // 输出的结果为:
  5. // [{"HugeGraph", 1, "TinkerPop"}, ........]
  6. g.V('2:HugeGraph').bothE().otherV().path().by('name').by('weight')

有环路径和无环路径

有环路径是指路径中至少有一个对象出现的次数大于等于两次。

无环路径是指路径中所有的对象只出现一次。

path()会返回所有路径,包括有环路径和无环路径,例如:

  1. // 返回的结果中存在有环路径:[{"2:HugeGraph", "2:TinkerPop", "2:HugeGraph"},......]
  2. g.V('2:HugeGraph').both().both().path()

simplePath()

Step simplePath():过滤掉路径中含有环路的对象,只保留路径中不含有环路的对象

示例:

  1. // 去掉有环路径
  2. g.V("2:HugeGraph").both().both().simplePath().path()

cyclicPath()

Step cyclicPath():过滤掉路径中的无环路径对象,只保留有环路径

示例:

  1. // 只显示有环路径
  2. g.V('2:HugeGraph').both().both().cyclicPath().path()