【问题标题】:Find path following edges with greatest value in ArangoDB在 ArangoDB 中查找具有最大值的边缘的路径
【发布时间】:2017-02-16 18:08:14
【问题描述】:

可以说,在我的图表中,我的边具有称为值的字段。选择起始顶点后,我想通过始终选择具有最高值的边来查找路径。不幸的是,我不知道如何编写正确的查询,在 ArangoDB 中是否可能?

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    您好,我不确定您想要实现什么,我可以从您的描述中想象出两种可能的情况:

    第一:最短路径

    这里的用例是您知道起始顶点和目标顶点,并且您想找到这两者之间的最短(或最便宜)路径。 内置的SHORTEST_PATH (https://docs.arangodb.com/3.1/AQL/Graphs/ShortestPath.html#shortest-path-in-aql) 功能可以通过在选项中定义距离属性来提供服务,如下所示:

    FOR v IN OUTBOUND @start TO @end @@edgeCollections OPTIONS {weightAttribute: "value", defaultWeight: 1}
      RETURN v
    

    这将为您提供路径上从头到尾的所有顶点,这些顶点具有最低的一些值属性。如果您需要“最高值”,您可以复制该值并使用1/value 再次将其保存在不同的字段中,以找到总和最高的values 的边最少的路径

    第二:边的排序

    用例是您只有起始顶点并想要获取连接的顶点,按边上的值排序。在那里,您可以简单地将遍历语句与简单排序结合起来。 (https://docs.arangodb.com/3.1/AQL/Graphs/Traversals.html#graph-traversals-in-aql):

    FOR v, e IN OUTBOUND @start @@edgeCollection
      SORT e.value DESC
      LIMIT 1 /* Only pick the highest one */
      REUTRN {v: v, e: e}
    

    第三个用例:仅使用最高值迭代多个深度

    用例 2 中的 AQL 可以链接到必须先验已知的任意深度。因此,假设您只想使用最高值的边迭代 3 个步骤:

    FOR v1, e1 IN OUTBOUND @start @@edgeCollection
      SORT e1.value DESC
      LIMIT 1 /* Only pick the highest one */
      /* Depth 1 done. now depth 2*/
      FOR v2, e2 IN OUTBOUND v1 @@edgeCollection
        SORT e2.value DESC
        LIMIT 1 /* Only pick the highest one */
        FOR v3, e3 IN OUTBOUND v2 @@edgeCollection
          SORT e3.value DESC
          LIMIT 1 /* Only pick the highest one */
          RETURN [v1,v2,v3]
    

    第四个用例:

    深度是先验未知的,在这种情况下,当前发布版本 (3.1) 中的纯 AQL 无法对此进行表述。使用 JavaScript 中的遍历模块 (https://docs.arangodb.com/3.1/Manual/Graphs/Traversals/UsingTraversalObjects.html#getting-started) 会更容易使用 Foxx 服务 (https://docs.arangodb.com/3.1/Manual/Foxx/#foxx),它更灵活一些,但只能在 Javascript 中实现。

    【讨论】:

    • 感谢您的重播,但很遗憾您的解决方案不适合我的用例,所以让我澄清一下。
    • 在第二种情况下,您编写了搜索期间将访问的所有边缘的限制。我想在每个级别上获得一个最高的 valye 边缘。所以排序和限制应该在每个级别执行,如果每个下一个级别的边应该从前一个值最高的顶点中选择。 F.e.来自图表: A -> { B, C }, B-> D, C -> E ,其中边 A->B 的值高于 A->C 我想得到 A -> B -> D
    • 看看 ArangoDB 中的 Foxx 微服务,您可以在那里进行,因为它允许您进行多个单深度查询,始终跟随其上具有最高“价值”的边缘。而且它非常快:) 如果您想停止在形成“圆”的边中循环,只需保留您访问过的所有顶点的数组,如果您得到重复,请停止迭代并返回结果。
    • 我正在为 ArangoDB 使用 java api。我将尝试对其进行测试,看看它的性能如何。谢谢。
    • 酷,使用 Foxx 框架,它可以发布一个带有端点的 REST API,让您可以进行查询。如果您使用典型的 RDBMS 执行此操作,则必须使用存储过程。如果您需要额外的逻辑/控制,Foxx 是 ArangoDB 为您提供的工具,但 Foxx 比简单的存储过程更实用。您使用的次数越多,您就越爱他们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多