在Tinkerpop / Gremlin的recipes部分中,下面的命令用于计算节点的深度。此命令通过计算节点本身来计算节点的深度。但是,当我们在叶子节点上运行此命令时,它返回一个垃圾值而不是1.有人可以澄清这个吗?
命令:
g.V().has('name','F').repeat(__.in()).emit().path().count(local).max()
如果' F'是一个叶子节点然后它返回不正确的值。我认为它应该返回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()
,则会在进入重复遍历之前在遍历器上对其进行评估。