【问题标题】:Count distinct nodes from traversal in AQL计算 AQL 中遍历的不同节点
【发布时间】:2019-01-22 23:45:35
【问题描述】:

我能够从查询中获取所有不同的节点,但不是计数:

FOR v in 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
return DISTINCT v._key

我只想得到结果的计数。我尝试将LENGTH(DISTINCT v._key) 用作suggested in the docs,但这不是AQL 的正确语法:

语法错误,“DISTINCT v._key)”附近出现意外的 DISTINCT 修饰符

天真的解决方案是获取所有密钥并在客户端进行计数,但我很好奇如何在服务器端进行?

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    RETURN DISTINCT 所做的是删除重复值,但仅限于遍历之后。

    您可以设置遍历选项来消除遍历过程中的路径,这会更有效,特别是如果您有高度互连的图和高遍历深度:

    RETURN LENGTH(
      FOR v IN 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
      OPTIONS { uniqueVertices: "global", bfs: true }
        RETURN v._key
    )
    

    遍历选项uniqueVertices 可以设置为"global",这样您就不会从该遍历中获得两次返回的相同顶点。 广度优先搜索选项bfs需要启用才能使用uniqueVertices: "global"深度优先搜索不支持这个唯一性选项的原因是结果不是确定性的,因此这个组合被禁用了。

    【讨论】:

      【解决方案2】:

      受这篇博文http://jsteemann.github.io/blog/2014/12/12/aql-improvements-for-24/ 的启发,我使用LET 准备了解决方案:

      LET result = (FOR v in 2..2 OUTBOUND "starting_node" GRAPH "some_graph"
                        return DISTINCT v._key)
      RETURN LENGTH(result)
      

      这可能不是最佳解决方案,但它可以按我的预期工作。

      【讨论】:

      • LET可以使用,也可以直接调用LENGTH()RETURN LENGTH(FOR v IN 2..2 OUTBOUND "starting_node" GRAPH "some_graph" RETURN DISTINCT v._key)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多