【问题标题】:AQL Arango - Get Vertex and Neighbors using EdgesAQL Arango - 使用边获取顶点和邻居
【发布时间】:2016-07-13 00:22:11
【问题描述】:

来自 neo4j,刚接触 Arango。

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

所以我有类似的东西:

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

圆存储在一个文档集合中。 Square 存储在文档集合中。

然后我有两个边缘集合 HAS_CIRCLE 和 HAS_SQUARE 对应得恰到好处。

我知道我想要 Circle 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 中的 {data from Circle A} 一样 - 我不希望这也有父母、孩子、方块 - 只是从字面上寻找包含在该节点中的元数据。

我知道我可以这样开始……但我很快就迷路了。即使在做基础知识时 - 我似乎无法正确收集它并将数组与键相关联。

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

【问题讨论】:

    标签: javascript arangodb aql


    【解决方案1】:

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

    但是,如果您在这样的查询中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 顶点。 FILTERing 他们将从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

    【讨论】:

      【解决方案2】:

      非常感谢@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 )
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多