ArangoDb AQL图形查询遍历示例
我在思考如何遍历某个图形以提取某些数据时遇到了一些困难 给定一组“用户”和一组“地点” “喜欢”边缘集合表示用户喜欢某个地方。“likes”边缘集合还有一个“review”属性,用于存储用户对该位置的评论 以及“跟随”边缘集合,表示用户跟随另一用户 我如何遍历图表来获取我喜欢的所有地方,以及我对这些地方的评论和我关注的用户的评论,这些用户也喜欢同一个地方 例如,在上图中。我是用户6327,我查看了两个地方(7968和16213) 我还关注用户6344,用户6344碰巧也查看了Place7968 我怎样才能得到所有我喜欢的地方,以及我跟随的人的评论,他们也评论了我喜欢的同一个地方 预期输出如下所示:ArangoDb AQL图形查询遍历示例,arangodb,aql,Arangodb,Aql,我在思考如何遍历某个图形以提取某些数据时遇到了一些困难 给定一组“用户”和一组“地点” “喜欢”边缘集合表示用户喜欢某个地方。“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
,然后在一个查询中计算出所有相关评论
我采取以下不同的方法,即:
- 确定你写的评论
- 确定你跟随谁
- 确定你跟随的人写的评论
- 将你的评论与你关注的人的评论合并在一起
文档集合包含用户用户
文档集合包含位置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数据库来完成,但它需要您做更多的工作。超出了原始问题的范围,但总是值得一问。