连接到多个其他节点的arangodb节点
我刚刚开始使用arangodb,并解决了我的第一个真正问题: 是否可以搜索连接到所有其他多个节点的节点?这似乎是graph db的基本操作,但我想不出解决方案 作为参考,如果我们以“知道”为例,我想知道哪些人知道Charlie和Dave(应该只有Bob) (尚不允许嵌入图像) 现在我最好的猜测是开始遍历所有的“目标”,然后自己减少和过滤响应,这真的是唯一的方法吗 编辑: 好的,为了进一步说明我添加了另一个连接,eve也认识dave,但不应该返回,因为她不认识charlie 编辑2: 到目前为止,我已经提出了这个问题连接到多个其他节点的arangodb节点,arangodb,aql,Arangodb,Aql,我刚刚开始使用arangodb,并解决了我的第一个真正问题: 是否可以搜索连接到所有其他多个节点的节点?这似乎是graph db的基本操作,但我想不出解决方案 作为参考,如果我们以“知道”为例,我想知道哪些人知道Charlie和Dave(应该只有Bob) (尚不允许嵌入图像) 现在我最好的猜测是开始遍历所有的“目标”,然后自己减少和过滤响应,这真的是唯一的方法吗 编辑: 好的,为了进一步说明我添加了另一个连接,eve也认识dave,但不应该返回,因为她不认识charlie 编辑2: 到目前为止,
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”认识的人。。。此外,探查器显示大约三分之一的时间用于优化计划,必须有更好的解决方案,对吗?如果我们以已知为例,只搜索两个连接的顶点,则可以在深度为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
如果我们以knows为例,只搜索两个连接的顶点,则可以在深度为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