如何在Gremlin中判断根节点下属节点为叶节点或中间节点
如何判断根节点下所有可达节点是否为叶节点(Gremlin实现)
核心逻辑
叶节点定义为无出边的节点(即没有指向其他节点的关系),中间节点则存在至少一条出边。基于这个规则,我们可以通过遍历根节点的所有可达节点,统计每个节点的出边数量来判断类型。
实现查询语句
g.V('TESTNX01') .repeat(out('HAS_SHRHLDING_PC_TO', 'HAS_VOTING_PC_TO')) .emit() .project('root_company', 'Shareholder', 'leaf') .by(constant('TESTNX01')) .by(id()) .by(outE().count().is(eq(0)).choose(identity(), constant('Y'), constant('N')))
代码解释
g.V('TESTNX01'): 定位到根节点TESTNX01repeat(out('HAS_SHRHLDING_PC_TO', 'HAS_VOTING_PC_TO')).emit(): 递归遍历根节点通过HAS_SHRHLDING_PC_TO和HAS_VOTING_PC_TO边可达的所有节点,emit()返回所有遍历到的节点(包含中间节点和叶节点)project(...): 构造目标输出结构by(constant('TESTNX01')): 固定输出根节点ID到root_company字段by(id()): 将当前节点的ID赋值给Shareholder字段by(outE().count().is(eq(0)).choose(identity(), constant('Y'), constant('N'))): 统计当前节点的出边数,若为0则标记为叶节点('Y'),否则标记为中间节点('N')
扩展说明
- 如果图中存在其他需要纳入遍历的边类型,只需在
out()方法中添加对应的边标签即可 - 该查询自动排除根节点本身,仅返回其下属的可达节点,符合示例输出要求
内容的提问来源于stack exchange,提问作者SDS
相关产品推荐
相关产品推荐

