【问题标题】:FIltering out intermediate points in ArangoDB traversal在 ArangoDB 遍历中过滤掉中间点
【发布时间】:2016-05-19 21:54:14
【问题描述】:

通过“包含”给定一个图表,我有以下内容:

  • 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->B
  • A->LibA
  • A->C->LibC
  • A->C->D->LibD
  • A->C->D
  • A->C

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

  • A->B->LibB
  • A->B->D->LibD
  • A->LibA
  • 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,因为当它识别到一个循环时,步行应该停止。

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

【问题讨论】:

    标签: arangodb


    【解决方案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" ] 
    ]
    

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

    【讨论】:

    • 它不考虑长度超过最大深度的路径,在这种情况下,最后一个顶点不是叶节点,但您可能希望返回该路径。条件应扩展到FILTER LENGTH(next) == 0 || LENGTH(p.edges) == 50。您可以使用变量/绑定参数来确保它保持同步,而不是为两个地方的最大深度编写数字文字:LET maxDepth = 50 … FOR v,e,p IN 1..maxDepth … LENGTH(p.edges) == maxDepth
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多