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

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

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

Amazon Neptune 中的语句可以通过三个声明索引的方式访问,详见如何将语句编制 Neptune 中的索引. Neptune 提取声明模式来自 Gemlin 查询(某些位置是已知的),其余的则留给索引搜索进行查找。

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

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

以下示例有助于说明 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