如何使用Gremlin查询从根顶点获取所有关联顶点的属性
图结构说明
- 根顶点标签:Employee
- 关联边标签分别为 EdCompany、EdDepartment、EdRole,分别对应关联顶点标签 Company、Department、Role
- 核心需求:查询所有Employee顶点及其关联顶点的属性,返回结构简洁的嵌套JSON结果
原有查询问题分析
第一个查询问题
原语句:g.V().hasLabel("Employee").inE().outV().tree()
存在遍历逻辑错误:
inE()取指向Employee的入边后,调用outV()又回到了Employee顶点本身,根本没有获取到关联的Company/Department/Role顶点;同时未指定属性序列化规则,返回的原生tree结构包含大量图元元数据,结构冗余不符合要求。
第二个查询问题
原语句:g.V().hasLabel("Employee").inE().outV().tree().by(valueMap())
除了上述遍历逻辑错误外,还存在序列化兼容问题:GraphSON V1.0 序列化器不支持直接对valueMap返回的MapField结构做tree结构的序列化,因此触发报错。
正确查询方案
方案1:可控嵌套结构(推荐)
该方案通过project自定义返回字段,结构完全可控,无冗余内容,且适配GraphSON V1.0序列化规则,不会触发报错:
g.V().hasLabel("Employee").project('employee_properties', 'related_company', 'related_department', 'related_role') .by(valueMap(true)) .by(out('EdCompany').valueMap(true).fold()) .by(out('EdDepartment').valueMap(true).fold()) .by(out('EdRole').valueMap(true).fold())
说明:
- 若你的业务中关联边是指向Employee的入边,将
out(边标签)替换为in(边标签)即可 valueMap(true)会同时返回顶点的id和label,不需要的话可以去掉参数改为valueMap()fold()的作用是兼容单/多个关联顶点的场景,统一返回数组结构,避免字段类型不一致
方案2:tree()结构适配版
如果你需要保留tree的层级输出结构,可使用以下语句解决序列化问题:
g.V().hasLabel("Employee").outE('EdCompany','EdDepartment','EdRole').inV().tree() .by(__.valueMap(true).unfold().group().by(keys).by(select(values)))
返回结果示例(方案1)
[ { "employee_properties": { "id": 123, "label": "Employee", "name": ["张三"], "employee_id": ["E001"] }, "related_company": [ { "id": 456, "label": "Company", "company_name": ["XX科技有限公司"], "company_id": ["C001"] } ], "related_department": [ { "id": 789, "label": "Department", "dept_name": ["研发部"], "dept_id": ["D001"] } ], "related_role": [ { "id": 101112, "label": "Role", "role_name": ["高级开发工程师"], "role_id": ["R001"] } ] } ]
内容的提问来源于stack exchange,提问作者stfno.me
相关产品推荐
相关产品推荐

