这是我使用的示例数据:
graph = TinkerGraph.open()
g = graph.traversal()
v123=graph.addVertex(id,123,"description","developer","name","bob")
v124=graph.addVertex(id,124,"description","developer","name","bill")
v125=graph.addVertex(id,125,"description","developer","name","brandy")
v126=graph.addVertex(id,126,"description","developer","name","beatrice")
v124.addEdge('follows',v125)
v124.addEdge('follows',v123)
v124.addEdge('likes',v126)
v125.addEdge('follows',v123)
v125.addEdge('likes',v123)
v126.addEdge('follows',v123)
v126.addEdge('follows',v124)
我的第一个想法是:“我们真的需要match step”吗?其次,当然,我想以 TP3 方式编写它,而不是使用 lambda/closure。我在第一次迭代中尝试了各种方法,我得到的最接近的是来自 Daniel Kuppitz 的这样的东西:
gremlin> g.V().as('user').local(out().hasId(123).values('name')
.groupCount()).as('relationships').select()
==>[relationships:[:]]
==>[relationships:[bob:1]]
==>[relationships:[bob:2]]
==>[relationships:[bob:1]]
所以这里我们使用local 步骤将local 内的遍历限制为当前元素。这可行,但我们丢失了select 中的“用户”标签。为什么? groupCount 是 ReducingBarrierStep,在这些步骤之后路径会丢失。
好吧,让我们回到match。我想我可以尝试使用local 进行match 步进遍历:
gremlin> g.V().match('user',__.as('user').has('description','developer'),
gremlin> __.as('user').local(out().hasId(123).values('name').groupCount()).as('relationships')).select()
==>[relationships:[:], user:v[123]]
==>[relationships:[bob:1], user:v[124]]
==>[relationships:[bob:2], user:v[125]]
==>[relationships:[bob:1], user:v[126]]
好的 - 成功 - 这就是我们想要的:没有 lambda 和本地计数。但是,它仍然让我觉得:“我们真的需要匹配步骤吗”?那时,Kuppitz 先生结束了最终答案,该答案大量使用了by 步骤:
gremlin> g.V().has('description','developer').as("user","relationships").select().by()
.by(out().hasId(123).values("name").groupCount())
==>[user:v[123], relationships:[:]]
==>[user:v[124], relationships:[bob:1]]
==>[user:v[125], relationships:[bob:2]]
==>[user:v[126], relationships:[bob:1]]
如您所见,by 可以链接(在某些步骤上)。第一个by 按顶点分组,第二个by 使用“本地”groupCount 处理分组元素。