Graph 基于AQL的图形查询

Graph 基于AQL的图形查询,graph,arangodb,aql,Graph,Arangodb,Aql,我有3个集合,第一个是列表(顶点),第二个是用户(顶点),第三个是活动(边)。我计划将任何类型的活动存储在活动集合的列表中(例如like、comment、flag等)。 假设我需要获取任何用户的所有列表,以及他创建的每个列表上每个事件的计数,例如,在单个查询中每个列表上的like no of like、comments、flag。我该怎么做? 我研究arangodb文档已经有2天了,但我不知道如何编写这样的查询。 如果每个单独的活动都表示为两个顶点集合之间的边,则查找用户,检索其邻居(列表顶点)

我有3个集合,第一个是列表(顶点),第二个是用户(顶点),第三个是活动(边)。我计划将任何类型的活动存储在活动集合的列表中(例如like、comment、flag等)。 假设我需要获取任何用户的所有列表,以及他创建的每个列表上每个事件的计数,例如,在单个查询中每个列表上的like no of like、comments、flag。我该怎么做? 我研究arangodb文档已经有2天了,但我不知道如何编写这样的查询。

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

结果与我的测试数据一致:

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
    }

很抱歉这么晚才回复,但是如果有多个相邻顶点,我如何找到一个特定的顶点。那是哪个顶点?嗨,我想这个查询会给我John制作的所有列表,这就是我想要的,但是这个查询不会给我John制作的列表上其他用户的所有活动的计数,比如标志计数。如果你能在一个图上表示这个场景,这将对我非常有帮助。使用上面的查询只能得到John as的所有列表,因为第1条。1遍历深度将达到级别1。通过此查询,将选择用户John的所有相邻顶点,并选择连接用户John和相邻顶点的所有边。我不认为通过这个查询,我会得到其他用户在相邻顶点上进行的所有活动的计数。请您在问题中添加图形的可视化表示?我不清楚其他用户的边缘是如何指向列表的。没有看到实际数据,我不能给你任何建议。
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
    }