我正在尝试创建一个 Gremlin 查询,它将选择政策处于状态的人 -
STARTED
和 CANCELLED
,并检查在给定状态下政策计数是否大于或等于2
。如果这两种状态都不存在,则不会选择此人。每个人在给定状态下可以拥有多个政策。
我创建了以下 Gremlin 查询(不完整):
g.V().hasLabel('Person_ID').as('p')\
.out('has_pol').hasLabel('Policy_ID').as('pol')\
.out('has_car').hasLabel('Reg_ID').select('pol').dedup()\
.local(\
__.aggregate('motor_pol').values('status_code')\
).groupCount().by()
产生以下输出:
==>[IN_PROGRESS:1,CANCELLED:3,STARTED:3]
当我在
.groupCount().by()
函数中移动.local()
时,它仍然选择不正确:
==>[CANCELLED:1]
==>[STARTED:1]
==>[CANCELLED:1]
==>[STARTED:1]
==>[IN_PROGRESS:1]
==>[STARTED:1]
==>[CANCELLED:1]
预期: 我需要以某种方式计算每个人的政策状态,以便我只能选择有两个开始和两个取消政策的人(人 1),像这样:
p1:[started:2, cancelled:2]
p2:[in_progress:1]
p3:[started:1, cancelled:1]
如何正确使用
.local()
功能才能为每个人的保单申请计数?
这里是生成测试数据的查询:
graph = TinkerGraph.open()
g = graph.traversal()
v_person1 = g.addV('Person_ID').property(id, 1).property('name', 'Antonio').property('age', 29).next()
v_person1_pol1 = g.addV('Policy_ID').property(id, 11).property('start_date', 1431666765569).property('cancel_date', '').property('status_code', 'STARTED').next()
g.addE('has_pol').from(v_person1).to(v_person1_pol1).property(id, 111)
v_person1_pol1_reg1 = g.addV('Reg_ID').property(id, 1111).next()
g.addE('has_car').from(v_person1_pol1).to(v_person1_pol1_reg1).property(id, 11111)
v_person1_pol2 = g.addV('Policy_ID').property(id, 12).property('start_date', 1421666765569).property('cancel_date', 1439666765569).property('status_code', 'CANCELLED').next()
g.addE('has_pol').from(v_person1).to(v_person1_pol2).property(id, 112)
v_person1_pol1_reg2 = g.addV('Reg_ID').property(id, 1112).next()
g.addE('has_car').from(v_person1_pol2).to(v_person1_pol1_reg2).property(id, 11112)
v_person1_pol3 = g.addV('Policy_ID').property(id, 13).property('start_date', 1421566765569).property('cancel_date', '').property('status_code', 'IN_PROGRESS').next()
g.addE('has_pol').from(v_person1).to(v_person1_pol3).property(id, 113)
v_person1_pol4 = g.addV('Policy_ID').property(id, 14).property('start_date', 1421566765569).property('cancel_date', '').property('status_code', 'STARTED').next()
g.addE('has_pol').from(v_person1).to(v_person1_pol4).property(id, 114)
v_person1_pol1_reg4 = g.addV('Reg_ID').property(id, 1114).next()
g.addE('has_car').from(v_person1_pol4).to(v_person1_pol1_reg4).property(id, 11114)
v_person1_pol5 = g.addV('Policy_ID').property(id, 15).property('start_date', 1421566765569).property('cancel_date', '1429666765569').property('status_code', 'CANCELLED').next()
g.addE('has_pol').from(v_person1).to(v_person1_pol5).property(id, 115)
v_person1_pol1_reg5 = g.addV('Reg_ID').property(id, 1115).next()
g.addE('has_car').from(v_person1_pol5).to(v_person1_pol1_reg5).property(id, 11115)
v_person2 = g.addV('Person_ID').property(id, 2).property('name', 'Bob').property('age', 35).next()
v_person2_pol1 = g.addV('Policy_ID').property(id, 21).property('start_date', 1431666765569).property('cancel_date', '').property('status_code', 'IN_PROGRESS').next()
g.addE('has_pol').from(v_person2).to(v_person2_pol1).property(id, 221)
v_person2_pol1_reg1 = g.addV('Reg_ID').property(id, 2221).next()
g.addE('has_car').from(v_person2_pol1).to(v_person2_pol1_reg1).property(id, 22221)
v_person3 = g.addV('Person_ID').property(id, 3).property('name', 'Paula').property('age', 22).next()
v_person3_pol1 = g.addV('Policy_ID').property(id, 31).property('start_date', 1431666765569).property('cancel_date', '').property('status_code', 'STARTED').next()
g.addE('has_pol').from(v_person3).to(v_person3_pol1).property(id, 331)
v_person3_pol1_reg1 = g.addV('Reg_ID').property(id, 3331).next()
g.addE('has_car').from(v_person3_pol1).to(v_person3_pol1_reg1).property(id, 33331)
v_person3_pol2 = g.addV('Policy_ID').property(id, 32).property('start_date', 1421666765569).property('cancel_date', 1439666765569).property('status_code', 'CANCELLED').next()
g.addE('has_pol').from(v_person3).to(v_person3_pol2).property(id, 332)
v_person3_pol1_reg2 = g.addV('Reg_ID').property(id, 3332).next()
g.addE('has_car').from(v_person3_pol2).to(v_person3_pol1_reg2).property(id, 33332)
根据我对示例图的理解,你可以这样做。
g.V().
hasLabel('Person_ID').as('p').
out('has_pol').hasLabel('Policy_ID').
group().
by(select('p').id()).
by(groupCount().by('status_code')).unfold()
在 Gremlin 控制台中运行时,会产生:
==> 1={IN_PROGRESS=1, CANCELLED=2, STARTED=2}
==> 2={IN_PROGRESS=1}
==> 3={CANCELLED=1, STARTED=1}