Neptune 如何使用语句索引处理 Gremlin 查询 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Neptune 如何使用语句索引处理 Gremlin 查询

Amazon Neptune 中的语句可以通过三个声明索引的方式访问,详见Neptune 中的语句如何编制索引. Neptune 提取声明模式来自 Gramlin 查询中某些位置是已知的,而其余位置留下由索引搜索来发现。

Neptune 假定属性图架构不大。这意味着不同边缘标签和属性名称的数量相当少,导致不同谓词的总数很少。Neptune 在单独的索引中跟踪不同的谓词。它使用该谓词缓存来进行 { all P x POGS } 的联合扫描,而不是使用 OSGP 索引。避免使用反向遍历 OSGP 索引可节省存储空间和加载吞吐量。

使用 Neptune Gemlin Explain /Profile API,您可以获取图中的谓词数。然后,您可以确定您的应用程序是否使的 “Neptune” 的 “属性图架构较小” 的假设失效。

以下示例有助于说明 Neptune 如何使用索引来处理 Gemlin 查询。

问题:顶点有哪些标签?v1?

Gremlin code: g.V('v1').label() Pattern: (<v1>, <~label>, ?, ?) Known positions: SP Lookup positions: OG Index: SPOG Key range: <v1>:<~label>:*

问题:顶点的出边有哪些 “已知”v1?

Gremlin code: g.V('v1').out('knows') Pattern: (<v1>, <knows>, ?, ?) Known positions: SP Lookup positions: OG Index: SPOG Key range: <v1>:<knows>:*

问题:哪些顶点有Person顶点标签?

Gremlin code: g.V().hasLabel('Person') Pattern: (?, <~label>, <Person>, <~>) Known positions: POG Lookup positions: S Index: POGS Key range: <~label>:<Person>:<~>:*

问题:给定边缘有哪些源/目标顶点?e1?

Gremlin code: g.E('e1').bothV() Pattern: (?, ?, ?, <e1>) Known positions: G Lookup positions: SPO Index: GPSO Key range: <e1>:*

Neptune 所做的一个声明指数有反向遍历 OSGP 指数。该索引可用于收集所有边缘标签的所有入边,如以下示例所示。

问题:传入的相邻顶点是什么v1?

Gremlin code: g.V('v1').in() Pattern: (?, ?, <v1>, ?) Known positions: O Lookup positions: SPG Index: OSGP // <-- Index does not exist