AQL Arango - 使用边缘获取顶点和邻居

时间:2016-07-13 00:22:11

标签: javascript arangodb aql

来自neo4j,新来自Arango。

我正在尝试查询我的数据并构建相应的数据结构。

所以我有类似的东西:

    Circle A
    /       \
 Square A    Circle B 
            /     \         \
       Circle C   Square B  Square D

圆圈存储在文档集合中。 Square存储在文档集合中。

然后我有两个边缘集合 适当对应的HAS_CIRCLE和HAS_SQUARE。

我知道我想要圆圈B及其邻居 - 就像这样的结构。

{
    circle: {data from Circle B},
    parents: [{data from Circle A}],
    children: [{data from Circle C}],
    squares: [{data from Square B}, {data from Square D}]
}

*还要注意我不打算嵌套这个结构。就像我想要parents中来自Circle A}的数据一样 - 我不希望这也有父母,孩子,正方形 - 只是字面上寻找该节点中包含的元数据。

我知道我可以这样开始......但我很快迷路了。即使在做基础测试时 - 我似乎无法正确地收集它并将数组关联到一个键。

FOR c in Circle
    FILTER c.name === 'Circle B'
    FOR hc in HAS_CIRCLE
        FILTER hc._from === c._id

2 个答案:

答案 0 :(得分:1)

你一定错过了the trip to the graph documentation in ArangoDB。可以肯定的是,你可以使用经典连接的文档查询(就像你尝试过的那样)进行图形迭代,并像在传统SQL中那样在任何其他RDBMS上进行映射。

然而,如果你在use the pattern matching traversals这样的查询中,ArangoDB会公布其真实的图形功能:

FOR vertex, edge, path IN 
  1..5 
  OUTBOUND
  'circle/A'
  GRAPH circesAndSquares 
    FILTER edge.name == 'Circle B'
     RETURN {vertices: vertex, edges: edge, paths: path}

edge将包含当前遍历步骤的边缘文档,vertex顶点。 FILTER他们将隐藏RETURN语句中的非匹配文档。可以在迭代深度上过滤路径,然后在术语中可以中止遍历:

FILTER path.edges[1].name == 'Circle B'

您还可以过滤任何迭代深度:

FILTER path.vertices[*].isValid == true

文档中的示例演示了如何使用命名和匿名图以及如何将数据插入ArangoDB。 ArangoDB有一个特殊的edge collection type,它隐含地知道并强制执行边缘文档中的_from_to属性 - 但除了这个限制之外,您可以用任意文档填充它。

您也可以combine regular AQL queries with graph traversals, as demonstrated in this example

答案 1 :(得分:1)

非常感谢@dothebart - 这确实让我指出了正确的方向。

我的查询最终看起来像。如果这是最理想的,但仍然没有100%,但产生我正在寻找的结果。

FOR c IN Circle
  FILTER c.name == 'Circle B'
        RETURN {
            "circle" : c,
            "parents":  ( FOR parents IN INBOUND b._id HAS_CIRCLE RETURN parents )),
            "children": ( FOR children IN OUTBOUND b._id HAS_CIRCLE RETURN children ),
            "squares":  ( FOR squares IN OUTBOUND b._id HAS_SQUARE RETURN squares )
        }