ArangoDB找到连接的顶点

时间:2016-10-14 21:25:48

标签: arangodb

我非常喜欢arangodb并非常喜欢它,但我正努力创建查询语句。 我有两个集合(VA,VB)和它们之间的边缘(EC) 我希望找到具有特定过滤器的搜索Va(而不是_id),然后连接(通过EC)RETURN文档(VB),其中EC具有特定属性(例如,active:true)

在文档中,我只找到了顶点已知的例子。 先感谢您, JNL

1 个答案:

答案 0 :(得分:1)

是的,制作图表会让它更容易一些,但您仍然可以在不使用图表的情况下进行查询。

这是一个直接使用三个集合的例子:

FOR va IN VA
FILTER va.name == 'Bob'
    FOR e IN EC
    FILTER e._from == va._id && e.active == true
        FOR vb IN VB
        FILTER e._to == vb._id
        RETURN vb

如果你想使用图表,看起来你可能已经测试了一个,那么这将起作用:

LET myOrigin = FIRST(FOR d IN VA FILTER d.name == 'Bob' RETURN d._id)

FOR v, e, p IN 1..1 OUTBOUND myOrigin GRAPH 'GD'
FILTER p.edges[0].active == true
RETURN p.vertices[1]

需要注意的是myOrigin需要是_id,这意味着在设置值时使用FIRST(...)来分配值。这可以确保您获得单个值(第一个)而不是数组。

您的示例也有效:

FOR m IN VA FILTER m.name == 'Bob' 
    FOR v, e, p IN 1..1 ANY m GRAPH 'GD' 
    FILTER p.edges[0].active == true 
    RETURN v 

需要注意的是,此示例可以匹配多个文档(因为多个文档可能包含.name == 'Bob',并且它将返回VB中匹配的所有节点。

如果您希望结果显示VA中的哪个条目与VB连接,并且可以选择具有多个匹配的VA值,这将有助于您:

FOR m IN VA FILTER m.name == 'Bob' 
    FOR v, e, p IN 1..1 ANY m GRAPH 'GD' 
    FILTER p.edges[0].active == true 
    RETURN {
        origin: m,
        connected_to: v 
    }

如果要清理结果,可以使用UNSET更好地获得结果:

FOR m IN VA FILTER m.name == 'Bob' 
    FOR v, e, p IN 1..1 ANY m GRAPH 'GD' 
    FILTER p.edges[0].active == true 
    RETURN {
        origin: UNSET(m, '_key', '_rev'),
        connected_to: UNSET(v, '_key', '_rev') 
    }

它只是从查询中发送给您的结果中删除了这些键。

有很多方法可以检索数据,只需查看不同的示例就可以真正帮助您了解AQL。