arangodb节点连接到多个其他节点

时间:2017-07-19 17:35:09

标签: arangodb aql

我刚开始使用arangodb并且遇到了我的第一个真正的问题:

是否可以搜索连接到所有其他节点的节点?这似乎是图表数据库的基本操作,但我想不出解决方案。

作为参考,如果我们采用'知道'示例图表,我想知道哪些人知道查理和戴夫(应该只是鲍勃)

knows example graph(暂时不允许嵌入图片)

现在我最好的猜测是开始遍历所有“目标”并自行减少和过滤响应,这真的是唯一的方法吗?

编辑: 好的,为了进一步说明我已经添加了另一个连接,前夕也知道dave,但不应该返回,因为她不知道查理

EDIT2: 到目前为止,我已经提出了这个问题

FOR start IN ['persons/charlie', 'persons/dave']
LET knownBy = (FOR v,e,p IN 1 INBOUND start knows
    RETURN v)
FOR p IN knownBy
    COLLECT person = p
    LET knows = (FOR v IN 1 OUTBOUND person._id knows
        RETURN v._id)
    FILTER knows ALL IN ['persons/charlie', 'persons/dave']
    RETURN person

然而,这感觉有点不自然,让'X'知道的人知道'X'的人......而且,剖析器显示大约三分之一的时间用于优化计划,必须有一个更好的解决方案,对吧?

1 个答案:

答案 0 :(得分:0)

如果我们采用已知示例并且只搜索两个连接的顶点,您可以在一个深度为2的目标上开始遍历并过滤该路径上的第三个顶点必须是第二个目标,那么您可以返回路径上的第二个顶点。

FOR v, e, p IN 2 ANY 'persons/charlie' knows
  FILTER p.vertices[2]._id == 'persons/dave'
  RETURN p.vertices[1]

如果搜索两个以上的顶点,则以下查询应该可以正常工作。它开始一个深度为1的遍历并收集邻居的每个_id,并且你的目标的检查都包含在邻居中。

LET targets = ['persons/charlie','persons/dave']

FOR person IN persons
  FILTER targets ALL IN FLATTEN((
    FOR v, e, p IN 1 ANY person._id knows
    RETURN v._id
  ))
  RETURN person