如何使用 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)中建模的非常基本的新闻提要,如下所示:
我正在尝试编写执行以下操作的查询:
- 从顶点开始
USER: John.Smith
- 获取用户
FRIENDS
最近的15条post和他自己的
- 检查
USER: John.Smith
是否喜欢任何 post 和 return 作为每个 [=53= 的简单 is_liked
布尔值 属性 ].
此查询有几个 pre-requisites:
- 在每个 returned post 中,posting
USER
的属性也应该 returned。为了这个问题,只需要 avatar
属性.
- 我需要能够对这些结果进行分页。也就是说,一旦我检索到前 15 个 post,我就需要能够 return 接下来的 15 个,然后是下一个等等
我很容易让用户成为朋友,他们 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 已经指出这种方法无法扩展以及如何改进图形模式。
我有一个在 IBM Graph(Cassandra 支持的 TitanDB)中建模的非常基本的新闻提要,如下所示:
我正在尝试编写执行以下操作的查询:
- 从顶点开始
USER: John.Smith
- 获取用户
FRIENDS
最近的15条post和他自己的 - 检查
USER: John.Smith
是否喜欢任何 post 和 return 作为每个 [=53= 的简单is_liked
布尔值 属性 ].
此查询有几个 pre-requisites:
- 在每个 returned post 中,posting
USER
的属性也应该 returned。为了这个问题,只需要avatar
属性. - 我需要能够对这些结果进行分页。也就是说,一旦我检索到前 15 个 post,我就需要能够 return 接下来的 15 个,然后是下一个等等
我很容易让用户成为朋友,他们 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 已经指出这种方法无法扩展以及如何改进图形模式。