为什么叶子节点的深度是垃圾值而不是一个?

时间:2017-11-18 00:16:38

标签: gremlin tinkerpop3

在Tinkerpop / Gremlin的recipes部分中,下面的命令用于计算节点的深度。此命令通过计算节点本身来计算节点的深度。但是,当我们在叶子节点上运行此命令时,它返回一个垃圾值而不是1.有人可以澄清这个吗?

命令:

g.V().has('name','F').repeat(__.in()).emit().path().count(local).max()

如果' F'是一个叶子节点然后它返回不正确的值。我认为它应该返回1.

1 个答案:

答案 0 :(得分:2)

使用maximum depth recipe中的相同数据,以下是一些结果:

gremlin> g.V().has('name', 'F').repeat(__.in()).emit().path().count(local).max()
==>5
gremlin> g.V().has('name', 'C').repeat(__.in()).emit().path().count(local).max()
==>3
gremlin> g.V().has('name', 'A').repeat(__.in()).emit().path().count(local).max()
==>-2147483648

我们可以通过删除最后几个步骤来了解有关此行为的更多信息:

gremlin> g.V().has('name', 'C').repeat(__.in()).emit().path()
==>[v[4],v[6]]
==>[v[4],v[2]]
==>[v[4],v[2],v[0]]
gremlin> g.V().has('name', 'A').repeat(__.in()).emit().path()
gremlin>

您可以看到'C'有3条路径,'A'有0条路径。这是因为在发射任何东西之前所有的遍历都被杀死了。如果您在emit()步骤之前移动repeat()步骤,您将获得所需的行为:

gremlin> g.V().has('name', 'A').emit().repeat(__.in()).path()
==>[v[0]]
gremlin> g.V().has('name', 'A').emit().repeat(__.in()).path().count(local).max()
==>1

您可以在TinkerPop documentation中详细了解repeat()步骤及其与emit()步骤的互动情况。具体来说,有一个标注框说明:

  

如果在emit()之后放置repeat(),则会在离开重复遍历的遍历器上对其进行评估。如果在emit()之前放置repeat(),则会在进入重复遍历之前在遍历器上对其进行评估。