匿名遍历与正常遍历gremlin

匿名遍历与正常遍历gremlin,gremlin,tinkerpop,janusgraph,tinkerpop3,amazon-neptune,Gremlin,Tinkerpop,Janusgraph,Tinkerpop3,Amazon Neptune,我已经阅读了有关匿名遍历的文档。我知道它们可以从开始,也可以在步进调制器内部使用。虽然我在概念上不理解它。为什么我们不能在步进调制器中使用从图形遍历源生成的正常遍历?例如,在下面的gremlin代码中创建一条边 this.g .V(fromId) // get vertex of id given for the source .as("fromVertex") // label as fromVertex to

我已经阅读了有关匿名遍历的文档。我知道它们可以从
开始,也可以在步进调制器内部使用。虽然我在概念上不理解它。为什么我们不能在步进调制器中使用从图形遍历源生成的正常遍历?例如,在下面的gremlin代码中创建一条边

        this.g
            .V(fromId) // get vertex of id given for the source
            .as("fromVertex") // label as fromVertex to be accessed later
            .V(toId) // get  vertex of id given for destination
            .coalesce( // evaluates the provided traversals in order and returns the first traversal that emits at least one element
                inE(label) // check incoming edge of label given
                    .where( // conditional check to check if edge exists
                        outV() // get destination vertex of the edge to check
                            .as("fromVertex")), // against staged vertex
                addE(label) // add edge if not present
                    .property(T.id, id) // with given id
                    .from("fromVertex")) // from source vertexx
            .next(); // end traversal to commit to graph
为什么
\uuuu.inE()
\uuuuu.addE()
是匿名的?为什么我们不能写
this.g.inE()
this.g.addE()
?无论哪种方式,编译器都不会抱怨。那么匿名遍历给我们带来了什么特殊好处呢;请注意,在中,禁止用户使用从
GraphTraversalSource
生成的遍历,并且必须使用
\uuu
,因此在最新版本中可以看到强制执行该遍历

从历史上讲

一个
GraphTraversalSource
,即您的
g
,意味着从分配了源配置的开始步骤生成新的遍历。匿名遍历意味着在生成“blank”时,接受它被分配给的父遍历的内部配置。虽然从
g
生成的遍历可能会覆盖其内部配置,但当分配给父级时,它并不是设计的一部分,因此它始终以这种方式工作,因此您可以冒险依赖该行为

另一点是,从Gremlin步骤的完整列表中,实际上只有少数是“开始步骤”(即
addV()
addE()
inject()
V()
e()
),因此在构建子遍历时,您实际上只能使用这些选项。由于您经常需要访问Gremlin步骤的完整列表来启动子遍历参数,因此最好只选择
\uuu
。通过与此约定保持一致,它可以防止混淆为什么子遍历“有时以
g
开始,而其他时间以
\uuu
开始”,如果它们在单个遍历过程中互换使用

可能还有其他技术原因导致需要
\uu
。下面的Gremlin控制台代码片段演示了一个不需要大量解释的简单示例:

gremlin> __.addV('person').steps[0].class
==>class org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep
gremlin> g.addV('person').steps[0].class
==>class org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep
这两次遍历不会产生类似的步骤。如果使用
g
替代
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;请注意,在中,禁止用户使用从
GraphTraversalSource
生成的遍历,并且必须使用
\uuu
,因此在最新版本中可以看到强制执行该遍历

从历史上讲

一个
GraphTraversalSource
,即您的
g
,意味着从分配了源配置的开始步骤生成新的遍历。匿名遍历意味着在生成“blank”时,接受它被分配给的父遍历的内部配置。虽然从
g
生成的遍历可能会覆盖其内部配置,但当分配给父级时,它并不是设计的一部分,因此它始终以这种方式工作,因此您可以冒险依赖该行为

另一点是,从Gremlin步骤的完整列表中,实际上只有少数是“开始步骤”(即
addV()
addE()
inject()
V()
e()
),因此在构建子遍历时,您实际上只能使用这些选项。由于您经常需要访问Gremlin步骤的完整列表来启动子遍历参数,因此最好只选择
\uuu
。通过与此约定保持一致,它可以防止混淆为什么子遍历“有时以
g
开始,而其他时间以
\uuu
开始”,如果它们在单个遍历过程中互换使用

可能还有其他技术原因导致需要
\uu
。下面的Gremlin控制台代码片段演示了一个不需要大量解释的简单示例:

gremlin> __.addV('person').steps[0].class
==>class org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep
gremlin> g.addV('person').steps[0].class
==>class org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep

这两次遍历不会产生类似的步骤。如果使用
g
代替
\uuuu
在今天起作用,这是巧合,而不是设计,这意味着它可能在未来有可能中断。

通过遍历源生成的遍历具有源的配置,而匿名生成的遍历将继承父遍历的配置。我的理解正确吗?如果是这样的话,您能否举例说明
配置的含义?我看到这是两个遍历之间的主要区别。
graphTravelSource
通过其配置步骤获取配置,比如
withStrategies()
withSideEffect()
,等等。啊,我看到了。这是非常清楚的。谢谢之所以使用匿名遍历来解释产卵遍历的原因是因为重复地从源创建遍历是昂贵的?我不确定是否存在性能方面真正考虑。我建议不要过于关注两者区别的一个方面,而是把我写的所有东西作为一个整体来形成你的理解。通过遍历源产生的遍历具有源的配置,而匿名生成的遍历将继承父遍历的配置。我的理解正确吗?如果是这样的话,您能否举例说明
配置的含义?我知道这是两个遍历之间的主要区别。一个
graphTravelSource
通过它的配置步骤来获取配置