gremlin - 查询优化 - 属性 多个间隔范围的值计数
gremlin - query optimization - property value counts for multiple interval ranges
给定一个顶点、一个 属性 和预定义的区间范围 [(0,100), (100,500), (500,1000), (1000, 5000), ...]
,我想为边的 属性 值下降的每个区间计算顶点的边数.
例如,顶点 446656
有 5 条边,每条边都有一个 属性 trxn_amt
,其值如下:[92, 380, 230, 899, 102]
。这将给出组数 {(0,100): 1, (100,500): 3, (500,1000):1, (1000, 5000):0, ...}
.
我的问题分为两部分。
首先,有没有比下面的项目查询更干净的实现?
g.V(446656).project('num_trxn_0_100', 'num_trxn_100_500')
.by(bothE().where(values('trxn_amt').is(between(0.0, 100.0))).count())
.by(bothE().where(values('trxn_amt').is(between(100.0, 500.0))).count())
==>{num_trxn_0_100=1, num_trxn_100_500=3}
^想象更多的区间
其次,如何包含一个没有多次计算的边缘过滤器?
我想添加一个日期过滤器(即 bothE()
-> bothE().has('trxn_dt_int', lt(999999999999))
,并且不想为每个 .by(...)
步骤多次计算此过滤器。是否有一种一次性计算此过滤器、存储它并在以后使用它的方法 - 或者,如果我多次包含它,是否有任何优化发生在引擎盖下以确保它只计算一次?
Firstly, is there a cleaner implementation than the following project query?
我认为您意识到了该方法的问题,这就是您提出问题的原因 - 您遍历 bothE()
多次以获得答案。我认为这与你的第二个问题有关:
Secondly, how can I include an edge filter which isn't computed multiple times?
我认为您可以使用 groupCount()
更好地编写此查询。为了演示我使用了 Grateful Dead 图:
gremlin> g = TinkerFactory.createGratefulDead().traversal()
==>graphtraversalsource[tinkergraph[vertices:808 edges:8049], standard]
gremlin> g.V(3).
......1> bothE('followedBy').
......2> groupCount().
......3> by(choose(values('weight')).
......4> option(between(0, 24), constant('small')).
......5> option(between(25, 99), constant('medium')).
......6> option(gte(100), constant('big')))
==>[small:140,big:2,medium:7]
现在只需为 groupCount()
之前的边缘添加日期过滤器,它只需发生一次。
给定一个顶点、一个 属性 和预定义的区间范围 [(0,100), (100,500), (500,1000), (1000, 5000), ...]
,我想为边的 属性 值下降的每个区间计算顶点的边数.
例如,顶点 446656
有 5 条边,每条边都有一个 属性 trxn_amt
,其值如下:[92, 380, 230, 899, 102]
。这将给出组数 {(0,100): 1, (100,500): 3, (500,1000):1, (1000, 5000):0, ...}
.
我的问题分为两部分。
首先,有没有比下面的项目查询更干净的实现?
g.V(446656).project('num_trxn_0_100', 'num_trxn_100_500')
.by(bothE().where(values('trxn_amt').is(between(0.0, 100.0))).count())
.by(bothE().where(values('trxn_amt').is(between(100.0, 500.0))).count())
==>{num_trxn_0_100=1, num_trxn_100_500=3}
^想象更多的区间
其次,如何包含一个没有多次计算的边缘过滤器?
我想添加一个日期过滤器(即 bothE()
-> bothE().has('trxn_dt_int', lt(999999999999))
,并且不想为每个 .by(...)
步骤多次计算此过滤器。是否有一种一次性计算此过滤器、存储它并在以后使用它的方法 - 或者,如果我多次包含它,是否有任何优化发生在引擎盖下以确保它只计算一次?
Firstly, is there a cleaner implementation than the following project query?
我认为您意识到了该方法的问题,这就是您提出问题的原因 - 您遍历 bothE()
多次以获得答案。我认为这与你的第二个问题有关:
Secondly, how can I include an edge filter which isn't computed multiple times?
我认为您可以使用 groupCount()
更好地编写此查询。为了演示我使用了 Grateful Dead 图:
gremlin> g = TinkerFactory.createGratefulDead().traversal()
==>graphtraversalsource[tinkergraph[vertices:808 edges:8049], standard]
gremlin> g.V(3).
......1> bothE('followedBy').
......2> groupCount().
......3> by(choose(values('weight')).
......4> option(between(0, 24), constant('small')).
......5> option(between(25, 99), constant('medium')).
......6> option(gte(100), constant('big')))
==>[small:140,big:2,medium:7]
现在只需为 groupCount()
之前的边缘添加日期过滤器,它只需发生一次。