使用AQL进行图形查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用AQL进行图形查询相关的知识,希望对你有一定的参考价值。

我有3个集合,第一个是列表(顶点),第二个是用户(顶点),第三个是活动(边缘)。我计划在活动集合的列表中存储任何类型的活动(例如like,comment,flag等)。假设我需要获取任何用户的所有列表以及他创建的每个列表上的每个事件的计数,例如在单个查询中的每个列表上没有像like,comments,flag。我怎么做?我一直在探索arangodb文档2天,但无法弄清楚如何编写这样的查询。 enter image description here

答案

如果每个单独的活动都表示为两个顶点集合之间的边缘,则查找用户,检索其邻居(列表顶点)并按类型对边缘进行分组(边缘属性?):

FOR u IN users
  FILTER u._key == "john"
  FOR v, e IN 1..1 OUTBOUND u activities
    // v is a list vertex document
    // e is an activity edge document
    COLLECT list = v._id, type = e.type, user = u._id
    WITH COUNT INTO count
    RETURN { list, user, type, count }

我的测试数据的结果:

list        | user       | type    | count
------------|------------|---------|------
lists/john1 | users/john | comment | 1
lists/john1 | users/john | modify  | 3
lists/john1 | users/john | vote    | 1
lists/john2 | users/john | delete  | 1
lists/john2 | users/john | like    | 1
lists/john2 | users/john | modify  | 2
lists/john2 | users/john | vote    | 2

如果要保留列表和用户文档,可以执行以下操作:

FOR u IN users
  FILTER u._key == "john"
  FOR v, e IN 1..1 OUTBOUND u activities
    COLLECT list = v._id, type = e.type
    AGGREGATE count = LENGTH(1) INTO groups
    RETURN {
        list: groups[0].v,
        user: groups[0].u,
        type,
        count
    }

对于大量数据,以下内容可能会使用较少的内存,因为它可以避免跟踪组并查找必要的文档:

FOR u IN users
  FILTER u._key == "john"
  FOR v, e IN 1..1 OUTBOUND u activities
    COLLECT list_id = v._id, user_id = u._id, type = e.type
    WITH COUNT INTO count
    RETURN {
        list: DOCUMENT(list_id),
        user: DOCUMENT(user_id),
        type,
        count
    }

以上是关于使用AQL进行图形查询的主要内容,如果未能解决你的问题,请参考以下文章

查询:AQL:变量“$OLD”被多次赋值

Go——Artifactory的AQL查询以及json解析解决方案

如何在 ArangoDB AQL 查询中获取第一个和最后一个条目

Arangosh 查询在 30 分钟后超时

你如何在 python 中处理 graphql 查询和片段?

Android片段布局完成膨胀