首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArangoDb AQL图查询遍历示例

ArangoDb AQL图查询遍历示例
EN

Stack Overflow用户
提问于 2017-11-08 10:34:07
回答 1查看 2K关注 0票数 2

我有一些困难,我的头围绕着如何遍历一个特定的图表来提取一些数据。

提供了一组“用户”和一组“地点”。

和一个“喜欢”边缘集合,以表示用户喜欢某个地方。“喜欢”边缘集合还具有一个“审阅”属性来存储用户关于该位置的评论。

和一个“跟随”边缘集合,以表示一个用户跟随另一个用户。

我如何遍历图表,获取所有我喜欢的地方,我对这个地方的审查,以及我所跟踪的用户的评论,也是相同的地方。

例如,在上面的图表中。我是用户6327,我审查了两个地方( 7968和16213),我也跟随用户6344,它也碰巧已经审查了地方7968。

我怎么能得到所有我喜欢的地方,以及我所追随的人的评论,他们也回顾了我喜欢的地方。

预期的输出如下所示:

代码语言:javascript
复制
[
{
name:"my name",
place: "place 1",
id: 1
review,"my review about place 1"
},
{
name:"my name",
place: "place 2",
id: 2
review,"my review about place 2"
},
{
name:"name of the user I follow",
place: "place 2",
id: 2
review,"review about place 2 from the user I follow"
}
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-10 07:18:07

有很多方法来完成这个查询,它也取决于您想要在哪里添加参数,但是为了简单起见,我在下面构建了这个相当冗长的查询,以帮助您理解解决问题的一种方法。

一种方法是确定用户记录的_id,然后查找您所跟踪的朋友的所有_id,然后在一个查询中计算出所有相关的评论。

我在下面采取了另一种做法,即:

  • 确定你写过的评论
  • 确定你跟随谁
  • 确定你跟随的人所写的评论
  • 把你的评论和你跟踪的人的评论合并在一起

可以更优化地将这些查询合并在一起,但我认为有必要像这样将它们分开(并显示每个阶段的输出以及最终答案),以帮助您查看可用的数据。

了解AQL图形查询的一个关键问题是,在执行查询时,如何访问顶点、边和路径。

路径本身就是一个对象,值得研究该对象的内容,以更好地理解如何利用它获取路径信息。

此查询假定:

  • users文档集合包含用户
  • places文档集合包含位置
  • follows边缘集合跟踪用户跟随其他用户
  • reviews边缘收集轨道评论人们写的

注意:当为每个记录提供一个id时,我使用了reviewid,因为如果您知道id,就可以获取边缘文档,获取userplaceid,以及读取有关review的所有数据。

代码语言:javascript
复制
LET my_reviews = (
    FOR vertices, edges, paths IN 1..1 OUTBOUND "users/6327" reviews
    RETURN {
        name: FIRST(paths.vertices).name,
        review_id: FIRST(paths.edges)._id,
        review: FIRST(paths.edges).review,
        place: LAST(paths.vertices).place
    }
)

LET who_i_follow = (
    FOR v IN 1..1 OUTBOUND "users/6327" follows
    RETURN v
)

LET reviews_of_who_i_follow = (
    FOR users IN who_i_follow
        FOR vertices, edges, paths in 1..1 OUTBOUND users._id reviews
        RETURN {
            name: FIRST(paths.vertices).name,
            review_id: FIRST(paths.edges)._id,
            review: FIRST(paths.edges).review,
            place: LAST(paths.vertices).place
        }
)

RETURN {
    my_reviews: my_reviews,
    who_i_follow: who_i_follow,
    reviews_of_who_i_follow: reviews_of_who_i_follow,
    merged_reviews: UNION(my_reviews, reviews_of_who_i_follow)
}

paths.vertices中的第一个顶点是起始顶点(users/6327)。

paths.vertices中的最后一个顶点是路径的末尾,例如您跟随的是谁

paths.edges的第一个优点是userplace构成的评论。

下面是另一个更紧凑的查询版本,它使用param,即用户的_id,即“you”。

代码语言:javascript
复制
LET target_users = APPEND(TO_ARRAY(@user), (
    FOR v IN 1..1 OUTBOUND @user follows RETURN v._id
))

LET selected_reviews = (
    FOR u IN target_users
        FOR vertices, edges, paths in 1..1 OUTBOUND u reviews
        LET user = FIRST(paths.vertices)
        LET place = LAST(paths.vertices)
        LET review = FIRST(paths.edges)
        RETURN {
            name: user.name,
            review_id: review._id,
            review: review.review,
            place: place.place
        }
)

RETURN selected_reviews
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47177393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档