编写gremlin查询的最佳方法是通过groovy脚本或tinkerpop步骤

时间:2016-09-30 10:49:26

标签: groovy gremlin tinkerpop tinkerpop3

编写gremlin查询的最佳方法是通过groovy脚本或tinkerpop步骤吗?

例如,根据加入日期对标签为Employee的一组顶点进行排序。

哪种检索方式更好?

是吗

g.V().hasLabel('Employee').sort{a,b->a.value('DateOfJoining')<=>b.value('DateOfJoining')}

g.V().hasLabel('Employee').order().by('DateOfJoining',incr)

这里我在groovy脚本中使用了<=>运算符,在第二个运算符中我使用了tinkerpop中的普通顺序步骤。

这两个查询都在gremlin控制台中工作,但哪一个最适合检索,gremlin控制台如何解释这两个查询

1 个答案:

答案 0 :(得分:3)

最好避免groovy collection methods,因为基础图数据库无法解释它们。它们存在于Traversal之外。考虑这个像你的例子:

gremlin> g.V().hasLabel("person").order().by('name',incr).explain()
==>Traversal Explanation
===============================================================================================================================
Original Traversal                 [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]

ConnectiveStrategy           [D]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
RepeatUnrollStrategy         [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
InlineFilterStrategy         [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
MatchPredicateStrategy       [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
PathRetractionStrategy       [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
IncidentToAdjacentStrategy   [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
AdjacentToIncidentStrategy   [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
FilterRankingStrategy        [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
RangeByIsCountStrategy       [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
TinkerGraphStepStrategy      [P]   [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
ProfileStrategy              [F]   [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
StandardVerificationStrategy [V]   [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]

Final Traversal                    [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]

执行explain()操作时,您可以看到Traversal对基础图数据库的看法。如果数据库在这种情况下能够在order()上进行优化,那么它可以利用它并提高效率。如果您只是提交g.V().hasLabel("person")然后切换到groovy集合方法,那么底层数据库只会知道您正在尝试获取“人员”顶点列表而不知道您还打算订购它们(这样就可以了使用groovy sort)在内存中发生。