【问题标题】:ArangoDB finding connected verticesArangoDB 查找连接的顶点
【发布时间】:2016-10-15 19:57:38
【问题描述】:

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

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

【问题讨论】:

  • FOR m IN VA FILTER m.name == 'some name' FOR v, e, p IN 1..1 ANY m GRAPH 'namedGraph' FILTER p.edges[0].active ==真正的回归 v

标签: arangodb


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多