【问题标题】:ArangoDB efficient traversal via node attributesArangoDB 通过节点属性高效遍历
【发布时间】:2016-01-11 17:41:13
【问题描述】:

在 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 和 name=project1
  • 穿过子边缘并收集所有属于 kind=library 和 name=library1

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

where kind=site 中选择)。

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

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

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

【问题讨论】:

    标签: arangodb arangojs


    【解决方案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 语句与遍历深度结合使用,在执行早期修剪图分支的遍历。

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

    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 也有深入的解释,遍历器以何种方式遍历图。

    【讨论】:

    • 这正是我想要的。我将在我的代码中注释查询将从该功能中受益的地方。我们仍处于可行性研究阶段,所以我还有一点时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多