首页 文章

ArangoDB找到连接的顶点

提问于
浏览
1

我对arangodb很新,非常喜欢但是我很难创建查询语句 . 我有两个集合(VA,VB)和它们之间的边缘(EC)我想找到具有特定过滤器(不是_id)的搜索Va,然后连接RETURN文档(VB)(通过EC)EC具有特定属性(例如活动) :真的)

在文档中,我只找到了顶点已知的例子 . 先谢谢你,Jnl

1 回答

  • 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 .

相关问题