我刚开始使用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'的人......而且,剖析器显示大约三分之一的时间用于优化计划,必须有一个更好的解决方案,对吧?
答案 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