最快的 ArangoDB 朋友的朋友查询是多少(带计数)

2024-03-12

我正在尝试使用 ArangoDB 获取朋友的朋友列表。不仅仅是一个基本的朋友的朋友列表,我还想知道用户和朋友的朋友有多少个共同的朋友并对结果进行排序。 经过多次尝试(重新)编写性能最佳的 AQL 查询,我最终得到的是:

LET friends = (
  FOR f IN GRAPH_NEIGHBORS('graph', @user, {"direction": "any", "includeData": true, "edgeExamples": { name: "FRIENDS_WITH"}})
  RETURN f._id
)

LET foafs = (FOR friend IN friends
  FOR foaf in GRAPH_NEIGHBORS('graph', friend, {"direction": "any", "includeData": true, "edgeExamples": { name: "FRIENDS_WITH"}})
    FILTER foaf._id != @user AND foaf._id NOT IN friends
    COLLECT foaf_result = foaf WITH COUNT INTO common_friend_count
    RETURN {
      user: foaf_result,
      common_friend_count: common_friend_count
    }
)
FOR foaf IN foafs
  SORT foaf.common_friend_count DESC
  RETURN foaf

不幸的是,性能没有我想要的那么好。与相同查询(和数据)的 Neo4j 版本相比,AQL 似乎慢了很多(5-10 倍)。

我想知道的是...我怎样才能改进我们的查询以使其性能更好?


我是核心开发人员之一ArangoDB并尝试优化您的查询。因为我没有你的dataset我只能说说我的测试dataset如果您能验证我的结果,我会很高兴。

首先,如果我正在跑步ArangoDB2.7,但在这种特殊情况下,我预计与 2.6 相比不会有重大性能差异。

In my dataset我可以在大约 7 秒内执行您的查询。 第一个修复: 在你的朋友声明中你使用includeData: true并且只返回_id. With includeData: false GRAPH_NEIGHBORS直接返回_id我们还可以在这里去掉子查询

LET friends = GRAPH_NEIGHBORS('graph', 
                              @user,
                              {"direction": "any",
                               "edgeExamples": { 
                                   name: "FRIENDS_WITH"
               }})

这在我的机器上将其降低到约 1.1 秒。所以我预计这会接近Neo4J的性能。

为什么这会产生如此大的影响?在内部我们首先找到_id值而不实际加载文档 JSON。在您的查询中,您不需要任何此类数据,因此我们可以安全地继续不打开它。

但现在真正的改进

您的查询采用“逻辑”方式,首先获取用户的邻居,然后找到他们的邻居,计算出现的频率foaf找到并对其进行排序。 这必须在内存中建立完整的 foaf 网络并将其作为一个整体进行排序。

您还可以通过不同的方式进行操作: 1. 查找全部friends用户(仅_ids) 2. 查找全部foaf(完整文件) 3. 对于每个foaf找到所有foaf_friends (only _ids) 4. 求交集friends and foaf_friends并计算它们

这个查询会像这样:

LET fids = GRAPH_NEIGHBORS("graph",
                           @user,
                           {
                             "direction":"any",
                             "edgeExamples": {
                               "name": "FRIENDS_WITH"
                              }
                           }
                          )
FOR foaf IN GRAPH_NEIGHBORS("graph",
                            @user,
                            {
                              "minDepth": 2,
                              "maxDepth": 2,
                              "direction": "any",
                              "includeData": true,
                              "edgeExamples": {
                                "name": "FRIENDS_WITH"
                              }
                            }
                           )
  LET commonIds = GRAPH_NEIGHBORS("graph",
                                  foaf._id, {
                                    "direction": "any",
                                    "edgeExamples": {
                                      "name": "FRIENDS_WITH"
                                     }
                                  }
                                 )
  LET common_friend_count = LENGTH(INTERSECTION(fids, commonIds))
  SORT common_friend_count DESC
  RETURN {user: foaf, common_friend_count: common_friend_count}

在我的测试图中,执行时间约为 0.024 秒

所以这给了我一个速度提高 250 倍执行时间,我希望这比 Neo4j 中当前的查询更快,但因为我没有你的dataset我无法验证,如果你能验证并告诉我就好了。

最后一件事

随着edgeExamples: {name : "FRIENDS_WITH" }它与includeData,在这种情况下我们必须找到真正的边缘并研究它。如果您根据边的名称将边存储在单独的集合中,则可以避免这种情况。然后也删除edgeExamples。这将进一步提高性能(特别是在有很多边缘的情况下)。

Future

