如何使用 Gremlin/Tinkerpop 在 IBM Graph (TitanDB) 中检索和分页用户提要

How can I retrieve and paginate a users feed in IBM Graph (TitanDB) using Gremlin/Tinkerpop

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

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

  1. 从顶点开始 USER: John.Smith
  2. 获取用户FRIENDS最近的15条post和他自己的
  3. 检查 USER: John.Smith 是否喜欢任何 post 和 return 作为每个 [=53= 的简单 is_liked 布尔值 属性 ].

此查询有几个 pre-requisites:

我很容易让用户成为朋友,他们 LATEST_POSTS:

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

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

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

提前致谢。

您应该检查 http://tinkerpop.apache.org/docs/3.2.3-SNAPSHOT/recipes/#pagination 中的分页方法。这是一种一次检索一个 range/page

的简化方法
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 边,因为每次用户拥有新的 post 时您都需要不断更新此边。最好在 post 中添加时间戳 属性 并且您始终可以根据时间戳对返回的结果进行排序以获得最新的 post.

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

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 已经指出这种方法无法扩展以及如何改进图形模式。