2

我有一个在 IBM Graph(Cassandra 支持的 TitanDB)中建模的非常基本的新闻提要,如下所示:

在此处输入图像描述

我正在尝试编写一个执行以下操作的查询:

  1. 从顶点开始USER: John.Smith
  2. 获取用户的 15 条最新帖子FRIENDS以及他自己的帖子。
  3. 检查是否USER: John.Smith喜欢这些帖子中的任何一个,并作为is_liked每个帖子的简单布尔属性返回。

此查询有几个先决条件:

  • 在每个返回的帖子中,USER还应返回帖子的属性。对于这个问题,只avatar需要属性。
  • 我需要能够对这些结果进行分页。即,一旦我检索到前 15 个帖子,我就需要能够返回接下来的 15 个,然后是下一个,依此类推。

我让用户朋友和他们的朋友没有问题LATEST_POSTS

g.V().hasLabel("USER").has("userid", "John.Smith").both("FRIEND").out("LATEST_POST");

我已经阅读了Tinkerpop文档,但我发现自己仍然迷失了如何开始构建此查询以满足我的要求。

此外,在性能、数据建模、模式或索引建议方面对此方法的任何评论都将非常有帮助。即我是否应该期望这种方法能够大规模实时检索提要?

提前致谢。

4

2 回答 2

4

对于给定的图形模式,查询将是这样的:

g.V().has("user", "userid", "John.Smith").as("john").
  union(identity(), both("FRIEND")).as("user").
  out("LATEST_POST").
  flatMap(emit().repeat(out("PREVIOUS_POST")).range(page * pageSize, (page + 1) * pageSize)).as("post").
  choose(__.in("LIKED").where(eq("john")), constant(true), constant(false)).as("likedByJohn")
  select("user", "post", "likedByJohn")

但是 Alaa 已经指出,这种方法无法扩展,以及如何改进图形模式。

于 2016-10-25T12:19:51.020 回答
1

您应该检查http://tinkerpop.apache.org/docs/3.2.3-SNAPSHOT/recipes/#pagination中的分页配方。这是一次检索一个范围/页面的简化方法

gremlin> g.V().hasLabel('person').range(0,2)
==>v[1]
==>v[2]
gremlin> g.V().hasLabel('person').range(2,4)
==>v[4]
==>v[6]

关于您拥有的模型,我会避免使用 LATEST_POST 边缘,因为每次用户有新帖子时您都需要不断更新此边缘。最好在帖子中添加时间戳属性,您可以随时根据时间戳对返回的结果进行排序以获取最新帖子。

于 2016-10-24T18:30:21.797 回答