【问题标题】:How to Traverse to get all children of a specific type using AQL如何使用 AQL 遍历以获取特定类型的所有子项
【发布时间】:2019-04-13 16:19:46
【问题描述】:

我有一个表示游戏关卡的图表。我拥有的节点类型的一些示例是“Level”、“Room”、“Chair”。这些类型由 VertexCollections 表示,其中一个集合称为“Level”等。它们由来自不同 EdgeCollections 的边连接,例如“Level”-roomEdge->“Room”-chairEdge->“Chair”。房间也可以包含房间等,所以深度是未知的。

我想从任意的“关卡”-顶点开始,遍历整个子树,找到属于该关卡的所有椅子。

我正在尝试看看 ArangoDB 对我来说是否比 OrientDB 更好,在 OrientDB 中我使用查询:

SELECT FROM (TRAVERSE out() FROM startNode) WHERE @class = 'Chair'

我已经尝试过 AQL 查询:

FOR v IN 1..6 OUTBOUND @startVertex GRAPH 'testDb' FILTER IS_SAME_COLLECTION('Chair', v) == true RETURN v;

然而,与 OrientDB 查询相比,它的执行速度似乎要慢得多(~1 秒 vs ~0.1 秒)。

我用于查询的代码如下:

String statement = "FOR v IN 1..6 OUTBOUND @startVertex GRAPH 'testDb' FILTER IS_SAME_COLLECTION('Chair', v) == true RETURN v";
timer.start();
ArangoCursor<BaseDocument> cursor = db.query(statement, new MapBuilder().put("startVertex", "Level/"+startNode.getKey()).get(), BaseDocument.class);
timer.saveTime();

两个解决方案都在相同的硬件上运行,没有进行任何优化,两个数据库都是“开箱即用”的。两种情况都使用相同的数据(约 100 万个顶点)并返回相同的结果。

所以我的问题是我是否在 AQL 查询中正确地做事,或者有更好的方法吗?我是否误解了 VertexCollections 的概念以及它们的使用方式?

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    每个实体类型都有多个集合是否有原因,例如一个房间系列,一个楼层系列,一个椅子系列?

    一种选择是拥有一个包含您的实体的集合,您可以使用文档上的type: "Chair"type: "Level" 键来识别它的实体类型。

    然后,您将拥有一个关系集合,其中包含 _to_from 实体集合的边。

    然后,您可以从给定节点(例如关卡)开始,并通过如下查询找到它所连接的所有椅子类型的实体:

    FOR v, e, p IN 1..6 OUTBOUND Level_ID Relationship_Collection
    FILTER p.vertices[-1].Type == 'Chair'
    RETURN v
    

    您可以返回 v(最终顶点)或 e(最终边)或 p(所有路径)。

    我不确定您是否需要使用图形对象,而是使用将关系添加到实体集合的关系集合。

    如果需要,图表很好,但对于遍历查询不是必需的。阅读 ArangoDB 上的文档,看看你是否需要它们,通常我不使用它们,因为使用图表会稍微降低性能。

    记得查看索引,并使用 UI 中的“解释”功能查看索引的使用情况。也许在“类型”键中添加一个哈希索引。

    【讨论】:

    • 使用多个集合的原因是基于我从docs.arangodb.com/3.4/Manual/Graphs/GeneralGraphs 收集的信息,尤其是示例(商店/客户/宠物)。如果我理解正确,您是在建议使用“匿名图”吗?我可以看到索引的“类型”属性如何帮助它更快,我可能会尝试这种方法。但是,我主要想知道用于遍历我现在拥有的结构的 AQL 是否正确,或者是否有任何优化而不改变数据结构。
    • 您可以继续使用单独的集合,并且您仍然可以添加带有用于过滤的值的类型键。匿名图很好,并且比命名图稍快(由于数据库完成的图完整性检查较少)。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多