ArangoDB中的社交网络ish查询

ArangoDB中的社交网络ish查询,arangodb,Arangodb,我的数据库具有以下“架构”: 用户作者帖子 用户喜欢帖子 我的测试数据库包含: 162个用户 442个员额 159喜欢 现在我想查询最受欢迎的用户,这些用户在他们所有的帖子中收集了最喜欢的内容。我提出了以下问题: FOR u IN users LET nblikes = SUM(FOR post IN 1 OUTBOUND u isAuthor RETURN LENGTH(GRAPH_EDGES('my-graph', post, { edgeCollection

我的数据库具有以下“架构”:

  • 用户作者帖子
  • 用户喜欢帖子
我的测试数据库包含:

  • 162个用户
  • 442个员额
  • 159喜欢
现在我想查询最受欢迎的用户,这些用户在他们所有的帖子中收集了最喜欢的内容。我提出了以下问题:

FOR u IN users
    LET nblikes = SUM(FOR post IN 1 OUTBOUND u isAuthor
        RETURN LENGTH(GRAPH_EDGES('my-graph', post, { edgeCollectionRestriction: 'likes' })))
    SORT nblikes DESC
    RETURN {
        "username": u.username,
        "nblikes": nblikes
    }
它在2014年年中的MacBookPro(2.8GHz Core i7,16GB RAM)上以大约0.8秒的速度执行。0.8s并不丢脸,但在这么小的数据集上,我本以为会更好,因为这一切都发生在内存中


因此,如果有一些ArangoDB专家能够回顾我的查询并提示一些潜在的性能问题,我将不胜感激。非常感谢

有几种方法可以加快此查询的运行速度

最大的改进是用另一次深度1遍历来替换对
GRAPH_EDGES
的内部调用,以找到“likers”,如下所示:

FOR u IN users 
  LET nblikes = SUM(
    FOR post IN 1 OUTBOUND u isAuthor 
      RETURN LENGTH(
        /* the following traversal replaces the call to GRAPH_EDGES */
        FOR liker IN 1 INBOUND post._id likes 
          RETURN 1
      )
  )
  SORT nblikes DESC
  RETURN { 
    username: u.username, 
    nblikes: nblikes
  }
GRAPH\u EDGES
的内部函数调用非常昂贵,去掉它将大大提高查询执行时间

另一种变体是(现在)将两个遍历替换为普通连接,如下所示:

FOR u IN users 
  LET nblikes = SUM(
    /* the following join between users, isAuthor and likes 
       replaces the traversal & GRAPH_EDGES calls */
    FOR a IN isAuthor 
      FILTER a._from == u._id 
      FOR l IN likes 
        FILTER l._to == a._to 
        RETURN 1
  ) 
  SORT nblikes DESC
  RETURN { 
    username: u.username, 
    nblikes: nblikes
  }

这两种变体都应该比初始查询更快,主要是因为
GRAPH\u EDGES
在循环中调用代价高昂。由于它是一个无状态AQL函数,因此需要重复设置其上下文(从内部循环调用的频率相同)。遍历和连接解决方案可以在调用之间保留更多的上下文,因此它们“更便宜”。

如果使用建议的图遍历,查询的速度有多快,使用连接的速度有多快?谢谢您可以将
GRAPH\u EDGES
用作顶级构造,而不是在循环中使用。如果您想将其与
限制
结合使用,则它有一个明确的计数器指示器-这没有意义。