ArangoDB通过节点属性进行有效遍历

时间:2016-01-11 17:41:13

标签: arangodb arangojs

在OrientDB中,每个顶点都连接了连接的边。这意味着可以使用嵌套的“select”语句显式地从集合中遍历节点。

作为示例:给定节点属性的路径,找到匹配的结束节点。 该路径由节点属性列表组成(例如,kind在路径中的节点中是唯一的。)

现在,假设我有一棵树:

kind=site, name=site1
  -- kind=project, name=project1
  -- kind=library, name=library1
kind=site, name=site2
  -- kind=project, name=project2
  -- kind=library, name=library1

用户希望来自名为library1的库中的信息具有路径:

[{kind=site},{kind=project,name=project1},{kind=library,name=library1}]

只要结果是单个节点,就不会让每个节点完全符合遍历条件。

在OrientDB中,流程为:

  • 从kind = site
  • 的所有节点开始
  • 走过“孩子”边缘并收集所有对象   kind = project and name = project1
  • 遍历子边缘并收集所有对象   kind = library and name = library1

这可以在嵌套的select语句中完成。索引类型字段,以便从大量对象快速收集起始节点。为了进一步提高性能,我知道在哪些表(集合)中有哪些类型,因此我可以选择要选择的对象数(从< table>中选择kind = site)。

在ArrangoDB中,只有边缘具有节点绑定信息,因此有一个节点我无法直接遍历连接边缘。在GRAPH_TRAVERSAL函数中,我可以通过示例指定起始集合。所以例子是{kind = site}。这是否意味着必须通过扫描所有图形边缘来收集节点的起始列表,基本上查看连接到整个图形中每条边的输入的每个节点?

如何制定这样的查询(在AQL和/或arangojs中),这样就不必开始对连接到边缘的对象进行全面扫描?

我也没有看到如何将示例顶点发送到arangojs遍历函数。它似乎总是需要一个明确的起始顶点。

1 个答案:

答案 0 :(得分:1)

考虑到这样的工作,我们设计了新的AQL graph traversal,它将与ArangoDB 2.8一起发布(目前处于测试阶段后期)

关于你的最后一点,我们使用named graphs来识别相关的集合,这些集合知道集合及其在图中的关系。我假设您将使用named graphs

让我们使用one of the ArangoDB 2.8 Example graphs和arangosh:

var examples = require("org/arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("traversalGraph");

它在circles集合中有它的通道,它的边连接edges集合中的顶点:

db.circles.toArray();
db.edges.toArray();

我们现在可以将FILTER语句与travesal depth结合使用,以便在执行早期修剪图形分支的遍历。

这里我们过滤遍历的第一层中找到的顶点的属性:

db._query("FOR v, e, p IN 1..3 " + 
              "OUTBOUND 'circles/A' " + 
              "GRAPH 'traversalGraph' " + 
              "FILTER p.vertices[1]._key != 'G' RETURN v._key");

我们也可以用类似的方式过滤边缘属性:

db._query("FOR v, e, p IN 1..3 "
          "OUTBOUND 'circles/A' " +
          "GRAPH 'traversalGraph' " + 
          "FILTER p.edges[0].label != 'right_foo' RETURN v._key");

AQL graph traversal chapter也有深入的解释,遍历遍历图表。