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

Query to retrieve all paths traversable from a given vertex

我正在尝试编写一个查询来检索可从指定顶点到达的所有路径。换句话说,我正在尝试检索顶点连接到的整个 cluster/sub-graph 。对查询的更多约束是:

  1. 向内的边缘应该被遍历并包含在结果中(我正在寻找所有以任何方式连接到根顶点的路径。
  2. 搜索必须在指定的深度停止,例如,距离目标 10 跳 根顶点。
  3. 额外限制:我希望结果不包含作为结果中 returned 的其他路径的完整子路径的路径。

我目前有以下两个查询,它们似乎可以在我测试过的小型玩具图上正常工作。然而,在我们的大型生产图中似乎有一些边缘情况并没有 return 我期望的所有 paths/edges/vertices,但我无法解释为什么会这样。这两个查询有时也会return一些不同的顶点。

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

查询 1:

g.V(uid).repeat(bothE().bothV().simplePath()).until(loops().is_(10)).emit().dedup().path ().by(valueMap(True))

查询 2:

g.V(uid).repeat(bothE().bothV().simplePath()).until(bothE().simplePath().count().is_(0).or_( .loops().is_(10)).dedup().path().by(valueMap(True))

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

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 步骤来 return 包含顶点和边的整个子图。此示例查找从值 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() 测试,但您可以根据需要添加它。