我有一些困难,我的头围绕着如何遍历一个特定的图表来提取一些数据。
提供了一组“用户”和一组“地点”。
和一个“喜欢”边缘集合,以表示用户喜欢某个地方。“喜欢”边缘集合还具有一个“审阅”属性来存储用户关于该位置的评论。
和一个“跟随”边缘集合,以表示一个用户跟随另一个用户。
我如何遍历图表,获取所有我喜欢的地方,我对这个地方的审查,以及我所跟踪的用户的评论,也是相同的地方。

例如,在上面的图表中。我是用户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"
}
]发布于 2017-11-10 07:18:07
有很多方法来完成这个查询,它也取决于您想要在哪里添加参数,但是为了简单起见,我在下面构建了这个相当冗长的查询,以帮助您理解解决问题的一种方法。
一种方法是确定用户记录的_id,然后查找您所跟踪的朋友的所有_id,然后在一个查询中计算出所有相关的评论。
我在下面采取了另一种做法,即:
可以更优化地将这些查询合并在一起,但我认为有必要像这样将它们分开(并显示每个阶段的输出以及最终答案),以帮助您查看可用的数据。
了解AQL图形查询的一个关键问题是,在执行查询时,如何访问顶点、边和路径。
路径本身就是一个对象,值得研究该对象的内容,以更好地理解如何利用它获取路径信息。
此查询假定:
users文档集合包含用户places文档集合包含位置follows边缘集合跟踪用户跟随其他用户reviews边缘收集轨道评论人们写的注意:当为每个记录提供一个id时,我使用了review的id,因为如果您知道id,就可以获取边缘文档,获取user和place的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)
}paths.vertices中的第一个顶点是起始顶点(users/6327)。
paths.vertices中的最后一个顶点是路径的末尾,例如您跟随的是谁
paths.edges的第一个优点是user由place构成的评论。
下面是另一个更紧凑的查询版本,它使用param,即用户的_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_reviewshttps://stackoverflow.com/questions/47177393
复制相似问题