【问题标题】:arangodb nodes connected to multiple othersarangodb 节点连接到多个其他节点
【发布时间】:2017-08-02 17:29:38
【问题描述】:

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

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

作为参考,如果我们采用“知道”示例图,我想知道哪些人知道 Charlie 和 Dave(应该只有 Bob)

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

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

编辑: 好的,为了进一步说明我添加了另一个连接,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”的人......此外,分析器显示大约三分之一的时间用于优化计划,应该有更好的解决方案吧?

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    如果我们以 know 示例并且只搜索两个连接的顶点,您可以开始遍历深度为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      相关资源
      最近更新 更多