Gremlin查询如何获取Edge的outV并按指定顶点ID筛选边
Gremlin按出顶点筛选指定标签边的实现方案
错误写法说明
尝试的几种写法存在逻辑或语法问题,具体如下:
g.E().hasLabel('HasGeneralPhoneLineType').has('outV','42495ed9-7026-4ba4-9b64-4b05fc860bb0'):outV是边关联出顶点的元引用,不是边的自定义属性,无法通过has('outV', 目标值)直接匹配。g.E().hasLabel('HasGeneralPhoneLineType').outV('abc-123'):outV()步骤的入参仅用于指定要遍历的顶点标签,不支持传入顶点ID做过滤,该写法无法达到筛选效果。g.E().hasLabel('HasGeneralPhoneLineType').outV().hasId('abc-123'):该写法最终返回的是匹配ID的顶点集合,而非需要的边集合;同时会先扫描全量对应标签的边再做顶点过滤,遍历效率极低。
正确实现方案
根据性能优先级推荐两种写法:
- 高性能写法(优先使用)
先通过顶点ID直接定位目标顶点(顶点ID默认带索引,查询速度极快),再查询该顶点出方向的指定标签边,最终返回符合要求的边集合:g.V('42495ed9-7026-4ba4-9b64-4b05fc860bb0') .outE('HasGeneralPhoneLineType') - 边遍历筛选写法
如果必须从边集合入口做遍历,可以通过where步骤匹配出顶点ID,最终返回边集合:g.E().hasLabel('HasGeneralPhoneLineType') .where(outV().hasId('42495ed9-7026-4ba4-9b64-4b05fc860bb0'))
补充:如果最终需求是获取匹配边关联的顶点而非边本身,直接在上述两种写法后追加对应的顶点遍历步骤即可,不要先全量扫边再回溯顶点,会产生不必要的性能开销。
内容的提问来源于stack exchange,提问作者Robert Green MBA
相关产品推荐
相关产品推荐

