格雷姆林,如何获得帖子以及评论的所有评论和嵌套评论有点像reddit。在C#中

时间:2018-07-20 04:14:54

标签: c# azure azure-cosmosdb graph-databases gremlin

我认为标题说明了一切。我正在构建一个社交网络平台,该平台允许发布事物并能够创建无限的子帖子(评论和评论注释)。我目前可以很好地创建帖子,但是我认为对于GETS,我需要构建某种.repeat或递归循环,以便继续查找subs-post,然后最终将它们映射到c#类(带有sub的嵌套列表) -帖子)。

Dictionary<string, string> communityQueries = new Dictionary<string, string>
{
    {
        "GetPost",    "g.V('" + postId + "').as('mainpost')" +
                           ".repeat(outE().inV().hasLabel('post'))"
    }
};

这是我的第一次尝试,我一直在尝试一些变体,但还没有完全理解。

在此图像中,您可以大致看到它的外观。

enter image description here

相当简单,最终结果需要如下所示:

{
     "Post (content)"
     "AuthorId"
     "Comments" : [
          {
              "Post":
              "AuthorId"
              "Comments"...
           }...
      ]
}

2 个答案:

答案 0 :(得分:2)

图片很不错,但始终最好通过提供一个小的Gremlin脚本来生成有关一些示例数据的问题来询问Gremlin。脚本可以真正帮助框架问题的上下文,并在答案(example)中为您提供经过测试的有效代码。

没有什么我需要猜测的,因为您的图表没有边缘标签或属性名称,但是要获得所需的结构,您可能需要使用project()

g.V(postId).
  project('post','author','comments').
    by('content').
    by(out('author').values('name'))
    by(repeat(out('post')).emit().values('content').fold())

因此,使用project()定义Map的密钥,您将把“ postId”标识的Vertex转换为密钥。这些键中的值由by()调制器指定,这些调制器紧随其后并按键顺序进行映射。因此,要获得“发布”,我们要获得顶点的“内容”属性。为了获得“作者”,我们将您的“作者”边缘遍历到“人”顶点并提取名称。为了获得“评论”,我只是假设您需要每个评论的内容并将其全部提取出来。您可能想使用order()对它们进行更好的排序,或者您想将project()中的每一个都放入其自己的地图,该地图包含与原始帖子相似的数据。无论您做什么,现在都可以使用这种模式来实现这种转换。

答案 1 :(得分:0)

g.V('p1').as('a').union(select('a'), out('author'), out('comments'))

这将包含您需要的所有数据。