ArangoDb AQL图形查询遍历示例

ArangoDb AQL图形查询遍历示例,arangodb,aql,Arangodb,Aql,我在思考如何遍历某个图形以提取某些数据时遇到了一些困难 给定一组“用户”和一组“地点” “喜欢”边缘集合表示用户喜欢某个地方。“likes”边缘集合还有一个“review”属性,用于存储用户对该位置的评论 以及“跟随”边缘集合,表示用户跟随另一用户 我如何遍历图表来获取我喜欢的所有地方,以及我对这些地方的评论和我关注的用户的评论,这些用户也喜欢同一个地方 例如,在上图中。我是用户6327,我查看了两个地方(7968和16213) 我还关注用户6344,用户6344碰巧也查看了Place7968

我在思考如何遍历某个图形以提取某些数据时遇到了一些困难

给定一组“用户”和一组“地点”

“喜欢”边缘集合表示用户喜欢某个地方。“likes”边缘集合还有一个“review”属性,用于存储用户对该位置的评论

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

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

例如,在上图中。我是用户6327,我查看了两个地方(7968和16213) 我还关注用户6344,用户6344碰巧也查看了Place7968

我怎样才能得到所有我喜欢的地方,以及我跟随的人的评论,他们也评论了我喜欢的同一个地方

预期输出如下所示:

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

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

一种方法是确定您的用户记录的
\u id
,然后找到您关注的朋友的所有
\u id
,然后在一个查询中计算出所有相关评论

我采取以下不同的方法,即:

  • 确定你写的评论
  • 确定你跟随谁
  • 确定你跟随的人写的评论
  • 将你的评论与你关注的人的评论合并在一起
可以以更优化的方式将这些查询合并在一起,但我认为有必要这样分解它们(并显示每个阶段的输出以及最终答案),以帮助您查看哪些数据可用

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

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

此查询假定:

  • 用户
    文档集合包含用户
  • places
    文档集合包含位置
  • 跟随
    边缘收集跟踪跟随其他用户的用户
  • 评论
    边缘收藏跟踪人们撰写的评论
注意:在每个记录上提供
id
时,我使用了
review
id
,因为如果您知道该id,您可以获取边缘文档并获得
用户
位置
id
,以及读取有关
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)
}
路径中的第一个顶点。顶点是起始顶点(
users/6327

路径中的最后一个顶点。顶点
是路径的终点,例如,跟随谁

路径中的第一条边。边
用户
位置

下面是另一个更紧凑的查询版本,它采用了一个参数,即用户的_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

写得很好,解释得很好。非常感谢你的努力。我觉得我必须把问题分解成更小的步骤。我认为我的错误是我试图一次提取数据。我想知道,当试图解决同一个查询时,图形数据库与常规的RDBMS相比,效率会有多高/低?很高兴它有所帮助。何时应该使用图形数据库是一个很好的问题,在具有多对多表的传统RDBMS数据库上测试数据模型是值得的。图形数据库的关键在于,当处理较大的数据集时,它们的性能通常比RDBMS更优雅地衰减。图形数据库提供了查询符号,可以帮助您解决图形问题,并允许您轻松地在边上存储数据。所有这些都可以通过RDBMS数据库来完成,但它需要您做更多的工作。超出了原始问题的范围,但总是值得一问。