使用AQL进行图形查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用AQL进行图形查询相关的知识,希望对你有一定的参考价值。
我有3个集合,第一个是列表(顶点),第二个是用户(顶点),第三个是活动(边缘)。我计划在活动集合的列表中存储任何类型的活动(例如like,comment,flag等)。假设我需要获取任何用户的所有列表以及他创建的每个列表上的每个事件的计数,例如在单个查询中的每个列表上没有像like,comments,flag。我怎么做?我一直在探索arangodb文档2天,但无法弄清楚如何编写这样的查询。
答案
如果每个单独的活动都表示为两个顶点集合之间的边缘,则查找用户,检索其邻居(列表顶点)并按类型对边缘进行分组(边缘属性?):
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进行图形查询的主要内容,如果未能解决你的问题,请参考以下文章
Go——Artifactory的AQL查询以及json解析解决方案
如何在 ArangoDB AQL 查询中获取第一个和最后一个条目