查询以检索可从给定顶点遍历的所有路径

时间:2020-09-15 10:39:37

标签: graph gremlin amazon-neptune

我正在尝试编写一个查询,该查询检索从指定顶点可到达的所有路径。换句话说,我正在尝试检索顶点连接到的整个群集/子图。该查询还有两个其他约束:

    应该遍历
  1. 内边缘并将其包含在结果中(我正在寻找以任何方式 连接到根顶点的所有路径。
  2. 搜索必须在距指定位置10跳的指定深度处停止 根顶点。
  3. 奖金约束:我希望结果中不要包含作为结果中返回的其他路径的完整子路径的路径。

我目前有以下两个查询,这些查询似乎可以在我测试过的小型玩具图表上正常工作。但是,在我们大型的生产图中似乎有些边缘情况没有返回我期望的所有路径/边缘/顶点,但是我无法解释为什么会发生这种情况。这两个查询有时还会返回彼此不同的顶点。

我希望对如何处理此查询有一个全新的了解,而不是尝试调整我目前拥有的内容,因此请在下面查看我当前的解决方案之前尝试提供一个解决方案。

查询1:

gV(uid).repeat(bothE()。bothV()。simplePath())。until(loops()。is_(10))。emit()。dedup()。path()。by(valueMap (是))

查询2:

gV(uid).repeat(bothE()。bothV()。simplePath())。until(bothE()。simplePath()。count()。is_(0).or _()。loops()。 is_(10))。dedup()。path()。by(valueMap(True))

1 个答案:

答案 0 :(得分:3)

使用此简单的二叉树作为测试图

g.addV('root').property('data',9).as('root').
  addV('node').property('data',5).as('b').
  addV('node').property('data',2).as('c').
  addV('node').property('data',11).as('d').
  addV('node').property('data',15).as('e').
  addV('node').property('data',10).as('f').
  addV('node').property('data',1).as('g').
  addV('node').property('data',8).as('h').
  addV('node').property('data',22).as('i').
  addV('node').property('data',16).as('j').
  addV('node').property('data',7).as('k').
  addV('node').property('data',51).as('l').  
  addV('node').property('data',13).as('m'). 
  addV('node').property('data',4).as('n'). 
  addE('left').from('root').to('b').
  addE('left').from('b').to('c').
  addE('right').from('root').to('d').
  addE('right').from('d').to('e').
  addE('right').from('e').to('i').
  addE('left').from('i').to('j').
  addE('left').from('d').to('f').
  addE('right').from('b').to('h').
  addE('left').from('h').to('k').
  addE('right').from('i').to('l').
  addE('left').from('e').to('m').
  addE('right').from('c').to('n').
  addE('left').from('c').to('g').iterate()

我们可以使用找到所有路径

gremlin>   g.V().hasLabel('root').
......1>   repeat(bothE().otherV().simplePath()).
......2>   until(__.not(bothE().simplePath())).
......3>   path().
......4>     by('data').
......5>     by(label) 

==>[9,right,11,left,10]
==>[9,left,5,left,2,left,1]
==>[9,left,5,left,2,right,4]
==>[9,left,5,right,8,left,7]
==>[9,right,11,right,15,left,13]
==>[9,right,11,right,15,right,22,left,16]
==>[9,right,11,right,15,right,22,right,51]   

请注意,正如您所说,我使用bothE().otherV()时,您可能同时有一些传入边缘和传出边缘。

我们还可以使用subgraph步骤来返回包含顶点和边的整个子图。本示例查找从顶点开始的值5的子树。

gremlin>   g.V().has('data',5).
......1>   repeat(bothE().subgraph('sg').otherV().simplePath()).
......2>   until(__.not(bothE().simplePath())).
......3>   cap('sg') 
==>tinkergraph[vertices:14 edges:13]  

请注意,这两种方法均假定所有路径均在叶节点处结束。我省略了loops()测试,但是您可以根据需要添加它。

相关问题