2017-02-14 82 views

回答

0

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

第一:最短路径

这里的用例是你知道的起点顶点和目标顶点,并且您希望找到这两者之间最短(或最便宜)的路径。 在SHORTEST_PATHhttps://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可以链接到其具有被称为A-任意深度几个深度先验。所以说,你想迭代仅使用与最高值的边缘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] 

第四用例:

深度不是先验已知的,在这种情况下,纯AQL在当前发布版本(3.1)不能制定这个。在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中实现。

+0

感谢您的回复,但不幸的是您的解决方案不适合我的使用案例,请让我澄清一下。 – DegHueg

+0

在你写的第二个场景中,对搜索期间所有将被视为边缘的边缘有一个限制。我想在每个关卡上获得一个最高的valye边缘。因此,应该在每个级别执行排序和限制,并且如果每个下一级别的边缘应该从前一个级别中具有最高值的顶点选择。 F.e.从图:A→B→C→B→D→C→E,其中A→B的值比A→CI的值要高A→B→D – DegHueg

+0

有一个看看ArangoDB中的Foxx微服务,你可以在那里做,因为它可以让你进行多个单一的深度查询,并始终沿着具有最高“价值”的边缘进行查询。而且速度非常快:)如果你想停止在形成一个“圆”的边上循环,只保留你访问过的所有顶点的数组,如果你得到一个副本,停止迭代并返回结果。 –