ArangoDb AQL Graph查询遍历示例

ArangoDb AQL Graph queries traversal example

我在思考如何遍历某个图以提取一些数据时遇到了一些麻烦。

给定 "users" 的集合和 "places" 的集合。

和一个 "likes" 边缘集合来表示用户喜欢某个地方。 "likes" 边缘集合还有一个 "review" 属性 来存储用户对该地点的评论。

还有一个 "follows" 边缘集合来表示一个用户关注另一个用户。

如何遍历图表以获取所有我喜欢的地方以及我对这个地方的评论以及我关注的用户的评论也喜欢同一个地方。

例如,在上图中。我是用户 6327,我评论了两个地方(7968 和 16213) 我也关注了用户 6344,他也恰好评论了 7968 这个地方。

如何获得我喜欢的所有地点以及我关注的人对我喜欢的相同地点的评论。

预期输出如下所示:

[
{
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"
}
]

有多种方法可以执行此查询,这也取决于您要在何处添加参数,但为了简单起见,我在下面构建了这个非常冗长的查询,以帮助您理解其中一种方法解决问题。

一种方法是确定你的用户记录的_id,然后找到你关注的朋友的所有_id,然后一次查询就可以计算出所有相关的评论。

我在下面采用了不同的方法,那就是:

  • 确定您写过的评论
  • 确定您关注的人
  • 确定您关注的人写的评论
  • 将您的评论与您关注的人的评论合并在一起

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

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

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

此查询假设:

  • users 文档集合包含用户
  • places 文档集合包含地点
  • follows 边缘收集追踪关注其他用户的用户
  • reviews edge collection tracks 人们写的评论

注意:在为每条记录提供 id 时,我使用了 reviewid,因为如果您知道该 ID,则可以获取边缘文档并获取 id userplace 以及读取有关 review.

的所有数据
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

的评论

这是另一个更紧凑的查询版本,它带有一个参数,即用户的 _id 'you'。

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