【问题标题】:Graph query using AQL使用 AQL 进行图形查询
【发布时间】:2018-06-05 22:14:58
【问题描述】:

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

【问题讨论】:

    标签: graph arangodb aql


    【解决方案1】:

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

    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
        }
    

    【讨论】:

    • 很抱歉这么晚才回复,但是如果有多个相邻顶点,我该如何找到一个特定的顶点。
    • 那会是哪个顶点?
    • 嗨,我认为这个查询会给我 John 制作的所有我想要的列表,但这个查询不会给我 John 制作的列表中其他用户所做的所有活动的计数,比如,标志很重要。如果您可以在图表上表示这种情况,这对我将非常有帮助。
    • 使用上面的查询只会让我得到 John 的所有列表,因为这个子句 1..1 遍历深度将达到 1 级。使用这个查询,将选择用户 John 的所有相邻顶点并且将选择连接用户 John 与相邻顶点的所有边。我不认为通过这个查询我会得到另一个用户在相邻顶点上完成的所有活动的计数。
    • 您能否将图表的可视化表示添加到问题中?我不清楚其他用户的边缘如何指向列表。如果没有看到实际数据,我无法给你任何建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多