请继续关注我们的下一个版本,我们现在正在向 AQL 添加更多功能,这将使您的案例更容易查询,并且应该会进一步提升性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最快的 ArangoDB 朋友的朋友查询是多少(带计数) 的相关文章

  • ArangoDB:如何获取2个顶点之间的所有可能路径?

    如何在 maxDepth 2 的情况下获取 2 个顶点 例如 X 和 Y 之间的所有可能路径 我尝试过TRAVERSAL但执行需要大约 10 秒 这是查询 FOR p IN TRAVERSAL locations connections X
  • OrientDB 按边属性查询

    我有两个顶点类 Location 和 User 我还有两条边 Friend 和 GoingTo 用户可以与另一个用户成为 朋友 并且用户还可以 前往 某个位置 边 GoingTo 有一个名为going date 的日期时间属性 其中包含用户
  • Gremlin 简单路径查询,根据遇到的第一条边属性获取路径

    示例图 实际图图像 请参见此处 生成顶点的代码 graph addV organization property name CITI property type ORG property T id 1 property orgName CI
  • Apache AGE-如何实现两个图之间的关系

    如果我们有 2 个图数据库 A 和 B 并且当前节点 A 图数据库和 B 图数据库之间没有关系 现在我必须在 A 节点和 B 节点之间添加关系 那么如何我使用 AGE 来做到这一点 例如 A 可以是员工图数据库 B 可以是任何汽车经销商图数
  • 是否可以使用 C# 来处理 OrientDB?

    是否有任何实现 api或示例OrientDB http www orientechnologies com 和 C 我之所以关注 OrientDB 是因为它是我发现的唯一一个结合了图和文档的数据库 关于我应该如何尝试这个的任何建议 我的下一
  • ArangoDB 的 SPARQL 接口

    对于 Arangodb 我知道它自己的查询语言 AQL 据我所知 还有一个附加组件 允许使用 Gremlin 进行图形遍历等 在我的一个项目中 我们强烈使用 SPARQL 因此 有没有办法使用 SPARQL 作为 Arangodb 的查询语
  • 如何加快从mysql到neo4j的插入速度?

    我在 mysql 中有一个包含 60000 个项目的数据集 我正在尝试将其插入 Neo4j 中 插入正在进行 但需要很长时间 大约每 3 秒 10 15 次 有什么办法可以加快速度吗 还有什么方法可以让我在 Neo4j 中提供诸如唯一键之类
  • 图数据库中时间序列数据的序列聚合

    All 我是图形数据库领域的新手 想知道此类示例是否适用于图形数据库 假设我正在看一场棒球比赛 当每个球员击球时 有 3 种可能的结果 安打 三振或保送 对于每个击球手和整个棒球赛季 我想弄清楚的是序列的计数 例如 对于 N 次上垒的击球手
  • 如何使用OrientDB ETL仅创建边

    我有两个 CSV 文件 首先包含 500M 记录 格式如下 id name10000023432 汤姆用户13943423235 胡说八道 第二个包含 1 5B 好友关系 格式如下 从 ID 到 ID10000023432 13943423
  • 基于图的数据库 (http://neo4j.org/) 有哪些用例? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 OrientDB 递归遍历有向边

    我正在尝试从给定节点递归遍历出站边缘 而不是入站边缘 我想要查询结果中包含出边和出顶点 下图中 从 a 开始 我需要 a b c d e 包括边缘 但不包括 c 之后的部分 即 lt x a gt b gt c lt x gt d gt e
  • 如何在ArangoDB中存储图像?

    我想将图像作为图像文件存储在 ArangoDb 中 我想知道是否有相同的 API 或 Java API 提前感谢您 在 ArangoDB 中存储二进制数据是一项长期存在的功能请求 https github com arangodb aran
  • ArangoDB 和用户定义的函数或存储过程

    ArangoDB 文档 Foxx 部分 说 由于 Foxx 直接在 ArangoDB 内部运行 因此您可以将处理请求所需的所有数据库查询和逻辑捆绑在一个位置 除了使用 Foxx 框架 之外 还有其他 更原生 的方法来实现与 ArangoDB
  • gremlin 语法计算 Jaccard 相似度度量

    我有兴趣计算图中未直接连接的所有顶点对的杰卡德相似度度量 Jaccard度量定义为两个顶点的邻居交集的范数除以相同集合的并集的范数 where 到目前为止 我已经能够获得所有未直接连接的节点对 仅对这种情况下的链接预测感兴趣 如果直接链接已
  • 在 Neo4J Cypher 2.0 中创建多个节点/边时发出一个 MERGE 请求更好,还是将其拆分为事务更好?

    我有一个很长的 Cypher 查询 新的 Neo4J 2 0 版本 它使用 MERGE 命令创建多个节点和连接 问题是 您认为我最好将其分成不同的部分并将其作为交易提交 为了稳健性 还是应该保留长的单个交易 为了速度 这是查询 MATCH
  • Neo4J - 存储到关系与节点中

    我想知道将数据存储到关系或节点中是否有任何优点或缺点 例如 如果我要将与讨论相关的评论存储到数据库中 我应该将评论数据存储在 评论 关系中 还是通过单独的关系存储在与讨论相关的 评论 节点中 正确的数据模型取决于您需要进行的查询类型 您应该
  • 转储数据库并以新名称重新导入

    如果我需要使用 MySQL 将数据库 foo 的内容复制到第二个数据库 bar 中 我通常会这样做 mysqldump u root foo gt foo sql mysql u root e CREATE DATABASE bar mys
  • 将 mongodb 与 neo4j 集成,是否有任何 API 可以链接它们?

    我正在研究推荐引擎 用户数据被收集 他们的友谊 位置 喜欢 教育 并已存储在 mongodb 中 我需要向这些用户推荐相关产品 我计划使用 Neo4j 作为推荐引擎 原因很明显 易于节点之间的遍历 路径信息 问题是我必须首先将 mongod
  • 如何从 Neo4j 服务器插件登录?

    我正在尝试调试我正在编写的 Neo4J 服务器插件中的问题 有可以输出的日志吗 在哪里或如何执行此操作并不明显 好问题 我想你可以使用 Java 日志记录吗 这应该被路由到正常的日志系统中
  • ArangoDB 游标超时

    使用 ArangoDB 2 3 1 看来我的光标将在几分钟内过期 我希望它们能持续一个小时 我已使用 TTL 参数设置 AQL 查询对象 如下所示 query removed actual query count true batchSiz

随机推荐