AWS Neptune Gremlin:mergeE/mergeV不遵循PartitionStrategy的问题咨询
问题确认与解决方案
问题属实
mergeE和mergeV确实存在不自动应用PartitionStrategy的问题——这两个步骤不会自动给创建的元素(顶点/边)添加分区属性,也不会在查询时遵循分区过滤规则,导致带策略的查询无法找到目标元素,而无策略的全局查询能正常返回结果。
场景复现验证
- mergeE场景
执行带PartitionStrategy的Gremlin语句后:
g.withStrategies(new PartitionStrategy( partitionKey: "d", writePartition: "d", readPartitions: ["d"])) .addV('dog').property(T.id, '1').property('name', 'dave') .addV('dog').property(T.id, '2').property('name', 'jackie') .mergeE([(T.label):'Sibling',created:'2022-02-07',(Direction.from):'1',(Direction.to):'2'])
- 带策略的
g.E()无结果:mergeE未给边添加d=d的分区属性,策略过滤掉了这条无分区标记的边 - 全局
g.E()能查到:无分区过滤规则限制,可返回所有边
- mergeV场景
g.withStrategies(new PartitionStrategy( partitionKey: "f", writePartition: "f", readPartitions: ["f"])) .mergeV([(T.id):'1',(T.label):'Dog',name:'fakedog']).V()
- 带策略的
V()查不到:mergeV创建的顶点没有f=f的分区属性,被策略过滤 - 全局
V()能查到:无分区限制,可返回该无分区属性的顶点
解决办法
手动指定分区属性
在mergeE/mergeV的属性参数里,显式添加与策略匹配的分区键和值,让元素带上分区标记:
mergeE修正示例
g.withStrategies(new PartitionStrategy( partitionKey: "d", writePartition: "d", readPartitions: ["d"])) .addV('dog').property(T.id, '1').property('name', 'dave') .addV('dog').property(T.id, '2').property('name', 'jackie') .mergeE([(T.label):'Sibling',created:'2022-02-07',(Direction.from):'1',(Direction.to):'2', 'd':'d'])
添加'd':'d'属性与策略的writePartition值一致,后续带策略的E()即可正常查询到这条边。
mergeV修正示例
g.withStrategies(new PartitionStrategy( partitionKey: "f", writePartition: "f", readPartitions: ["f"])) .mergeV([(T.id):'1',(T.label):'Dog',name:'fakedog', 'f':'f']).V()
添加'f':'f'属性后,顶点带上分区标记,带策略的V()就能正常返回结果。
自定义策略扩展(可选)
如果不想每次手动添加属性,可自定义扩展PartitionStrategy的逻辑,让mergeE/mergeV自动注入分区属性。这种方式需要修改或扩展Gremlin的策略实现,适合具备开发能力的场景。
内容的提问来源于stack exchange,提问作者kyl
相关产品推荐
相关产品推荐

