ArangoDB 查找连接的顶点
ArangoDB finding connected vertices
我是 arangodb 的新手,非常喜欢它,但我很难创建查询语句。
我有两个集合(VA,VB)和它们之间的边缘(EC)
我想找到具有特定过滤器(不是通过 _id)的搜索 Va,然后 RETURN 文档(VB)连接(通过 EC),其中 EC 具有特定的 属性(例如,active:true)
在文档中,我只找到了已知顶点的示例。
先感谢您,
Jnl
是的,制作图表会更容易一些,但您仍然可以在不使用图表的情况下进行查询。
这是一个仅使用三个集合即可工作的示例:
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'
并且它将 return 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。
我是 arangodb 的新手,非常喜欢它,但我很难创建查询语句。 我有两个集合(VA,VB)和它们之间的边缘(EC) 我想找到具有特定过滤器(不是通过 _id)的搜索 Va,然后 RETURN 文档(VB)连接(通过 EC),其中 EC 具有特定的 属性(例如,active:true)
在文档中,我只找到了已知顶点的示例。 先感谢您, Jnl
是的,制作图表会更容易一些,但您仍然可以在不使用图表的情况下进行查询。
这是一个仅使用三个集合即可工作的示例:
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'
并且它将 return 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。