0

来自 neo4j 和 Arango 的新手。

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

所以我有类似的东西:

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

Circle 存储在一个文档集合中。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}]
}

*还要注意我不想嵌套这个结构。就像我想要 {data from Circle A} in parents- 我不希望这也有父母,孩子,广场 - 只是在寻找包含在该节点中的元数据。

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

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

2 回答 2

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 )
        }
于 2016-07-13T17:56:32.277 回答
1

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

但是,如果您在这样的查询中使用模式匹配遍历,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 有一个特殊的边缘集合类型,它隐含地知道和强制边缘文档的属性 - 但除了这个限制之外,您可以用任意文档填充它_from_to

您还可以将常规 AQL 查询与图遍历结合起来,如本示例所示

于 2016-07-13T14:04:24.607 回答