【问题标题】:ArangoDB: AQL query to get all edges between two specific nodesArangoDB:AQL 查询以获取两个特定节点之间的所有边
【发布时间】:2017-10-24 17:54:52
【问题描述】:

我有一个文档集合“节点”和一个边缘集合“属性”。 我正在尝试从“节点/582148”到“节点/582016”获取“属性”集合中的所有边。

我能够设计的最简单的 AQL 查询如下:

FOR v, e, p IN OUTBOUND 'node/582148' `attribute`
    FILTER e._to == 'node/582016'
    RETURN p

真的没有办法合二为一吗,比如:

FOR v, e, p IN OUTBOUND 'node/582148' TO 'node/582016' `attribute` RETURN p

只能在 SHORTEST_PATH 中使用“TO”关键字。澄清一下:我只对节点之间的直接路径(1 条边)感兴趣

谢谢

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    使用图遍历我建议使用以下 AQL 查询来获取所有传出边,这是通过目标顶点键过滤的:

    FOR v, e IN OUTBOUND 'node/582148' `attribute`
    FILTER v._key == '582016'
    RETURN e
    

    另一种方法是将边缘作为具有属性 _from 和 _to 的文档来处理,而无需图遍历:

    FOR e IN `attribute`
    FILTER e._from == 'node/582148' && e._to == 'node/582016'
    RETURN e
    

    【讨论】:

    • 谢谢。在第一个示例中,如果 v 不是“node”类型,我不应该添加 FILTER v._key == 'node/582016' 吗?
    • 不,v._key 应该只包含文档的键,而不是它的集合名称。
    • _key 仅存储文档密钥,例如"1234"。文档键甚至不允许包含斜杠:docs.arangodb.com/3.2/Manual/DataModeling/NamingConventions/… _id 是集合名称、正斜杠和文档键的串联,例如"node/1234".
    • 关于遍历...您认为有什么方法可以进一步优化这样的查询吗?当我使用 1..5 的深度时,我的查询大约需要 28 秒,有 9 个顶点集合和 16 个边集合,总共只有 11764 个对象(实体+链接)。我知道找到 2 个节点之间的所有路径是一项复杂的任务,但我正在寻找可以进行的任何优化。在进一步的项目中,我将需要深度,甚至像 5..10 这样会更加复杂。
    • @DominikFranek 我怀疑新的 PRUNE 功能(3.5 中的新功能?)将在遍历情况下为您提供帮助。见:youtube.com/watch?v=4LVeeC0ciCQ
    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2011-05-04
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多