在ArangoDB遍历中删除中间点

时间:2016-05-18 17:21:58

标签: arangodb

通过“包含”给出图表我有以下内容:

  • D包含LibD
  • C包含LibC和D
  • B包含LibB和D
  • A包含LibA,B和C

使用:

FOR v,e,p IN 1..50 INBOUND 'pmconfig/899018092734' pm_content RETURN p.vertices

我得到以下路径:

  • A-> B-> LibB
  • A-> B-> D-> LIBD
  • A-> B-> d
  • A->乙
  • A->利巴
  • A-> C->的LibC
  • A-> C-> D-> LIBD
  • A-> C-> d
  • A-&以及c

我想过滤出中间点,所以我得到了:

  • A-> B-> LibB
  • A-> B-> D-> LIBD
  • A->利巴
  • A-> C->的LibC
  • A-> C-> D-> LIBD

如果LibX元素是叶子,我可以添加像

这样的过滤器
FILTER LENGTH(EDGES(pm_content,v._id,'inbound'))==0

但假设我有一条路径:A-> B-> C-> D-> B

在这种情况下,我会过滤掉所有内容。我想拥有的是什么 A-> B-> C-> D,因为步行应该在识别循环时停止。

如何构建一个删除中间点的过滤器?具体来说,只有以叶节点或所有内容链接结尾的那些指向已遍历的顶点。

1 个答案:

答案 0 :(得分:1)

过滤"未完成的路径"我们需要预测遍历者是否能够沿着图表继续前进。

找出的唯一方法是尝试 - 所以我们在子查询中添加源自当前顶点(v)的第二个遍历,最多只需要一步。

子查询将返回两个可能的结果:如果有更多节点,则[1],如果没有,则返回[]。我们可以使用LENGTH()函数对此进行测试。

然后我们将使用此信息从结果中过滤未完成的路径:

FOR v,e,p IN 1..50 INBOUND 'pmconfig/899018092734' pm_content
  LET next = (FOR x IN 1 INBOUND v pm_content LIMIT 1 RETURN 1)
  FILTER LENGTH(next) == 0
  RETURN p.vertices

让我们尝试在Traversal Graph上测试一下;我们将方向更改为OUTBOUND,因为我们可以轻松获得更多结果。我们将输出限制为仅提供_key,因此我们可以毫无问题地重新验证结果。

var examples = require("org/arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("traversalGraph");
db._query(`
FOR v,e,p IN 1..50 OUTBOUND 'circles/A' GRAPH 'traversalGraph'
  LET next = (FOR x IN 1 OUTBOUND v GRAPH 'traversalGraph' LIMIT 1 RETURN 1)
  FILTER LENGTH(next) == 0
  RETURN p.vertices[*]._key
`).toArray()

[ 
  [ "A", "B", "C", "D" ], 
  [ "A", "B", "E", "F" ], 
  [ "A", "G", "H", "I" ], 
  [ "A", "G", "J", "K" ] 
]

正如我们所看到的,我们只获得了到端点的路径 - 正如预期的那样。