如何用Gremlin的local函数按Person统计Policy状态并筛选符合条件用户
Gremlin查询实现与测试数据生成
测试数据生成脚本
执行以下Gremlin语句创建测试顶点和边,包含符合条件及不符合条件的Person样本:
// 创建测试Person顶点 g.addV('Person').property('id', 'p1').property('name', 'Person 1') g.addV('Person').property('id', 'p2').property('name', 'Person 2') g.addV('Person').property('id', 'p3').property('name', 'Person 3') g.addV('Person').property('id', 'p4').property('name', 'Person 4') // p1:2个STARTED + 2个CANCELLED(符合条件) g.V('p1').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p1').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p1').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED')) g.V('p1').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED')) // p2:1个STARTED + 3个CANCELLED(不符合) g.V('p2').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p2').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED')) g.V('p2').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED')) g.V('p2').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED')) // p3:3个STARTED + 1个CANCELLED(不符合) g.V('p3').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p3').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p3').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p3').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED')) // p4:2个STARTED + 1个CANCELLED(不符合) g.V('p4').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p4').addE('owns').to(g.addV('Policy').property('status', 'STARTED')) g.V('p4').addE('owns').to(g.addV('Policy').property('status', 'CANCELLED'))
正确的Gremlin查询
使用local函数实现按单个Person本地统计Policy状态,并筛选符合条件的记录:
g.V().hasLabel('Person') .as('person') // 本地统计当前Person的所有Policy状态计数 .local(out('owns').groupCount().by('status')).as('statusCounts') // 过滤同时满足STARTED≥2和CANCELLED≥2的Person .filter(select('statusCounts').select('STARTED').is(gte(2)) .and(select('statusCounts').select('CANCELLED').is(gte(2)))) // 格式化输出结果 .project('personId', 'statusCounts') .by(select('person').values('id')) .by(select('statusCounts'))
关键逻辑说明
local(out('owns').groupCount().by('status')):针对每个Person顶点,仅统计其自身关联的Policy状态,而非全局所有Policy的统计,确保每个Person得到独立的状态计数Map。filter条件严格校验两种状态的数量要求,排除仅满足单一条件的Person。project将结果整理为易读的格式,输出示例如下:
[ { "personId": "p1", "statusCounts": { "STARTED": 2, "CANCELLED": 2 } } ]
内容的提问来源于stack exchange,提问作者Mr. Blond
相关产品推荐
相关产品推荐

