最快的 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 朋友的朋友查询是多少(带计数) 的相关文章

  • IllegalStateException:必须将 Gremlin 服务器配置为使用 JanusGraphManager

    Set
  • Neo4j如何避免超级节点

    在我的 Neo4j 项目中我有Role and Permission代表用户角色和权限的实体 每个User系统中的内容与适当的角色和权限集有关系 I think Role and Permission是某种超级节点 从性能的角度来看 它们将
  • Neo4j 嵌入式数据库在应用程序异常终止后挂起

    我打算公开我的第一个基于 Neo4j 嵌入式数据库的应用程序 但遇到了严重的阻塞问题 这是我之前遇到的数据库删除问题有效清理Neo4j数据库 I use OS Windows 8 1 jdk1 8 0 51 neo4j version 2
  • Gremlin 简单路径查询,根据遇到的第一条边属性获取路径

    示例图 实际图图像 请参见此处 生成顶点的代码 graph addV organization property name CITI property type ORG property T id 1 property orgName CI
  • Cosmos DB - 图形 API - 导出 graphSON 并尝试使用迁移工具导入它

    我在新图中插入了一些顶点和边 我已将生成的 grapSON 保存在 json 文件中 然后我尝试使用迁移工具将该 json 文件导入到新图表中 它只起到了部分作用 我有一个带有顶点的新图 但它们没有这样的属性或边 id c39f435b 3
  • ArangoDB 分面搜索性能

    我们正在评估 ArangoDB 在构面计算空间中的性能 还有许多其他产品能够通过特殊的 API 或查询语言执行相同的操作 马克逻辑方面 ElasticSearch 聚合 Solr 分面等 我们知道 Arango 中没有特殊的 API 来显式
  • 如何将 ArangoDB 嵌入桌面应用程序

    我想在我的应用程序中嵌入一个图形数据库 适用于 Windows Linux 和 MAC 我将搜索范围缩小到 ArangoDB 和 OrientDB 我能够让嵌入式 OrientDB 工作 但我仍然想尝试 ArangoDB 来做出明智的决定
  • 我的树形图的 Arangodb 自定义过滤器/访问者

    我有一个带有两个边定义的图 如下所示 isDepartment organisation gt organisation hasAccess user gt organisation 组织嵌套在树中 无循环 有多个顶级组织 没有任何传入is
  • 如何将 AQL 的所有结果合并到具有自定义属性的单个文档中

    我有一个 AQL 查询遍历图 它始终应从一组唯一的集合中返回固定数量的文档 因此每个集合只会发生一次并且仅包含一个文档 我希望将它们全部合并到反映文档集合名称的属性下的单个文档中 查询很简单 FOR v IN ANY vertex key
  • Neo4j 合并和原子事务

    我正在运行下面的MERGE从客户端应用程序在 10 个并行线程中查询我的 Neo4j 服务器 newFoo and id所有 10 次运行的参数均相同 MERGE foo Foo id id ON MATCH SET foo newFoo
  • Neo4j 数据库大小增长

    我使用 neo4j 3 0 1 社区 并且我有几 GB 的数据 这些数据很快就会过时 比如每天 2 3 次 我必须先创建新数据 然后删除旧数据 因此在任何时间点都有一些数据可用 问题是 Neo4j 不使用已删除节点 关系中的空间 我使用 M
  • Neo4J - 存储到关系与节点中

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

    我知道如何在 Gremlin 中通过 id 删除顶点 但现在我需要清理数据库 如何删除多个顶点 删除1v是这样的 ver g v 1 g removeVertex ver 我的意思是类似SQL的东西TRUNCATE 如何在不删除类的情况下删
  • 使用 py2neo 在 neo4j 上查询写入性能

    目前 我正在努力寻找一种高性能的方法 使用 py2neo 运行多个查询 我的问题是 python 中有一大堆需要写入 neo4j 的写入查询 我现在尝试了多种方法来解决这个问题 对我来说最好的工作方法如下 from py2neo impor
  • 将最短路径中的所有节点作为对象列表返回

    我有以下 Cypher 查询 它在 Neo4j 2 0 0 中运行良好 MATCH ab Point Latitude 24 96325 Longitude 67 11343 cd Point Latitude 24 95873 Longi
  • 关系数据库和图数据库的比较

    有人可以向我解释一下 MySQL 等关系数据库与 Neo4j 等图形数据库相比的优缺点吗 在 SQL 中 您有多个表 它们之间有不同的 id 链接 然后你必须加入来连接表 从新手的角度来看 为什么要将数据库设计为需要联接 而不是像图形数据库
  • 如何使用 ArangoJs 将文档存储在 ArangoDb 图中?

    我正在使用 Nodejs 应用程序中的最新版本的 ArangoDb 和 ArangoJs 我有以下两个顶点 users tokens tokens顶点包含向其中一个用户发出的安全令牌users顶点 我有一个名为的边缘定义token belo
  • ArangoDB 游标超时

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

    我尝试从我的电脑连接到位于另一台服务器上的 ArangoDB 但似乎不成功 然后我尝试使用通过输入服务器 IP 提供的 Web UI 来访问它http x x x x 8529 http x x x x 8529但也失败了 我在本地主机 A
  • Neo4j:节点属性等于值 A 和值 B(交集)的求和关系属性

    基本上我的问题是 当存在属性等于值 A 和值 B 的相关节点时 如何对关系属性求和 例如 我有一个简单的数据库 具有以下关系 site HAS MEMBER gt user POSTED gt status TAGGED WITH gt t

随机推荐