首页 > 解决方案 > 如何知道在gremlin中从一个顶点遍历到另一个顶点时遇到的顶点数

问题描述

在此处输入图像描述

在上图中,我们可以看到,我可以从节点12遍历到节点5,但是从1遍历时只遇到一个顶点,即3,但对于两个它是54

如何编写一个 gremlin 查询,它将返回遇到的顶点数。

标签: graph-theorygremlintinkerpop3

解决方案


在询问有关 Gremlin 的问题时,一张图片可能会有所帮助,但更重要的是提供一个 Gremlin 脚本来创建一些示例数据 - 如下所示:

g.addV().property(id,1).as('1').
  addV().property(id,2).as('2').
  addV().property(id,3).as('3').
  addV().property(id,4).as('4').
  addV().property(id,5).as('5').
  addE('link').from('1').to('3').
  addE('link').from('2').to('3').
  addE('link').from('2').to('4').
  addE('link').from('3').to('5').
  addE('link').from('4').to('5').iterate()

在回答您的问题时,我认为您只需要使用path()step 来显示 Gremlin 遍历的位置:

gremlin> g.V().repeat(out()).emit().path()
==>[v[1],v[3]]
==>[v[1],v[3],v[5]]
==>[v[2],v[3]]
==>[v[2],v[4]]
==>[v[2],v[3],v[5]]
==>[v[2],v[4],v[5]]
==>[v[3],v[5]]
==>[v[4],v[5]]

如果您只对顶点 1/2 和 5 之间的路径感兴趣,那么您可以添加一些限制:

gremlin> g.V(1,2).repeat(out()).emit(hasId(5)).path()
==>[v[1],v[3],v[5]]
==>[v[2],v[3],v[5]]
==>[v[2],v[4],v[5]]

在此基础上,如果您想计算路径中间的顶点,那么您可以unfold()将路径过滤掉您的开始/结束顶点和count()

gremlin> g.V(2).
......1>   repeat(out()).
......2>     emit(hasId(5)).
......3>   path().
......4>   unfold().
......5>   not(hasId(2,5)).
......6>   dedup().
......7>   count()
==>2

希望这能给你一些启发。Gremlin 食谱中有很多很好的例子。


推荐阅读