获取含两条不同边的路径值:Gremlin查询优化需求
Gremlin查询优化:获取地点下种群的派系与物种信息
当前使用的Gremlin查询:
g.V().has('objid','7615388501660').as('location') .in('enhabits').as('population') .out('isInFaction').as('faction') .in('isInFaction').out('isOfSpecies').as('species') .path().by('name')
查询返回结果:
"labels": [ ["location"], ["population"], ["faction"], [], ["species"] ], "objects": [ "Plara", "Se Bemon", "Se", "Se Bemon", "Wan" ]
问题分析
- 结果中出现多余的空标签步骤
[],路径里重复出现种群节点Se Bemon .in('isInFaction')会遍历派系下的所有种群,而非仅当前关联的目标种群,导致查询逻辑偏离需求
优化后的查询方案
方案1:用select指定目标种群顶点
g.V().has('objid','7615388501660').as('location') .in('enhabits').as('population') .out('isInFaction').as('faction') .select('population') // 直接引用之前标记的种群,避免重新遍历派系下的所有节点 .out('isOfSpecies').as('species') .path().by('name')
方案2:用match模式明确关联关系(可读性更强)
g.V().has('objid','7615388501660').as('location') .match( __.as('location').in('enhabits').as('population'), __.as('population').out('isInFaction').as('faction'), __.as('population').out('isOfSpecies').as('species') ) .path().by('name')
优化效果
优化后的查询会返回结构清晰的路径,每个标签对应正确的节点类型,且仅关联当前地点下的种群及其对应的派系、物种:
"labels": [ ["location"], ["population"], ["faction"], ["species"] ], "objects": [ "Plara", "Se Bemon", "Se", "Wan" ]
内容的提问来源于stack exchange,提问作者billmanH
相关产品推荐
相关产品推荐

