ArangoDb AQL Graph查询遍历示例

时间:2017-11-08 10:34:07

标签: arangodb aql

我在围绕如何遍历某个图表以提取一些数据方面遇到了一些麻烦。

给出一组“用户”和一系列“地方”。

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

并且“跟随”边缘集合表示用户跟随另一个用户。

我如何遍历图表以获取我喜欢的所有地点以及我对该地点的评论以及我关注的用户的评论,也就像同一个地方一样。enter image description here

例如,在上图中。我是用户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"
}
]

1 个答案:

答案 0 :(得分:1)

有很多方法可以执行此查询,它还取决于您要添加参数的位置,但为了简单起见,我在下面构建了这个非常详细的查询,以帮助您了解接近问题

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

我采取了以下不同的方法,那就是:

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

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

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

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

此查询假定:

  • users文档集包含用户
  • places文档集包含地点
  • follows边缘收集跟踪跟随其他用户的用户
  • reviews边缘收集跟踪评论人们写的

注意:在每条记录上提供id时,我使用了id的{​​{1}},因为如果您知道该ID,则可以获取边缘文档并获取{{1} reviewid的所有内容以及有关user的所有数据。

place

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.verticespaths.edges

所做的评论

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

user