【问题标题】:How to use NEIGHBORS in AQL?如何在 AQL 中使用 NEIGHBORS?
【发布时间】:2017-12-19 19:24:31
【问题描述】:

我是 ArangoDB 的新手,并且已经是一个不断增长的粉丝。在许多事情中,我们需要将多对多关系转换为图形,并在那里有效地查询。 但是我似乎无法重现 the cookbook 中描述的 NEIGHBORS 中的行为 在“使用边缘集合”下。

插入数据并运行后:

FOR b IN books RETURN { book: b, authors: NEIGHBORS(books, written, b._id, 'inbound') }
[
  {
    "book" : {
      "_id" : "books/10519631898915",
      "_key" : "10519631898915",
      "_rev" : "10519631898915",
      "title" : "The beauty of JOINS"
    },
    "authors" : [ ]
  }
]

空的作者列表!我尝试了这个:

FOR b IN books RETURN { book: b, authors: NEIGHBORS(authors, written, b._id, 'inbound') }
[
  {
    "book" : {
      "_id" : "books/10519631898915",
      "_key" : "10519631898915",
      "_rev" : "10519631898915",
      "title" : "The beauty of JOINS"
    },
    "authors" : [
      "authors/10519474612515",
      "authors/10519475792163"
    ]
  }
]

返回_id 列表。这些都没有像食谱中那样返回我需要的东西,这是预期的边缘/顶点结构。 (都在2.6.9测试过)

NEIGHBORS 的使用目的是什么?如何在纯 AQL 中实现我的目标? 是否有关于 NEIGHBORS(和其他图形 AQL 功能)的标准文档,其中包含每个参数的描述和类型以及返回值?

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    您是否尝试过 NEIGHBORS 的 includeData 选项?

    FOR b IN books RETURN { book: b, authors: NEIGHBORS(authors, written, b._id, 'inbound', [], {includeData: true}) }
    

    这在我的测试中有效。 它会比 PATHS 在大型数据集上的性能更高(PATHS 计算更多不相关的信息)

    注意:空数组[] 用于定义只应遵循的边。对于一个空数组,我们遵循所有边,但您也可以遵循特殊边 f.e. {label: "written"} 而不是 []

    【讨论】:

    • 是的,在文档章节 AQL -> Functions -> Graph Functions 参见:docs.arangodb.com/Aql/GraphFunctions.html
    • 干杯。该页面没有出现在谷歌中,但现在我现在去哪里看 :-)
    • arangodb.com > 文档 > 手册,如果您想知道的话。 Google 可能不是最理想的,因为它有时会忽略重要的事情。
    【解决方案2】:

    对,我找到了一个解决方案:

    FOR p IN PATHS(books, written, 'inbound') 
    RETURN p.destination
    

    结果:

    Warnings:
    
    [1577], 'collection 'books' used as expression operand'
    
    Result:
    
    [
      {
        "_id": "books/10519631898915",
        "_rev": "10519631898915",
        "_key": "10519631898915",
        "title": "The beauty of JOINS"
      },
      {
        "_id": "authors/10519474612515",
        "_rev": "10519474612515",
        "_key": "10519474612515",
        "name": {
          "first": "John",
          "last": "Doe"
        }
      },
      {
        "_id": "authors/10519475792163",
        "_rev": "10519475792163",
        "_key": "10519475792163",
        "name": {
          "first": "Maxima",
          "last": "Musterfrau"
        }
      }
    ]
    

    它至少获得了目标顶点,但它似乎不正确,因为我收到警告并且源顶点被包含为目标。 非常欢迎进一步的阐述和建议。

    【讨论】:

      【解决方案3】:

      更新(2017 年):AQL 3.x 不再支持 NEIGHBORS

      而不是

      NEIGHBORS(books, written, b._id, 'inbound')
      

      你可以写一个子查询:

      (FOR v IN 1..1 INBOUND b written RETURN v)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多