第25期 Gremlin Steps:
profile()
、explain()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。
上一期:深入学习Gremlin(24):附加操作sideEffect
统计和分析说明
Gremlin提供了两种语句来帮助用户对执行的查询语句进行统计和分析工作:
explain()
,详细描述原始的Gremlin语句在编译期是如何转变为最终要执行的step集合的profile()
,统计Gremlin语句执行过程中的每个step消耗的时间和通过的对象等统计信息
TraversalStrategy
是“遍历策略”,可以在编译期分析遍历(Traversal
)的组成,并在遍历满足TraversalStrategy
的条件时对遍历进行修改。这些修改往往都是为了能够更加高效的执行遍历。
遍历策略有5类:
Decoration
,应用程序级别的策略Optimization
,TinkerPop3级别的策略Provider optimization
,图数据库实现级别的策略Finalization
,遍历执行前的调整和清理策略Verification
,判断遍历是否合法的验证策略
实例说明
实例1 explain()
:
g.V().hasLabel('person').outE().identity().inV().count().is(gt(5)).explain()
结果中:
original
,表示Gremlin语句等价的最初的step列表intermediate
,表示original
转化在TraversalStrategy
作用下的转化过程strategy
,表示作用于上一轮的step列表的TraversalStrategy
category
,表示strategy
中的TraversalStrategy
所属的级别,参见说明部分traversal
,表示上一轮的step列表经过strategy
中的TraversalStrategy
处理之后的新的step列表
final
,表示经过所有TraversalStrategy
处理后的最终要执行的step列表
实例2 profile()
:
g.V().out('created').profile()
返回的结果中,metrics中每一条是一个执行的step,其中:
name
是step的名字,例如"HugeGraphStep(vertex,[])"dur
是step执行的时间,单位是毫秒annotations
中的percentDur
是当前step消耗的时间在总的执行时间中的比例counts
中的traverserCount
是当前step中的traverser的数目counts
中的elementCount
是当前step中的element的数目
traverserCount
和elementCount
的区别在于:traverserCount
是同一step中相同的对象合并之后的数目,对象相同是指当前的对象是一样的,并不代表对象的path等其他数据也相同;相同的对象合并为bulk,可以减少重复工作,提高效率。elementCount
是同一step中所有对象展开bulk之后的数目之和,即未去重的对象数目。因此,traverserCount
总是小于等于elementCount
。
profile()
语句是一个“副作用”(side effect)语句,并非立刻执行。profile()
语句还可以指定一个key,形式为profile(String)
,在执行完要统计的Gremlin语句后,通过key获取统计信息。例如:
t=g.V().out('created').profile('metrics')
t.iterate()
t.getSideEffects().get('metrics')