Gremlin 查询统计本地范围内的聚合结果

问题描述 投票:0回答:1

我正在尝试创建一个 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)
where-clause aggregate gremlin
1个回答
0
投票

根据我对示例图的理解,你可以这样做。

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}   
© www.soinside.com 2019 - 2024. All rights reserved.