如何使用AQL遍历以获取特定类型的所有子项

时间:2019-04-10 10:41:59

标签: arangodb

我有一个表示游戏级别的图表。我拥有的节点类型的一些示例是“级别”,“房间”,“椅子”。这些类型由VertexCollections表示,其中一个集合称为“ Level”等。它们由来自单独EdgeCollections的边缘连接,例如“ Level” -roomEdge->“ Room” -chairEdge->“ Chair”。房间也可以包含房间等。因此深度未知。

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

我正在尝试查看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的概念及其用法?

1 个答案:

答案 0 :(得分:0)

是否存在每种实体类型都有多个集合的原因,例如一个房间收藏,一个水平收藏,一个椅子收藏?

一种选择是拥有一个包含您的实体的单一集合,并使用文档上的type: "Chair"type: "Level"键来确定其类型。

您将拥有一个关系集合,该关系集合同时包含_to_from实体集合的边。

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

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中使用“解释”功能来查看索引的使用方式。也许将哈希索引添加到“类型”键。

相关问题